]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
init (graduate from prototype)
authorEvan You <yyx990803@gmail.com>
Wed, 19 Sep 2018 15:35:38 +0000 (11:35 -0400)
committerEvan You <yyx990803@gmail.com>
Wed, 19 Sep 2018 15:35:38 +0000 (11:35 -0400)
63 files changed:
.gitignore [new file with mode: 0644]
.prettierrc [new file with mode: 0644]
.vscode/settings.json [new file with mode: 0644]
lerna.json [new file with mode: 0644]
package.json [new file with mode: 0644]
packages/core/.npmignore [new file with mode: 0644]
packages/core/README.md [new file with mode: 0644]
packages/core/index.js [new file with mode: 0644]
packages/core/package.json [new file with mode: 0644]
packages/core/src/component.ts [new file with mode: 0644]
packages/core/src/componentComputed.ts [new file with mode: 0644]
packages/core/src/componentOptions.ts [new file with mode: 0644]
packages/core/src/componentProps.ts [new file with mode: 0644]
packages/core/src/componentProxy.ts [new file with mode: 0644]
packages/core/src/componentState.ts [new file with mode: 0644]
packages/core/src/componentUtils.ts [new file with mode: 0644]
packages/core/src/componentWatch.ts [new file with mode: 0644]
packages/core/src/createRenderer.ts [new file with mode: 0644]
packages/core/src/errorHandling.ts [new file with mode: 0644]
packages/core/src/flags.ts [new file with mode: 0644]
packages/core/src/h.ts [new file with mode: 0644]
packages/core/src/index.ts [new file with mode: 0644]
packages/core/src/utils.ts [new file with mode: 0644]
packages/core/src/vdom.ts [new file with mode: 0644]
packages/global.d.ts [new file with mode: 0644]
packages/observer/.npmignore [new file with mode: 0644]
packages/observer/README.md [new file with mode: 0644]
packages/observer/index.js [new file with mode: 0644]
packages/observer/package.json [new file with mode: 0644]
packages/observer/src/autorun.ts [new file with mode: 0644]
packages/observer/src/baseHandlers.ts [new file with mode: 0644]
packages/observer/src/collectionHandlers.ts [new file with mode: 0644]
packages/observer/src/computed.ts [new file with mode: 0644]
packages/observer/src/index.ts [new file with mode: 0644]
packages/observer/src/lock.ts [new file with mode: 0644]
packages/observer/src/operations.ts [new file with mode: 0644]
packages/observer/src/state.ts [new file with mode: 0644]
packages/runtime-dom/.npmignore [new file with mode: 0644]
packages/runtime-dom/README.md [new file with mode: 0644]
packages/runtime-dom/index.js [new file with mode: 0644]
packages/runtime-dom/package.json [new file with mode: 0644]
packages/runtime-dom/src/index.ts [new file with mode: 0644]
packages/runtime-dom/src/modules/attrs.ts [new file with mode: 0644]
packages/runtime-dom/src/modules/class.ts [new file with mode: 0644]
packages/runtime-dom/src/modules/events.ts [new file with mode: 0644]
packages/runtime-dom/src/modules/props.ts [new file with mode: 0644]
packages/runtime-dom/src/modules/style.ts [new file with mode: 0644]
packages/runtime-dom/src/nodeOps.ts [new file with mode: 0644]
packages/runtime-dom/src/patchData.ts [new file with mode: 0644]
packages/runtime-dom/src/teardownVNode.ts [new file with mode: 0644]
packages/scheduler/.npmignore [new file with mode: 0644]
packages/scheduler/README.md [new file with mode: 0644]
packages/scheduler/index.js [new file with mode: 0644]
packages/scheduler/package.json [new file with mode: 0644]
packages/scheduler/src/index.ts [new file with mode: 0644]
rollup.config.js [new file with mode: 0644]
scripts/bootstrap.js [new file with mode: 0644]
scripts/build.js [new file with mode: 0644]
scripts/dev.js [new file with mode: 0644]
scripts/utils.js [new file with mode: 0644]
scripts/verifyCommit.js [new file with mode: 0644]
tsconfig.json [new file with mode: 0644]
yarn.lock [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..20fa3c8
--- /dev/null
@@ -0,0 +1,5 @@
+dist
+.DS_Store
+node_modules
+explorations
+TODOs.md
diff --git a/.prettierrc b/.prettierrc
new file mode 100644 (file)
index 0000000..f5a1bdc
--- /dev/null
@@ -0,0 +1,3 @@
+semi: false
+singleQuote: true
+printWidth: 80
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644 (file)
index 0000000..25fa621
--- /dev/null
@@ -0,0 +1,3 @@
+{
+  "typescript.tsdk": "node_modules/typescript/lib"
+}
diff --git a/lerna.json b/lerna.json
new file mode 100644 (file)
index 0000000..e8701ac
--- /dev/null
@@ -0,0 +1,6 @@
+{
+  "packages": [
+    "packages/*"
+  ],
+  "version": "3.0.0-alpha.1"
+}
diff --git a/package.json b/package.json
new file mode 100644 (file)
index 0000000..9e5ef91
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "private": true,
+  "workspaces": [
+    "packages/*"
+  ],
+  "scripts": {
+    "dev": "node scripts/dev.js",
+    "build": "node scripts/build.js",
+    "lint": "prettier --write --parser typescript 'packages/*/src/**/*.ts'"
+  },
+  "devDependencies": {
+    "chalk": "^2.4.1",
+    "dts-bundle": "^0.7.3",
+    "execa": "^1.0.0",
+    "fs-extra": "^7.0.0",
+    "lerna": "^3.4.0",
+    "minimist": "^1.2.0",
+    "prettier": "^1.14.2",
+    "rollup": "^0.65.0",
+    "rollup-plugin-alias": "^1.4.0",
+    "rollup-plugin-replace": "^2.0.0",
+    "rollup-plugin-terser": "^2.0.2",
+    "rollup-plugin-typescript2": "^0.17.0",
+    "typescript": "^3.0.3"
+  }
+}
diff --git a/packages/core/.npmignore b/packages/core/.npmignore
new file mode 100644 (file)
index 0000000..bb5c8a5
--- /dev/null
@@ -0,0 +1,3 @@
+__tests__/
+__mocks__/
+dist/packages
\ No newline at end of file
diff --git a/packages/core/README.md b/packages/core/README.md
new file mode 100644 (file)
index 0000000..48d5587
--- /dev/null
@@ -0,0 +1,3 @@
+# @vue/core
+
+> This package is published only for typing and building custom renderers. It is NOT meant to be used in applications.
diff --git a/packages/core/index.js b/packages/core/index.js
new file mode 100644 (file)
index 0000000..435663a
--- /dev/null
@@ -0,0 +1,7 @@
+'use strict'
+
+if (process.env.NODE_ENV === 'production') {
+  module.exports = require('./dist/core.cjs.prod.js')
+} else {
+  module.exports = require('./dist/core.cjs.js')
+}
diff --git a/packages/core/package.json b/packages/core/package.json
new file mode 100644 (file)
index 0000000..9d27e66
--- /dev/null
@@ -0,0 +1,24 @@
+{
+  "name": "@vue/core",
+  "version": "3.0.0-alpha.1",
+  "description": "@vue/core",
+  "main": "index.js",
+  "module": "dist/core.esm.js",
+  "typings": "dist/index.d.ts",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/vuejs/vue.git"
+  },
+  "keywords": [
+    "vue"
+  ],
+  "author": "Evan You",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/vuejs/vue/issues"
+  },
+  "homepage": "https://github.com/vuejs/vue/tree/dev/packages/core#readme",
+  "dependencies": {
+    "@vue/observer": "3.0.0-alpha.1"
+  }
+}
diff --git a/packages/core/src/component.ts b/packages/core/src/component.ts
new file mode 100644 (file)
index 0000000..54cb087
--- /dev/null
@@ -0,0 +1,171 @@
+import { EMPTY_OBJ } from './utils'
+import { VNode, Slots, RenderNode, RenderFragment } from './vdom'
+import {
+  Data,
+  RenderFunction,
+  ComponentOptions,
+  ComponentPropsOptions
+} from './componentOptions'
+import { setupWatcher } from './componentWatch'
+import { Autorun, DebuggerEvent, ComputedGetter } from '@vue/observer'
+
+type Flatten<T> = { [K in keyof T]: T[K] }
+
+export interface ComponentClass extends Flatten<typeof Component> {
+  new <D = Data, P = Data>(): MountedComponent<D, P> & D & P
+}
+
+export interface FunctionalComponent<P = Data> extends RenderFunction<P> {
+  pure?: boolean
+  props?: ComponentPropsOptions<P>
+}
+
+// this interface is merged with the class type
+// to represent a mounted component
+export interface MountedComponent<D = Data, P = Data> extends Component {
+  $vnode: VNode
+  $data: D
+  $props: P
+  $computed: Data
+  $slots: Slots
+  $root: MountedComponent
+  $children: MountedComponent[]
+  $options: ComponentOptions<D, P>
+
+  render: RenderFunction<P>
+  data?(): Partial<D>
+  beforeCreate?(): void
+  created?(): void
+  beforeMount?(): void
+  mounted?(): void
+  beforeUpdate?(e: DebuggerEvent): void
+  updated?(): void
+  beforeDestroy?(): void
+  destroyed?(): void
+
+  _updateHandle: Autorun
+  $forceUpdate: () => void
+
+  _self: MountedComponent<D, P> // on proxies only
+}
+
+export class Component {
+  public static options?: ComponentOptions
+
+  public get $el(): RenderNode | RenderFragment | null {
+    return this.$vnode && this.$vnode.el
+  }
+
+  public $vnode: VNode | null = null
+  public $parentVNode: VNode | null = null
+  public $data: Data | null = null
+  public $props: Data | null = null
+  public $computed: Data | null = null
+  public $slots: Slots | null = null
+  public $root: MountedComponent | null = null
+  public $parent: MountedComponent | null = null
+  public $children: MountedComponent[] = []
+  public $options: any
+  public $proxy: any = null
+  public $forceUpdate: (() => void) | null = null
+
+  public _rawData: Data | null = null
+  public _computedGetters: Record<string, ComputedGetter> | null = null
+  public _watchHandles: Set<Autorun> | null = null
+  public _mounted: boolean = false
+  public _destroyed: boolean = false
+  public _events: { [event: string]: Function[] | null } | null = null
+  public _updateHandle: Autorun | null = null
+  public _revokeProxy: () => void
+  public _isVue: boolean = true
+
+  constructor(options?: ComponentOptions) {
+    this.$options = options || (this.constructor as any).options || EMPTY_OBJ
+    // root instance
+    if (options !== void 0) {
+      // mount this
+    }
+  }
+
+  $watch(
+    this: MountedComponent,
+    keyOrFn: string | (() => any),
+    cb: () => void
+  ) {
+    return setupWatcher(this, keyOrFn, cb)
+  }
+
+  // eventEmitter interface
+  $on(event: string, fn: Function): Component {
+    if (Array.isArray(event)) {
+      for (let i = 0; i < event.length; i++) {
+        this.$on(event[i], fn)
+      }
+    } else {
+      const events = this._events || (this._events = Object.create(null))
+      ;(events[event] || (events[event] = [])).push(fn)
+    }
+    return this
+  }
+
+  $once(event: string, fn: Function): Component {
+    const onceFn = (...args: any[]) => {
+      this.$off(event, onceFn)
+      fn.apply(this, args)
+    }
+    ;(onceFn as any).fn = fn
+    return this.$on(event, onceFn)
+  }
+
+  $off(event?: string, fn?: Function) {
+    if (this._events) {
+      if (!event && !fn) {
+        this._events = null
+      } else if (Array.isArray(event)) {
+        for (let i = 0; i < event.length; i++) {
+          this.$off(event[i], fn)
+        }
+      } else if (!fn) {
+        this._events[event as string] = null
+      } else {
+        const fns = this._events[event as string]
+        if (fns) {
+          for (let i = 0; i < fns.length; i++) {
+            const f = fns[i]
+            if (fn === f || fn === (f as any).fn) {
+              fns.splice(i, 1)
+              break
+            }
+          }
+        }
+      }
+    }
+    return this
+  }
+
+  $emit(this: MountedComponent, name: string, ...payload: any[]) {
+    const parentListener =
+      this.$props['on' + name] || this.$props['on' + name.toLowerCase()]
+    if (parentListener) {
+      invokeListeners(parentListener, payload)
+    }
+    if (this._events) {
+      const handlers = this._events[name]
+      if (handlers) {
+        invokeListeners(handlers, payload)
+      }
+    }
+    return this
+  }
+}
+
+function invokeListeners(value: Function | Function[], payload: any[]) {
+  // TODO handle error
+  if (Array.isArray(value)) {
+    for (let i = 0; i < value.length; i++) {
+      value[i](...payload)
+    }
+  } else {
+    value(...payload)
+  }
+}
diff --git a/packages/core/src/componentComputed.ts b/packages/core/src/componentComputed.ts
new file mode 100644 (file)
index 0000000..ab88958
--- /dev/null
@@ -0,0 +1,65 @@
+import { EMPTY_OBJ } from './utils'
+import { computed, ComputedGetter } from '@vue/observer'
+import { Component, ComponentClass } from './component'
+import { ComponentComputedOptions } from './componentOptions'
+
+const extractionCache: WeakMap<
+  ComponentClass,
+  ComponentComputedOptions
+> = new WeakMap()
+
+export function getComputedOptions(
+  comp: ComponentClass
+): ComponentComputedOptions {
+  let computedOptions = extractionCache.get(comp)
+  if (computedOptions) {
+    return computedOptions
+  }
+  computedOptions = {}
+  const descriptors = Object.getOwnPropertyDescriptors(comp.prototype as any)
+  for (const key in descriptors) {
+    const d = descriptors[key]
+    if (d.get) {
+      computedOptions[key] = d.get
+      // there's no need to do anything for the setter
+      // as it's already defined on the prototype
+    }
+  }
+  return computedOptions
+}
+
+export function initializeComputed(
+  instance: Component,
+  computedOptions: ComponentComputedOptions | undefined
+) {
+  if (!computedOptions) {
+    instance.$computed = EMPTY_OBJ
+    return
+  }
+  const handles: Record<
+    string,
+    ComputedGetter
+  > = (instance._computedGetters = {})
+  const proxy = instance.$proxy
+  for (const key in computedOptions) {
+    handles[key] = computed(computedOptions[key], proxy)
+  }
+  instance.$computed = new Proxy(
+    {},
+    {
+      get(_, key: any) {
+        return handles[key]()
+      }
+      // TODO should be readonly
+    }
+  )
+}
+
+export function teardownComputed(instance: Component) {
+  const handles = instance._computedGetters
+  if (handles !== null) {
+    for (const key in handles) {
+      handles[key].stop()
+    }
+  }
+}
diff --git a/packages/core/src/componentOptions.ts b/packages/core/src/componentOptions.ts
new file mode 100644 (file)
index 0000000..2bcbf1a
--- /dev/null
@@ -0,0 +1,51 @@
+import { Slots } from './vdom'
+import { MountedComponent } from './component'
+
+export type Data = Record<string, any>
+
+export interface RenderFunction<P = Data> {
+  (props: P, slots: Slots): any
+}
+
+export interface ComponentOptions<D = Data, P = Data> {
+  data?: () => Partial<D>
+  props?: ComponentPropsOptions<P>
+  computed?: ComponentComputedOptions<D, P>
+  watch?: ComponentWatchOptions<D, P>
+  render?: RenderFunction<P>
+  // TODO other options
+  readonly [key: string]: any
+}
+
+export type ComponentPropsOptions<P = Data> = {
+  [K in keyof P]: PropValidator<P[K]>
+}
+
+export type NormalizedPropsOptions<P = Data> = {
+  [K in keyof P]: PropOptions<P[K]>
+}
+
+export type Prop<T> = { (): T } | { new (...args: any[]): T & object }
+
+export type PropType<T> = Prop<T> | Prop<T>[]
+
+export type PropValidator<T> = PropOptions<T> | PropType<T>
+
+export interface PropOptions<T = any> {
+  type?: PropType<T>
+  required?: boolean
+  default?: T | null | undefined | (() => T | null | undefined)
+  validator?(value: T): boolean
+}
+
+export interface ComponentComputedOptions<D = Data, P = Data> {
+  [key: string]: (this: MountedComponent<D, P> & D & P, c: any) => any
+}
+
+export interface ComponentWatchOptions<D = Data, P = Data> {
+  [key: string]: (
+    this: MountedComponent<D, P> & D & P,
+    oldValue: any,
+    newValue: any
+  ) => void
+}
diff --git a/packages/core/src/componentProps.ts b/packages/core/src/componentProps.ts
new file mode 100644 (file)
index 0000000..bfcec05
--- /dev/null
@@ -0,0 +1,103 @@
+import { EMPTY_OBJ, isReservedProp } from './utils'
+import { Component, ComponentClass, MountedComponent } from './component'
+import { immutable, unwrap, lock, unlock } from '@vue/observer'
+import {
+  Data,
+  ComponentPropsOptions,
+  NormalizedPropsOptions,
+  PropValidator,
+  PropOptions
+} from './componentOptions'
+
+export function initializeProps(instance: Component, props: Data | null) {
+  instance.$props = immutable(props || {})
+}
+
+export function updateProps(instance: MountedComponent, nextProps: Data) {
+  // instance.$props is an observable that should not be replaced.
+  // instead, we mutate it to match latest props, which will trigger updates
+  // if any value has changed.
+  if (nextProps != null) {
+    const props = instance.$props
+    const rawProps = unwrap(props)
+    // unlock to temporarily allow mutatiing props
+    unlock()
+    for (const key in rawProps) {
+      if (!nextProps.hasOwnProperty(key)) {
+        delete props[key]
+      }
+    }
+    for (const key in nextProps) {
+      props[key] = nextProps[key]
+    }
+    lock()
+  }
+}
+
+// This is called for every component vnode created. This also means the data
+// on every component vnode is guarunteed to be a fresh object.
+export function normalizeComponentProps(
+  raw: any,
+  options: ComponentPropsOptions,
+  Component: ComponentClass
+): Data {
+  if (!raw) {
+    return EMPTY_OBJ
+  }
+  const res: Data = {}
+  const normalizedOptions = options && normalizePropsOptions(options)
+  for (const key in raw) {
+    if (isReservedProp(key)) {
+      continue
+    }
+    if (__DEV__ && normalizedOptions != null) {
+      validateProp(key, raw[key], normalizedOptions[key], Component)
+    } else {
+      res[key] = raw[key]
+    }
+  }
+  // set default values
+  if (normalizedOptions != null) {
+    for (const key in normalizedOptions) {
+      if (res[key] === void 0) {
+        const opt = normalizedOptions[key]
+        if (opt != null && opt.hasOwnProperty('default')) {
+          const defaultValue = opt.default
+          res[key] =
+            typeof defaultValue === 'function' ? defaultValue() : defaultValue
+        }
+      }
+    }
+  }
+  return res
+}
+
+const normalizeCache: WeakMap<
+  ComponentPropsOptions,
+  NormalizedPropsOptions
+> = new WeakMap()
+function normalizePropsOptions(
+  raw: ComponentPropsOptions
+): NormalizedPropsOptions {
+  let cached = normalizeCache.get(raw)
+  if (cached) {
+    return cached
+  }
+  const normalized: NormalizedPropsOptions = {}
+  for (const key in raw) {
+    const opt = raw[key]
+    normalized[key] =
+      typeof opt === 'function' ? { type: opt } : (opt as PropOptions)
+  }
+  normalizeCache.set(raw, normalized)
+  return normalized
+}
+
+function validateProp(
+  key: string,
+  value: any,
+  validator: PropValidator<any>,
+  Component: ComponentClass
+) {
+  // TODO
+}
diff --git a/packages/core/src/componentProxy.ts b/packages/core/src/componentProxy.ts
new file mode 100644 (file)
index 0000000..7b76439
--- /dev/null
@@ -0,0 +1,82 @@
+import { Component, MountedComponent } from './component'
+
+const bindCache = new WeakMap()
+
+function getBoundMethod(fn: Function, target: any, receiver: any): Function {
+  let boundMethodsForTarget = bindCache.get(target)
+  if (boundMethodsForTarget === void 0) {
+    bindCache.set(target, (boundMethodsForTarget = new Map()))
+  }
+  let boundFn = boundMethodsForTarget.get(fn)
+  if (boundFn === void 0) {
+    boundMethodsForTarget.set(fn, (boundFn = fn.bind(receiver)))
+  }
+  return boundFn
+}
+
+const renderProxyHandlers = {
+  get(target: MountedComponent, key: string, receiver: any) {
+    if (key === '_self') {
+      return target
+    } else if (
+      target._rawData !== null &&
+      target._rawData.hasOwnProperty(key)
+    ) {
+      // data
+      return target.$data[key]
+    } else if (
+      target.$options.props != null &&
+      target.$options.props.hasOwnProperty(key)
+    ) {
+      // props are only proxied if declared
+      return target.$props[key]
+    } else if (
+      target._computedGetters !== null &&
+      target._computedGetters.hasOwnProperty(key)
+    ) {
+      // computed
+      return target._computedGetters[key]()
+    } else {
+      if (__DEV__ && !(key in target)) {
+        // TODO warn non-present property
+      }
+      const value = Reflect.get(target, key, receiver)
+      if (typeof value === 'function') {
+        // auto bind
+        return getBoundMethod(value, target, receiver)
+      } else {
+        return value
+      }
+    }
+  },
+  set(
+    target: MountedComponent,
+    key: string,
+    value: any,
+    receiver: any
+  ): boolean {
+    if (__DEV__) {
+      if (typeof key === 'string' && key[0] === '$') {
+        // TODO warn setting immutable properties
+        return false
+      }
+      if (
+        target.$options.props != null &&
+        target.$options.props.hasOwnProperty(key)
+      ) {
+        // TODO warn props are immutable
+        return false
+      }
+    }
+    if (target._rawData !== null && target._rawData.hasOwnProperty(key)) {
+      target.$data[key] = value
+      return true
+    } else {
+      return Reflect.set(target, key, value, receiver)
+    }
+  }
+}
+
+export function createRenderProxy(instance: Component): MountedComponent {
+  return new Proxy(instance, renderProxyHandlers) as MountedComponent
+}
diff --git a/packages/core/src/componentState.ts b/packages/core/src/componentState.ts
new file mode 100644 (file)
index 0000000..1adcd1d
--- /dev/null
@@ -0,0 +1,12 @@
+import { EMPTY_OBJ } from './utils'
+import { MountedComponent } from './component'
+import { observable } from '@vue/observer'
+
+export function initializeState(instance: MountedComponent) {
+  if (instance.data) {
+    instance._rawData = instance.data()
+    instance.$data = observable(instance._rawData)
+  } else {
+    instance.$data = EMPTY_OBJ
+  }
+}
diff --git a/packages/core/src/componentUtils.ts b/packages/core/src/componentUtils.ts
new file mode 100644 (file)
index 0000000..fe0e43a
--- /dev/null
@@ -0,0 +1,180 @@
+import { VNodeFlags } from './flags'
+import { EMPTY_OBJ } from './utils'
+import { VNode, createFragment } from './vdom'
+import { Component, MountedComponent, ComponentClass } from './component'
+import { createTextVNode, cloneVNode } from './vdom'
+import { initializeState } from './componentState'
+import { initializeProps } from './componentProps'
+import {
+  initializeComputed,
+  getComputedOptions,
+  teardownComputed
+} from './componentComputed'
+import { initializeWatch, teardownWatch } from './componentWatch'
+import { Data, ComponentOptions } from './componentOptions'
+import { createRenderProxy } from './componentProxy'
+
+export function createComponentInstance(
+  vnode: VNode,
+  Component: ComponentClass,
+  parentComponent: MountedComponent | null
+): MountedComponent {
+  const instance = (vnode.children = new Component()) as MountedComponent
+  instance.$parentVNode = vnode
+
+  // renderProxy
+  const proxy = (instance.$proxy = createRenderProxy(instance))
+
+  // pointer management
+  if (parentComponent) {
+    instance.$parent = parentComponent.$proxy
+    instance.$root = parentComponent.$root
+    parentComponent.$children.push(proxy)
+  } else {
+    instance.$root = proxy
+  }
+
+  // lifecycle
+  if (instance.beforeCreate) {
+    instance.beforeCreate.call(proxy)
+  }
+  // TODO provide/inject
+  initializeProps(instance, vnode.data)
+  initializeState(instance)
+  initializeComputed(instance, getComputedOptions(Component))
+  initializeWatch(instance, instance.$options.watch)
+  instance.$slots = vnode.slots || EMPTY_OBJ
+  if (instance.created) {
+    instance.created.call(proxy)
+  }
+
+  return instance as MountedComponent
+}
+
+export function renderInstanceRoot(instance: MountedComponent) {
+  // TODO handle render error
+  return normalizeComponentRoot(
+    instance.render.call(instance.$proxy, instance.$props, instance.$slots),
+    instance.$parentVNode
+  )
+}
+
+export function teardownComponentInstance(instance: MountedComponent) {
+  const parentComponent = instance.$parent && instance.$parent._self
+  if (parentComponent && !parentComponent._destroyed) {
+    parentComponent.$children.splice(
+      parentComponent.$children.indexOf(instance.$proxy),
+      1
+    )
+  }
+  teardownComputed(instance)
+  teardownWatch(instance)
+}
+
+export function normalizeComponentRoot(
+  vnode: any,
+  componentVNode: VNode | null
+): VNode {
+  if (vnode == null) {
+    vnode = createTextVNode('')
+  } else if (typeof vnode !== 'object') {
+    vnode = createTextVNode(vnode + '')
+  } else if (Array.isArray(vnode)) {
+    vnode = createFragment(vnode)
+  } else {
+    const { flags } = vnode
+    // parentVNode data merge down
+    if (
+      componentVNode &&
+      (flags & VNodeFlags.COMPONENT || flags & VNodeFlags.ELEMENT)
+    ) {
+      const parentData = componentVNode.data || EMPTY_OBJ
+      const childData = vnode.data || EMPTY_OBJ
+      let extraData: any = null
+      for (const key in parentData) {
+        // class/style bindings on parentVNode are merged down to child
+        // component root.
+        if (key === 'class') {
+          ;(extraData || (extraData = {})).class = childData.class
+            ? [].concat(childData.class, parentData.class)
+            : parentData.class
+        } else if (key === 'style') {
+          ;(extraData || (extraData = {})).style = childData.style
+            ? [].concat(childData.style, parentData.style)
+            : parentData.style
+        } else if (key.startsWith('nativeOn')) {
+          // nativeOn* handlers are merged down to child root as native listeners
+          const event = 'on' + key.slice(8)
+          ;(extraData || (extraData = {}))[event] = childData.event
+            ? [].concat(childData.event, parentData[key])
+            : parentData[key]
+        }
+      }
+      if (extraData) {
+        vnode = cloneVNode(vnode, extraData)
+      }
+      if (vnode.el) {
+        vnode = cloneVNode(vnode)
+      }
+      if (flags & VNodeFlags.COMPONENT) {
+        vnode.parentVNode = componentVNode
+      }
+    } else if (vnode.el) {
+      vnode = cloneVNode(vnode)
+    }
+  }
+  return vnode
+}
+
+export function shouldUpdateFunctionalComponent(
+  prevProps: Data | null,
+  nextProps: Data | null
+): boolean {
+  if (prevProps === nextProps) {
+    return false
+  }
+  if (prevProps === null) {
+    return nextProps !== null
+  }
+  if (nextProps === null) {
+    return prevProps !== null
+  }
+  let shouldUpdate = true
+  const nextKeys = Object.keys(nextProps)
+  if (nextKeys.length === Object.keys(prevProps).length) {
+    shouldUpdate = false
+    for (let i = 0; i < nextKeys.length; i++) {
+      const key = nextKeys[i]
+      if (nextProps[key] !== prevProps[key]) {
+        shouldUpdate = true
+      }
+    }
+  }
+  return shouldUpdate
+}
+
+export function createComponentClassFromOptions(
+  options: ComponentOptions
+): ComponentClass {
+  class ObjectComponent extends Component {
+    constructor() {
+      super()
+      this.$options = options
+    }
+  }
+  for (const key in options) {
+    const value = options[key]
+    if (typeof value === 'function') {
+      ;(ObjectComponent.prototype as any)[key] = value
+    }
+    if (key === 'computed') {
+      const isGet = typeof value === 'function'
+      Object.defineProperty(ObjectComponent.prototype, key, {
+        configurable: true,
+        get: isGet ? value : value.get,
+        set: isGet ? undefined : value.set
+      })
+    }
+  }
+  return ObjectComponent as ComponentClass
+}
diff --git a/packages/core/src/componentWatch.ts b/packages/core/src/componentWatch.ts
new file mode 100644 (file)
index 0000000..a838702
--- /dev/null
@@ -0,0 +1,50 @@
+import { MountedComponent } from './component'
+import { ComponentWatchOptions } from './componentOptions'
+import { autorun, stop, Autorun } from '@vue/observer'
+
+export function initializeWatch(
+  instance: MountedComponent,
+  options: ComponentWatchOptions | undefined
+) {
+  if (options !== void 0) {
+    for (const key in options) {
+      setupWatcher(instance, key, options[key])
+    }
+  }
+}
+
+// TODO deep watch
+export function setupWatcher(
+  instance: MountedComponent,
+  keyOrFn: string | Function,
+  cb: Function
+): () => void {
+  const handles = instance._watchHandles || (instance._watchHandles = new Set())
+  const proxy = instance.$proxy
+  const rawGetter =
+    typeof keyOrFn === 'string'
+      ? () => proxy[keyOrFn]
+      : () => keyOrFn.call(proxy)
+  let oldValue: any
+  const runner = autorun(rawGetter, {
+    scheduler: (runner: Autorun) => {
+      const newValue = runner()
+      if (newValue !== oldValue) {
+        cb(newValue, oldValue)
+        oldValue = newValue
+      }
+    }
+  })
+  oldValue = runner()
+  handles.add(runner)
+  return () => {
+    stop(runner)
+    handles.delete(runner)
+  }
+}
+
+export function teardownWatch(instance: MountedComponent) {
+  if (instance._watchHandles !== null) {
+    instance._watchHandles.forEach(stop)
+  }
+}
diff --git a/packages/core/src/createRenderer.ts b/packages/core/src/createRenderer.ts
new file mode 100644 (file)
index 0000000..5bf816b
--- /dev/null
@@ -0,0 +1,1309 @@
+import { autorun, stop } from '@vue/observer'
+import { VNodeFlags, ChildrenFlags } from './flags'
+import { EMPTY_OBJ, isReservedProp } from './utils'
+import {
+  VNode,
+  MountedVNode,
+  MountedVNodes,
+  RenderNode,
+  createTextVNode,
+  cloneVNode,
+  Ref,
+  VNodeChildren,
+  RenderFragment
+} from './vdom'
+import {
+  MountedComponent,
+  FunctionalComponent,
+  ComponentClass
+} from './component'
+import { updateProps } from './componentProps'
+import {
+  renderInstanceRoot,
+  createComponentInstance,
+  teardownComponentInstance,
+  normalizeComponentRoot,
+  shouldUpdateFunctionalComponent
+} from './componentUtils'
+
+interface RendererOptions {
+  queueJob: (fn: () => void, postFlushJob?: () => void) => void
+  nodeOps: {
+    createElement: (tag: string, isSVG?: boolean) => any
+    createText: (text: string) => any
+    setText: (node: any, text: string) => void
+    appendChild: (parent: any, child: any) => void
+    insertBefore: (parent: any, child: any, ref: any) => void
+    replaceChild: (parent: any, oldChild: any, newChild: any) => void
+    removeChild: (parent: any, child: any) => void
+    clearContent: (node: any) => void
+    parentNode: (node: any) => any
+    nextSibling: (node: any) => any
+    querySelector: (selector: string) => any
+  }
+  patchData: (
+    el: any,
+    key: string,
+    prevValue: any,
+    nextValue: any,
+    preVNode: VNode | null,
+    nextVNode: VNode,
+    isSVG: boolean,
+    // passed for DOM operations that removes child content
+    // e.g. innerHTML & textContent
+    unmountChildren: (children: VNode[], childFlags: ChildrenFlags) => void
+  ) => void
+  teardownVNode?: (vnode: VNode) => void
+}
+
+// The whole mounting / patching / unmouting logic is placed inside this
+// single function so that we can create multiple renderes with different
+// platform definitions. This allows for use cases like creating a test
+// renderer alongside an actual renderer.
+export function createRenderer(options: RendererOptions) {
+  const {
+    queueJob,
+    nodeOps: {
+      createElement: platformCreateElement,
+      createText: platformCreateText,
+      setText: platformSetText,
+      appendChild: platformAppendChild,
+      insertBefore: platformInsertBefore,
+      replaceChild: platformReplaceChild,
+      removeChild: platformRemoveChild,
+      clearContent: platformClearContent,
+      parentNode: platformParentNode,
+      nextSibling: platformNextSibling,
+      querySelector: platformQuerySelector
+    },
+    patchData: platformPatchData,
+    teardownVNode
+  } = options
+
+  // Node operations (shimmed to handle virtual fragments) ---------------------
+
+  function appendChild(container: RenderNode, el: RenderNode | RenderFragment) {
+    if (el.$f) {
+      for (let i = 0; i < el.children.length; i++) {
+        appendChild(container, el.children[i])
+      }
+    } else {
+      platformAppendChild(container, el)
+    }
+  }
+
+  function insertBefore(
+    container: RenderNode,
+    el: RenderNode | RenderFragment,
+    ref: RenderNode | RenderFragment
+  ) {
+    while (ref.$f) {
+      ref = ref.children[0]
+    }
+    if (el.$f) {
+      for (let i = 0; i < el.children.length; i++) {
+        insertBefore(container, el.children[i], ref)
+      }
+    } else {
+      platformInsertBefore(container, el, ref)
+    }
+  }
+
+  function removeChild(container: RenderNode, el: RenderNode | RenderFragment) {
+    if (el.$f) {
+      for (let i = 0; i < el.children.length; i++) {
+        removeChild(container, el.children[i])
+      }
+    } else {
+      platformRemoveChild(container, el)
+    }
+  }
+
+  function replaceChild(
+    container: RenderNode,
+    oldChild: RenderNode | RenderFragment,
+    newChild: RenderNode | RenderFragment
+  ) {
+    if (oldChild.$f || newChild.$f) {
+      insertOrAppend(container, newChild, oldChild)
+      removeChild(container, oldChild)
+    } else {
+      platformReplaceChild(container, oldChild, newChild)
+    }
+  }
+
+  function parentNode(el: RenderNode | RenderFragment): RenderNode {
+    while (el.$f) {
+      el = el.children[0]
+    }
+    return platformParentNode(el)
+  }
+
+  function insertOrAppend(
+    container: RenderNode,
+    newNode: RenderNode | RenderFragment,
+    refNode: RenderNode | RenderFragment | null
+  ) {
+    // TODO special case for Fragment
+    if (refNode === null) {
+      appendChild(container, newNode)
+    } else {
+      insertBefore(container, newNode, refNode)
+    }
+  }
+
+  // lifecycle hooks -----------------------------------------------------------
+
+  const hooks: Function[] = []
+
+  function queueHook(fn: Function) {
+    hooks.push(fn)
+  }
+
+  function flushHooks() {
+    let fn
+    while ((fn = hooks.shift())) {
+      fn()
+    }
+  }
+
+  // mounting ------------------------------------------------------------------
+
+  function mount(
+    vnode: VNode,
+    container: RenderNode | null,
+    parentComponent: MountedComponent | null,
+    isSVG: boolean,
+    endNode: RenderNode | RenderFragment | null
+  ): RenderNode | RenderFragment {
+    const { flags } = vnode
+    if (flags & VNodeFlags.ELEMENT) {
+      return mountElement(vnode, container, parentComponent, isSVG, endNode)
+    } else if (flags & VNodeFlags.COMPONENT) {
+      return mountComponent(vnode, container, parentComponent, isSVG, endNode)
+    } else if (flags & VNodeFlags.TEXT) {
+      return mountText(vnode, container, endNode)
+    } else if (flags & VNodeFlags.FRAGMENT) {
+      return mountFragment(vnode, container, parentComponent, isSVG, endNode)
+    } else if (flags & VNodeFlags.PORTAL) {
+      return mountPortal(vnode, container, parentComponent)
+    } else {
+      return platformCreateText('')
+    }
+  }
+
+  function mountArrayChildren(
+    children: VNode[],
+    container: RenderNode | null,
+    parentComponent: MountedComponent | null,
+    isSVG: boolean,
+    endNode: RenderNode | RenderFragment | null
+  ) {
+    for (let i = 0; i < children.length; i++) {
+      let child = children[i]
+      if (child.el) {
+        children[i] = child = cloneVNode(child)
+      }
+      mount(children[i], container, parentComponent, isSVG, endNode)
+    }
+  }
+
+  function mountElement(
+    vnode: VNode,
+    container: RenderNode | null,
+    parentComponent: MountedComponent | null,
+    isSVG: boolean,
+    endNode: RenderNode | RenderFragment | null
+  ): RenderNode {
+    const { flags, tag, data, children, childFlags, ref } = vnode
+    isSVG = isSVG || (flags & VNodeFlags.ELEMENT_SVG) > 0
+    const el = (vnode.el = platformCreateElement(tag as string, isSVG))
+    if (data != null) {
+      for (const key in data) {
+        patchData(el, key, null, data[key], null, vnode, isSVG)
+      }
+    }
+    if (childFlags !== ChildrenFlags.NO_CHILDREN) {
+      const hasSVGChildren = isSVG && tag !== 'foreignObject'
+      if (childFlags & ChildrenFlags.SINGLE_VNODE) {
+        mount(children as VNode, el, parentComponent, hasSVGChildren, endNode)
+      } else if (childFlags & ChildrenFlags.MULTIPLE_VNODES) {
+        mountArrayChildren(
+          children as VNode[],
+          el,
+          parentComponent,
+          hasSVGChildren,
+          endNode
+        )
+      }
+    }
+    if (container != null) {
+      insertOrAppend(container, el, endNode)
+    }
+    if (ref) {
+      mountRef(ref, el)
+    }
+    return el
+  }
+
+  function mountRef(ref: Ref, el: RenderNode | MountedComponent) {
+    queueHook(() => {
+      ref(el)
+    })
+  }
+
+  function mountComponent(
+    vnode: VNode,
+    container: RenderNode | null,
+    parentComponent: MountedComponent | null,
+    isSVG: boolean,
+    endNode: RenderNode | RenderFragment | null
+  ): RenderNode | RenderFragment {
+    let el: RenderNode | RenderFragment
+    const { flags, tag, data, slots } = vnode
+    if (flags & VNodeFlags.COMPONENT_STATEFUL) {
+      el = mountComponentInstance(
+        vnode,
+        tag as ComponentClass,
+        container,
+        parentComponent,
+        isSVG,
+        endNode
+      )
+    } else {
+      // functional component
+      const subTree = (vnode.children = normalizeComponentRoot(
+        (tag as FunctionalComponent)(data || EMPTY_OBJ, slots || EMPTY_OBJ),
+        vnode
+      ))
+      el = vnode.el = mount(subTree, null, parentComponent, isSVG, null)
+    }
+    if (container != null) {
+      insertOrAppend(container, el, endNode)
+    }
+    return el
+  }
+
+  function mountText(
+    vnode: VNode,
+    container: RenderNode | null,
+    endNode: RenderNode | RenderFragment | null
+  ): RenderNode {
+    const el = (vnode.el = platformCreateText(vnode.children as string))
+    if (container != null) {
+      insertOrAppend(container, el, endNode)
+    }
+    return el
+  }
+
+  function mountFragment(
+    vnode: VNode,
+    container: RenderNode | null,
+    parentComponent: MountedComponent | null,
+    isSVG: boolean,
+    endNode: RenderNode | RenderFragment | null
+  ): RenderFragment {
+    const { children, childFlags } = vnode
+    const fragment: RenderFragment = (vnode.el = {
+      $f: true,
+      children: []
+    })
+    const fragmentChildren = fragment.children
+    if (childFlags & ChildrenFlags.SINGLE_VNODE) {
+      fragmentChildren.push(
+        mount(children as VNode, container, parentComponent, isSVG, endNode)
+      )
+    } else if (childFlags & ChildrenFlags.MULTIPLE_VNODES) {
+      mountArrayChildren(
+        children as VNode[],
+        container,
+        parentComponent,
+        isSVG,
+        endNode
+      )
+      for (let i = 0; i < (children as MountedVNodes).length; i++) {
+        fragmentChildren.push((children as MountedVNodes)[i].el)
+      }
+    } else {
+      // ensure at least one children so that it can be used as a ref node
+      // during insertions
+      fragmentChildren.push(mountText(createTextVNode(''), container, endNode))
+    }
+    return fragment
+  }
+
+  function mountPortal(
+    vnode: VNode,
+    container: RenderNode | null,
+    parentComponent: MountedComponent | null
+  ): RenderNode {
+    const { tag, children, childFlags, ref } = vnode
+    const target = typeof tag === 'string' ? platformQuerySelector(tag) : tag
+
+    if (__DEV__ && !target) {
+      // TODO warn poartal target not found
+    }
+
+    if (childFlags & ChildrenFlags.SINGLE_VNODE) {
+      mount(
+        children as VNode,
+        target as RenderNode,
+        parentComponent,
+        false,
+        null
+      )
+    } else if (childFlags & ChildrenFlags.MULTIPLE_VNODES) {
+      mountArrayChildren(
+        children as VNode[],
+        target as RenderNode,
+        parentComponent,
+        false,
+        null
+      )
+    }
+    if (ref) {
+      mountRef(ref, target as RenderNode)
+    }
+    return (vnode.el = mountText(createTextVNode(''), container, null))
+  }
+
+  // patching ------------------------------------------------------------------
+
+  function patchData(
+    el: RenderNode,
+    key: string,
+    prevValue: any,
+    nextValue: any,
+    preVNode: VNode | null,
+    nextVNode: VNode,
+    isSVG: boolean
+  ) {
+    if (isReservedProp(key)) {
+      return
+    }
+    platformPatchData(
+      el,
+      key,
+      prevValue,
+      nextValue,
+      preVNode,
+      nextVNode,
+      isSVG,
+      unmountChildren
+    )
+  }
+
+  function patch(
+    prevVNode: VNode,
+    nextVNode: VNode,
+    container: RenderNode,
+    parentComponent: MountedComponent | null,
+    isSVG: boolean
+  ) {
+    const nextFlags = nextVNode.flags
+    const prevFlags = prevVNode.flags
+
+    if (prevFlags !== nextFlags) {
+      replaceVNode(prevVNode, nextVNode, container, parentComponent, isSVG)
+    } else if (nextFlags & VNodeFlags.ELEMENT) {
+      patchElement(prevVNode, nextVNode, container, parentComponent, isSVG)
+    } else if (nextFlags & VNodeFlags.COMPONENT) {
+      patchComponent(prevVNode, nextVNode, container, parentComponent, isSVG)
+    } else if (nextFlags & VNodeFlags.TEXT) {
+      patchText(prevVNode, nextVNode)
+    } else if (nextFlags & VNodeFlags.FRAGMENT) {
+      patchFragment(prevVNode, nextVNode, container, parentComponent, isSVG)
+    } else if (nextFlags & VNodeFlags.PORTAL) {
+      patchPortal(prevVNode, nextVNode, parentComponent)
+    }
+  }
+
+  function patchElement(
+    prevVNode: VNode,
+    nextVNode: VNode,
+    container: RenderNode,
+    parentComponent: MountedComponent | null,
+    isSVG: boolean
+  ) {
+    const { flags, tag } = nextVNode
+    isSVG = isSVG || (flags & VNodeFlags.ELEMENT_SVG) > 0
+
+    if (prevVNode.tag !== tag) {
+      replaceVNode(prevVNode, nextVNode, container, parentComponent, isSVG)
+      return
+    }
+
+    const el = (nextVNode.el = prevVNode.el) as RenderNode
+
+    // data
+    const prevData = prevVNode.data
+    const nextData = nextVNode.data
+    if (prevData !== nextData) {
+      const prevDataOrEmpty = prevData || EMPTY_OBJ
+      const nextDataOrEmpty = nextData || EMPTY_OBJ
+      if (nextDataOrEmpty !== EMPTY_OBJ) {
+        for (const key in nextDataOrEmpty) {
+          const prevValue = prevDataOrEmpty[key]
+          const nextValue = nextDataOrEmpty[key]
+          if (prevValue !== nextValue) {
+            patchData(
+              el,
+              key,
+              prevValue,
+              nextValue,
+              prevVNode,
+              nextVNode,
+              isSVG
+            )
+          }
+        }
+      }
+      if (prevDataOrEmpty !== EMPTY_OBJ) {
+        for (const key in prevDataOrEmpty) {
+          const prevValue = prevDataOrEmpty[key]
+          if (prevValue != null && !nextDataOrEmpty.hasOwnProperty(key)) {
+            patchData(el, key, prevValue, null, prevVNode, nextVNode, isSVG)
+          }
+        }
+      }
+    }
+
+    // children
+    patchChildren(
+      prevVNode.childFlags,
+      nextVNode.childFlags,
+      prevVNode.children,
+      nextVNode.children,
+      el,
+      parentComponent,
+      isSVG && nextVNode.tag !== 'foreignObject',
+      null
+    )
+  }
+
+  function patchComponent(
+    prevVNode: VNode,
+    nextVNode: VNode,
+    container: RenderNode,
+    parentComponent: MountedComponent | null,
+    isSVG: boolean
+  ) {
+    const { tag, flags } = nextVNode
+    if (tag !== prevVNode.tag) {
+      replaceVNode(prevVNode, nextVNode, container, parentComponent, isSVG)
+    } else if (flags & VNodeFlags.COMPONENT_STATEFUL) {
+      patchStatefulComponent(prevVNode, nextVNode)
+    } else {
+      patchFunctionalComponent(
+        prevVNode,
+        nextVNode,
+        container,
+        parentComponent,
+        isSVG
+      )
+    }
+  }
+
+  function patchStatefulComponent(prevVNode: VNode, nextVNode: VNode) {
+    const { childFlags: prevChildFlags } = prevVNode
+    const {
+      data: nextProps,
+      slots: nextSlots,
+      childFlags: nextChildFlags
+    } = nextVNode
+
+    const instance = (nextVNode.children =
+      prevVNode.children) as MountedComponent
+    instance.$slots = nextSlots || EMPTY_OBJ
+    instance.$parentVNode = nextVNode
+
+    // Update props. This will trigger child update if necessary.
+    if (nextProps !== null) {
+      updateProps(instance, nextProps)
+    }
+
+    // If has different slots content, or has non-compiled slots,
+    // the child needs to be force updated. It's ok to call $forceUpdate
+    // again even if props update has already queued an update, as the
+    // scheduler will not queue the same update twice.
+    const shouldForceUpdate =
+      prevChildFlags !== nextChildFlags ||
+      (nextChildFlags & ChildrenFlags.DYNAMIC_SLOTS) > 0
+    if (shouldForceUpdate) {
+      instance.$forceUpdate()
+    } else if (instance.$vnode.flags & VNodeFlags.COMPONENT) {
+      instance.$vnode.parentVNode = nextVNode
+    }
+    nextVNode.el = instance.$vnode.el
+  }
+
+  function patchFunctionalComponent(
+    prevVNode: VNode,
+    nextVNode: VNode,
+    container: RenderNode,
+    parentComponent: MountedComponent | null,
+    isSVG: boolean
+  ) {
+    // functional component tree is stored on the vnode as `children`
+    const { data: prevProps, slots: prevSlots } = prevVNode
+    const { data: nextProps, slots: nextSlots } = nextVNode
+    const render = nextVNode.tag as FunctionalComponent
+    const prevTree = prevVNode.children as VNode
+
+    let shouldUpdate = true
+    if (render.pure && prevSlots == null && nextSlots == null) {
+      shouldUpdate = shouldUpdateFunctionalComponent(prevProps, nextProps)
+    }
+
+    if (shouldUpdate) {
+      const nextTree = (nextVNode.children = normalizeComponentRoot(
+        render(nextProps || EMPTY_OBJ, nextSlots || EMPTY_OBJ),
+        nextVNode
+      ))
+      patch(prevTree, nextTree, container, parentComponent, isSVG)
+      nextVNode.el = nextTree.el
+    } else if (prevTree.flags & VNodeFlags.COMPONENT) {
+      // functional component returned another component
+      prevTree.parentVNode = nextVNode
+    }
+  }
+
+  function patchFragment(
+    prevVNode: VNode,
+    nextVNode: VNode,
+    container: RenderNode,
+    parentComponent: MountedComponent | null,
+    isSVG: boolean
+  ) {
+    // determine the tail node of the previous fragment,
+    // then retrieve its next sibling to use as the end node for patchChildren.
+    let prevElement = prevVNode.el as RenderNode | RenderFragment
+    while (prevElement.$f) {
+      prevElement = prevElement.children[prevElement.children.length - 1]
+    }
+    const { children, childFlags } = nextVNode
+    patchChildren(
+      prevVNode.childFlags,
+      childFlags,
+      prevVNode.children,
+      children,
+      container,
+      parentComponent,
+      isSVG,
+      platformNextSibling(prevElement)
+    )
+    nextVNode.el = prevVNode.el as RenderFragment
+    const fragmentChildren: (
+      | RenderNode
+      | RenderFragment)[] = (nextVNode.el.children = [])
+    if (childFlags & ChildrenFlags.SINGLE_VNODE) {
+      fragmentChildren.push((children as MountedVNode).el)
+    } else if (childFlags & ChildrenFlags.MULTIPLE_VNODES) {
+      for (let i = 0; i < (children as MountedVNodes).length; i++) {
+        fragmentChildren.push((children as MountedVNodes)[i].el)
+      }
+    } else {
+      fragmentChildren.push(mountText(createTextVNode(''), null, null))
+    }
+  }
+
+  function patchText(prevVNode: VNode, nextVNode: VNode) {
+    const el = (nextVNode.el = prevVNode.el) as RenderNode
+    const nextText = nextVNode.children
+    if (nextText !== prevVNode.children) {
+      platformSetText(el, nextText as string)
+    }
+  }
+
+  function patchPortal(
+    prevVNode: VNode,
+    nextVNode: VNode,
+    parentComponent: MountedComponent | null
+  ) {
+    const prevContainer = prevVNode.tag as RenderNode
+    const nextContainer = nextVNode.tag as RenderNode
+    const nextChildren = nextVNode.children
+    patchChildren(
+      prevVNode.childFlags,
+      nextVNode.childFlags,
+      prevVNode.children,
+      nextChildren,
+      prevContainer,
+      parentComponent,
+      false,
+      null
+    )
+    nextVNode.el = prevVNode.el
+    if (nextContainer !== prevContainer) {
+      switch (nextVNode.childFlags) {
+        case ChildrenFlags.SINGLE_VNODE:
+          appendChild(nextContainer, (nextChildren as MountedVNode).el)
+          break
+        case ChildrenFlags.NO_CHILDREN:
+          break
+        default:
+          for (let i = 0; i < (nextChildren as MountedVNodes).length; i++) {
+            appendChild(nextContainer, (nextChildren as MountedVNodes)[i].el)
+          }
+          break
+      }
+    }
+  }
+
+  function replaceVNode(
+    prevVNode: VNode,
+    nextVNode: VNode,
+    container: RenderNode,
+    parentComponent: MountedComponent | null,
+    isSVG: boolean
+  ) {
+    unmount(prevVNode)
+    replaceChild(
+      container,
+      prevVNode.el as RenderNode | RenderFragment,
+      mount(nextVNode, null, parentComponent, isSVG, null)
+    )
+  }
+
+  function patchChildren(
+    prevChildFlags: ChildrenFlags,
+    nextChildFlags: ChildrenFlags,
+    prevChildren: VNodeChildren,
+    nextChildren: VNodeChildren,
+    container: RenderNode,
+    parentComponent: MountedComponent | null,
+    isSVG: boolean,
+    endNode: RenderNode | RenderFragment | null
+  ) {
+    switch (prevChildFlags) {
+      case ChildrenFlags.SINGLE_VNODE:
+        switch (nextChildFlags) {
+          case ChildrenFlags.SINGLE_VNODE:
+            patch(
+              prevChildren as VNode,
+              nextChildren as VNode,
+              container,
+              parentComponent,
+              isSVG
+            )
+            break
+          case ChildrenFlags.NO_CHILDREN:
+            remove(prevChildren as VNode, container)
+            break
+          default:
+            remove(prevChildren as VNode, container)
+            mountArrayChildren(
+              nextChildren as VNode[],
+              container,
+              parentComponent,
+              isSVG,
+              endNode
+            )
+            break
+        }
+        break
+      case ChildrenFlags.NO_CHILDREN:
+        switch (nextChildFlags) {
+          case ChildrenFlags.SINGLE_VNODE:
+            mount(
+              nextChildren as VNode,
+              container,
+              parentComponent,
+              isSVG,
+              endNode
+            )
+            break
+          case ChildrenFlags.NO_CHILDREN:
+            break
+          default:
+            mountArrayChildren(
+              nextChildren as VNode[],
+              container,
+              parentComponent,
+              isSVG,
+              endNode
+            )
+            break
+        }
+        break
+      default:
+        // MULTIPLE_CHILDREN
+        if (nextChildFlags === ChildrenFlags.SINGLE_VNODE) {
+          removeAll(prevChildren as MountedVNodes, container, endNode)
+          mount(
+            nextChildren as VNode,
+            container,
+            parentComponent,
+            isSVG,
+            endNode
+          )
+        } else if (nextChildFlags === ChildrenFlags.NO_CHILDREN) {
+          removeAll(prevChildren as MountedVNodes, container, endNode)
+        } else {
+          const prevLength = (prevChildren as VNode[]).length
+          const nextLength = (nextChildren as VNode[]).length
+          if (prevLength === 0) {
+            if (nextLength > 0) {
+              mountArrayChildren(
+                nextChildren as VNode[],
+                container,
+                parentComponent,
+                isSVG,
+                endNode
+              )
+            }
+          } else if (nextLength === 0) {
+            removeAll(prevChildren as MountedVNodes, container, endNode)
+          } else if (
+            prevChildFlags === ChildrenFlags.KEYED_VNODES &&
+            nextChildFlags === ChildrenFlags.KEYED_VNODES
+          ) {
+            patchKeyedChildren(
+              prevChildren as VNode[],
+              nextChildren as VNode[],
+              container,
+              prevLength,
+              nextLength,
+              parentComponent,
+              isSVG,
+              endNode
+            )
+          } else {
+            patchNonKeyedChildren(
+              prevChildren as VNode[],
+              nextChildren as VNode[],
+              container,
+              prevLength,
+              nextLength,
+              parentComponent,
+              isSVG,
+              endNode
+            )
+          }
+        }
+        break
+    }
+  }
+
+  function patchNonKeyedChildren(
+    prevChildren: VNode[],
+    nextChildren: VNode[],
+    container: RenderNode,
+    prevLength: number,
+    nextLength: number,
+    parentComponent: MountedComponent | null,
+    isSVG: boolean,
+    endNode: RenderNode | RenderFragment | null
+  ) {
+    const commonLength = prevLength > nextLength ? nextLength : prevLength
+    let i = 0
+    let nextChild
+    let prevChild
+    for (i; i < commonLength; i++) {
+      nextChild = nextChildren[i]
+      prevChild = prevChildren[i]
+      if (nextChild.el) {
+        nextChildren[i] = nextChild = cloneVNode(nextChild)
+      }
+      patch(prevChild, nextChild, container, parentComponent, isSVG)
+      prevChildren[i] = nextChild
+    }
+    if (prevLength < nextLength) {
+      for (i = commonLength; i < nextLength; i++) {
+        nextChild = nextChildren[i]
+        if (nextChild.el) {
+          nextChildren[i] = nextChild = cloneVNode(nextChild)
+        }
+        mount(nextChild, container, parentComponent, isSVG, endNode)
+      }
+    } else if (prevLength > nextLength) {
+      for (i = commonLength; i < prevLength; i++) {
+        remove(prevChildren[i], container)
+      }
+    }
+  }
+
+  function patchKeyedChildren(
+    prevChildren: VNode[],
+    nextChildren: VNode[],
+    container: RenderNode,
+    prevLength: number,
+    nextLength: number,
+    parentComponent: MountedComponent | null,
+    isSVG: boolean,
+    endNode: RenderNode | RenderFragment | null
+  ) {
+    let prevEnd = prevLength - 1
+    let nextEnd = nextLength - 1
+    let i
+    let j = 0
+    let prevVNode = prevChildren[j]
+    let nextVNode = nextChildren[j]
+    let nextPos
+
+    outer: {
+      // Sync nodes with the same key at the beginning.
+      while (prevVNode.key === nextVNode.key) {
+        if (nextVNode.el) {
+          nextChildren[j] = nextVNode = cloneVNode(nextVNode)
+        }
+        patch(prevVNode, nextVNode, container, parentComponent, isSVG)
+        prevChildren[j] = nextVNode
+        j++
+        if (j > prevEnd || j > nextEnd) {
+          break outer
+        }
+        prevVNode = prevChildren[j]
+        nextVNode = nextChildren[j]
+      }
+
+      prevVNode = prevChildren[prevEnd]
+      nextVNode = nextChildren[nextEnd]
+
+      // Sync nodes with the same key at the end.
+      while (prevVNode.key === nextVNode.key) {
+        if (nextVNode.el) {
+          nextChildren[nextEnd] = nextVNode = cloneVNode(nextVNode)
+        }
+        patch(prevVNode, nextVNode, container, parentComponent, isSVG)
+        prevChildren[prevEnd] = nextVNode
+        prevEnd--
+        nextEnd--
+        if (j > prevEnd || j > nextEnd) {
+          break outer
+        }
+        prevVNode = prevChildren[prevEnd]
+        nextVNode = nextChildren[nextEnd]
+      }
+    }
+
+    if (j > prevEnd) {
+      if (j <= nextEnd) {
+        nextPos = nextEnd + 1
+        const nextNode =
+          nextPos < nextLength ? nextChildren[nextPos].el : endNode
+        while (j <= nextEnd) {
+          nextVNode = nextChildren[j]
+          if (nextVNode.el) {
+            nextChildren[j] = nextVNode = cloneVNode(nextVNode)
+          }
+          j++
+          mount(nextVNode, container, parentComponent, isSVG, nextNode)
+        }
+      }
+    } else if (j > nextEnd) {
+      while (j <= prevEnd) {
+        remove(prevChildren[j++], container)
+      }
+    } else {
+      let prevStart = j
+      const nextStart = j
+      const prevLeft = prevEnd - j + 1
+      const nextLeft = nextEnd - j + 1
+      const sources: number[] = []
+      for (i = 0; i < nextLeft; i++) {
+        sources.push(0)
+      }
+      // Keep track if its possible to remove whole DOM using textContent = ''
+      let canRemoveWholeContent = prevLeft === prevLength
+      let moved = false
+      let pos = 0
+      let patched = 0
+
+      // When sizes are small, just loop them through
+      if (nextLength < 4 || (prevLeft | nextLeft) < 32) {
+        for (i = prevStart; i <= prevEnd; i++) {
+          prevVNode = prevChildren[i]
+          if (patched < nextLeft) {
+            for (j = nextStart; j <= nextEnd; j++) {
+              nextVNode = nextChildren[j]
+              if (prevVNode.key === nextVNode.key) {
+                sources[j - nextStart] = i + 1
+                if (canRemoveWholeContent) {
+                  canRemoveWholeContent = false
+                  while (i > prevStart) {
+                    remove(prevChildren[prevStart++], container)
+                  }
+                }
+                if (pos > j) {
+                  moved = true
+                } else {
+                  pos = j
+                }
+                if (nextVNode.el) {
+                  nextChildren[j] = nextVNode = cloneVNode(nextVNode)
+                }
+                patch(prevVNode, nextVNode, container, parentComponent, isSVG)
+                patched++
+                break
+              }
+            }
+            if (!canRemoveWholeContent && j > nextEnd) {
+              remove(prevVNode, container)
+            }
+          } else if (!canRemoveWholeContent) {
+            remove(prevVNode, container)
+          }
+        }
+      } else {
+        const keyIndex: Record<string, number> = {}
+
+        // Map keys by their index
+        for (i = nextStart; i <= nextEnd; i++) {
+          keyIndex[nextChildren[i].key as string] = i
+        }
+
+        // Try to patch same keys
+        for (i = prevStart; i <= prevEnd; i++) {
+          prevVNode = prevChildren[i]
+
+          if (patched < nextLeft) {
+            j = keyIndex[prevVNode.key as string]
+
+            if (j !== void 0) {
+              if (canRemoveWholeContent) {
+                canRemoveWholeContent = false
+                while (i > prevStart) {
+                  remove(prevChildren[prevStart++], container)
+                }
+              }
+              nextVNode = nextChildren[j]
+              sources[j - nextStart] = i + 1
+              if (pos > j) {
+                moved = true
+              } else {
+                pos = j
+              }
+              if (nextVNode.el) {
+                nextChildren[j] = nextVNode = cloneVNode(nextVNode)
+              }
+              patch(prevVNode, nextVNode, container, parentComponent, isSVG)
+              patched++
+            } else if (!canRemoveWholeContent) {
+              remove(prevVNode, container)
+            }
+          } else if (!canRemoveWholeContent) {
+            remove(prevVNode, container)
+          }
+        }
+      }
+      // fast-path: if nothing patched remove all old and add all new
+      if (canRemoveWholeContent) {
+        removeAll(prevChildren as MountedVNodes, container, endNode)
+        mountArrayChildren(
+          nextChildren,
+          container,
+          parentComponent,
+          isSVG,
+          endNode
+        )
+      } else {
+        if (moved) {
+          const seq = lis(sources)
+          j = seq.length - 1
+          for (i = nextLeft - 1; i >= 0; i--) {
+            if (sources[i] === 0) {
+              pos = i + nextStart
+              nextVNode = nextChildren[pos]
+              if (nextVNode.el) {
+                nextChildren[pos] = nextVNode = cloneVNode(nextVNode)
+              }
+              nextPos = pos + 1
+              mount(
+                nextVNode,
+                container,
+                parentComponent,
+                isSVG,
+                nextPos < nextLength ? nextChildren[nextPos].el : endNode
+              )
+            } else if (j < 0 || i !== seq[j]) {
+              pos = i + nextStart
+              nextVNode = nextChildren[pos]
+              nextPos = pos + 1
+              insertOrAppend(
+                container,
+                nextVNode.el as RenderNode | RenderFragment,
+                nextPos < nextLength ? nextChildren[nextPos].el : endNode
+              )
+            } else {
+              j--
+            }
+          }
+        } else if (patched !== nextLeft) {
+          // when patched count doesn't match b length we need to insert those
+          // new ones loop backwards so we can use insertBefore
+          for (i = nextLeft - 1; i >= 0; i--) {
+            if (sources[i] === 0) {
+              pos = i + nextStart
+              nextVNode = nextChildren[pos]
+              if (nextVNode.el) {
+                nextChildren[pos] = nextVNode = cloneVNode(nextVNode)
+              }
+              nextPos = pos + 1
+              mount(
+                nextVNode,
+                container,
+                parentComponent,
+                isSVG,
+                nextPos < nextLength ? nextChildren[nextPos].el : endNode
+              )
+            }
+          }
+        }
+      }
+    }
+  }
+
+  // https://en.wikipedia.org/wiki/Longest_increasing_subsequence
+  function lis(arr: number[]): number[] {
+    const p = arr.slice()
+    const result = [0]
+    let i
+    let j
+    let u
+    let v
+    let c
+    const len = arr.length
+    for (i = 0; i < len; i++) {
+      const arrI = arr[i]
+      if (arrI !== 0) {
+        j = result[result.length - 1]
+        if (arr[j] < arrI) {
+          p[i] = j
+          result.push(i)
+          continue
+        }
+        u = 0
+        v = result.length - 1
+        while (u < v) {
+          c = ((u + v) / 2) | 0
+          if (arr[result[c]] < arrI) {
+            u = c + 1
+          } else {
+            v = c
+          }
+        }
+        if (arrI < arr[result[u]]) {
+          if (u > 0) {
+            p[i] = result[u - 1]
+          }
+          result[u] = i
+        }
+      }
+    }
+    u = result.length
+    v = result[u - 1]
+    while (u-- > 0) {
+      result[u] = v
+      v = p[v]
+    }
+    return result
+  }
+
+  // unmounting ----------------------------------------------------------------
+
+  function unmount(vnode: VNode) {
+    const { flags, children, childFlags, ref } = vnode
+    if (flags & VNodeFlags.ELEMENT || flags & VNodeFlags.FRAGMENT) {
+      unmountChildren(children as VNodeChildren, childFlags)
+      if (teardownVNode !== void 0) {
+        teardownVNode(vnode)
+      }
+    } else if (flags & VNodeFlags.COMPONENT) {
+      if (flags & VNodeFlags.COMPONENT_STATEFUL) {
+        unmountComponentInstance(children as MountedComponent)
+      } else {
+        unmount(children as VNode)
+      }
+    } else if (flags & VNodeFlags.PORTAL) {
+      if (childFlags & ChildrenFlags.MULTIPLE_VNODES) {
+        removeAll(children as MountedVNodes, vnode.tag as RenderNode, null)
+      } else if (childFlags === ChildrenFlags.SINGLE_VNODE) {
+        remove(children as VNode, vnode.tag as RenderNode)
+      }
+    }
+    if (ref) {
+      ref(null)
+    }
+  }
+
+  function unmountChildren(children: VNodeChildren, childFlags: ChildrenFlags) {
+    if (childFlags & ChildrenFlags.MULTIPLE_VNODES) {
+      unmountArrayChildren(children as VNode[])
+    } else if (childFlags === ChildrenFlags.SINGLE_VNODE) {
+      unmount(children as VNode)
+    }
+  }
+
+  function unmountArrayChildren(children: VNode[]) {
+    for (let i = 0; i < children.length; i++) {
+      unmount(children[i])
+    }
+  }
+
+  function remove(vnode: VNode, container: RenderNode) {
+    unmount(vnode)
+    if (container && vnode.el) {
+      removeChild(container, vnode.el)
+      vnode.el = null
+    }
+  }
+
+  function removeAll(
+    children: MountedVNodes,
+    container: RenderNode,
+    ref: RenderNode | RenderFragment | null
+  ) {
+    unmountArrayChildren(children)
+    if (ref === null) {
+      platformClearContent(container)
+    } else {
+      for (let i = 0; i < children.length; i++) {
+        removeChild(container, children[i].el as RenderNode | RenderFragment)
+      }
+    }
+  }
+
+  // Component lifecycle -------------------------------------------------------
+
+  function mountComponentInstance(
+    parentVNode: VNode,
+    Component: ComponentClass,
+    container: RenderNode | null,
+    parentComponent: MountedComponent | null,
+    isSVG: boolean,
+    endNode: RenderNode | RenderFragment | null
+  ): RenderNode {
+    const instance = createComponentInstance(
+      parentVNode,
+      Component,
+      parentComponent
+    )
+
+    const queueUpdate = (instance.$forceUpdate = () => {
+      queueJob(instance._updateHandle, flushHooks)
+    })
+
+    instance._updateHandle = autorun(
+      () => {
+        if (instance._destroyed) {
+          return
+        }
+        if (instance._mounted) {
+          updateComponentInstance(instance, container, isSVG)
+        } else {
+          // this will be executed synchronously right here
+          instance.$vnode = renderInstanceRoot(instance)
+          parentVNode.el = mount(
+            instance.$vnode,
+            container,
+            instance,
+            isSVG,
+            endNode
+          )
+          instance._mounted = true
+          mountComponentInstanceCallbacks(instance, parentVNode.ref)
+        }
+      },
+      {
+        scheduler: queueUpdate,
+        onTrigger:
+          instance.beforeUpdate && instance.beforeUpdate.bind(instance.$proxy)
+      }
+    )
+
+    return parentVNode.el as RenderNode
+  }
+
+  function mountComponentInstanceCallbacks(
+    instance: MountedComponent,
+    ref: Ref | null
+  ) {
+    if (instance.beforeMount) {
+      instance.beforeMount.call(instance.$proxy)
+    }
+    if (ref) {
+      mountRef(ref, instance)
+    }
+    if (instance.mounted) {
+      queueHook(() => {
+        ;(instance as any).mounted.call(instance.$proxy)
+      })
+    }
+  }
+
+  function updateComponentInstance(
+    instance: MountedComponent,
+    container: RenderNode | null,
+    isSVG: boolean
+  ) {
+    // beforeUpdate is called as the onTrack hook of the instance's reactive
+    // runner
+    const prevVNode = instance.$vnode
+    const nextVNode = (instance.$vnode = renderInstanceRoot(instance))
+    container =
+      container || parentNode(prevVNode.el as RenderNode | RenderFragment)
+    patch(prevVNode, nextVNode, container, instance, isSVG)
+    const el = nextVNode.el as RenderNode
+
+    // recursively update parentVNode el for nested HOCs
+    if ((nextVNode.flags & VNodeFlags.PORTAL) === 0) {
+      let vnode = instance.$parentVNode
+      while (vnode !== null) {
+        if ((vnode.flags & VNodeFlags.COMPONENT) > 0) {
+          vnode.el = el
+        }
+        vnode = vnode.parentVNode
+      }
+    }
+
+    if (instance.updated) {
+      queueHook(() => {
+        ;(instance as any).updated.call(instance.$proxy, nextVNode)
+      })
+    }
+  }
+
+  function unmountComponentInstance(instance: MountedComponent) {
+    if (instance.beforeDestroy) {
+      instance.beforeDestroy.call(instance.$proxy)
+    }
+    if (instance.$vnode) {
+      unmount(instance.$vnode)
+    }
+    stop(instance._updateHandle)
+    teardownComponentInstance(instance)
+    instance._destroyed = true
+    if (instance.destroyed) {
+      instance.destroyed.call(instance.$proxy)
+    }
+  }
+
+  // TODO hydrating ------------------------------------------------------------
+
+  // API -----------------------------------------------------------------------
+
+  function render(vnode: VNode | null, container: RenderNode) {
+    const prevVNode = container.vnode
+    if (vnode && vnode.el) {
+      vnode = cloneVNode(vnode)
+    }
+    if (prevVNode == null) {
+      if (vnode) {
+        mount(vnode, container, null, false, null)
+        container.vnode = vnode
+      }
+    } else {
+      if (vnode) {
+        patch(prevVNode, vnode, container, null, false)
+        container.vnode = vnode
+      } else {
+        remove(prevVNode, container)
+        container.vnode = null
+      }
+    }
+    flushHooks()
+  }
+
+  return { render }
+}
diff --git a/packages/core/src/errorHandling.ts b/packages/core/src/errorHandling.ts
new file mode 100644 (file)
index 0000000..7714bcf
--- /dev/null
@@ -0,0 +1,26 @@
+import { MountedComponent } from './component'
+
+export const enum ErrorTypes {
+  LIFECYCLE = 1,
+  RENDER = 2,
+  NATIVE_EVENT_HANDLER = 3,
+  COMPONENT_EVENT_HANDLER = 4
+}
+
+const globalHandlers: Function[] = []
+
+export function globalHandleError(handler: () => void) {
+  globalHandlers.push(handler)
+  return () => {
+    globalHandlers.splice(globalHandlers.indexOf(handler), 1)
+  }
+}
+
+export function handleError(
+  err: Error,
+  instance: MountedComponent,
+  type: ErrorTypes,
+  code: number
+) {
+  // TODO
+}
diff --git a/packages/core/src/flags.ts b/packages/core/src/flags.ts
new file mode 100644 (file)
index 0000000..c248c4e
--- /dev/null
@@ -0,0 +1,31 @@
+// vnode flags
+export const enum VNodeFlags {
+  ELEMENT_HTML = 1,
+  ELEMENT_SVG = 1 << 1,
+  ELEMENT = ELEMENT_HTML | ELEMENT_SVG,
+
+  COMPONENT_UNKNOWN = 1 << 2,
+  COMPONENT_STATEFUL = 1 << 3,
+  COMPONENT_FUNCTIONAL = 1 << 4,
+  COMPONENT_ASYNC = 1 << 5,
+  COMPONENT = COMPONENT_UNKNOWN |
+    COMPONENT_STATEFUL |
+    COMPONENT_FUNCTIONAL |
+    COMPONENT_ASYNC,
+
+  TEXT = 1 << 6,
+  FRAGMENT = 1 << 7,
+  PORTAL = 1 << 8
+}
+
+export const enum ChildrenFlags {
+  UNKNOWN_CHILDREN = 0,
+  NO_CHILDREN = 1,
+  SINGLE_VNODE = 1 << 1,
+  KEYED_VNODES = 1 << 2,
+  NONE_KEYED_VNODES = 1 << 3,
+  STABLE_SLOTS = 1 << 4,
+  DYNAMIC_SLOTS = 1 << 5,
+  HAS_SLOTS = STABLE_SLOTS | DYNAMIC_SLOTS,
+  MULTIPLE_VNODES = KEYED_VNODES | NONE_KEYED_VNODES
+}
diff --git a/packages/core/src/h.ts b/packages/core/src/h.ts
new file mode 100644 (file)
index 0000000..99adfac
--- /dev/null
@@ -0,0 +1,104 @@
+import { ChildrenFlags } from './flags'
+import { ComponentClass, FunctionalComponent } from './component'
+import { ComponentOptions } from './componentOptions'
+import {
+  VNode,
+  createElementVNode,
+  createComponentVNode,
+  createTextVNode,
+  createFragment,
+  createPortal
+} from './vdom'
+
+export const Fragment = Symbol()
+export const Portal = Symbol()
+
+type ElementType =
+  | string
+  | FunctionalComponent
+  | ComponentClass
+  | ComponentOptions
+  | typeof Fragment
+  | typeof Portal
+
+export interface createElement {
+  (tag: ElementType, data: any, children: any): VNode
+  c: typeof createComponentVNode
+  e: typeof createElementVNode
+  t: typeof createTextVNode
+  f: typeof createFragment
+  p: typeof createPortal
+}
+
+export const h = ((tag: ElementType, data: any, children: any): VNode => {
+  if (Array.isArray(data) || (data !== void 0 && typeof data !== 'object')) {
+    children = data
+    data = null
+  }
+
+  // TODO clone data if it is observed
+
+  let key = null
+  let ref = null
+  let portalTarget = null
+  if (data != null) {
+    if (data.slots != null) {
+      children = data.slots
+    }
+    if (data.key != null) {
+      ;({ key } = data)
+    }
+    if (data.ref != null) {
+      ;({ ref } = data)
+    }
+    if (data.target != null) {
+      portalTarget = data.target
+    }
+  }
+
+  if (typeof tag === 'string') {
+    // element
+    return createElementVNode(
+      tag,
+      data,
+      children,
+      ChildrenFlags.UNKNOWN_CHILDREN,
+      key,
+      ref
+    )
+  } else if (tag === Fragment) {
+    if (__DEV__ && ref) {
+      // TODO warn fragment cannot have ref
+    }
+    return createFragment(children, ChildrenFlags.UNKNOWN_CHILDREN, key)
+  } else if (tag === Portal) {
+    if (__DEV__ && !portalTarget) {
+      // TODO warn portal must have a target
+    }
+    return createPortal(
+      portalTarget,
+      children,
+      ChildrenFlags.UNKNOWN_CHILDREN,
+      key,
+      ref
+    )
+  } else {
+    // TODO: handle fragment & portal types
+    // TODO: warn ref on fragment
+    // component
+    return createComponentVNode(
+      tag,
+      data,
+      children,
+      ChildrenFlags.UNKNOWN_CHILDREN,
+      key,
+      ref
+    )
+  }
+}) as createElement
+
+h.c = createComponentVNode
+h.e = createElementVNode
+h.t = createTextVNode
+h.f = createFragment
+h.p = createPortal
diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts
new file mode 100644 (file)
index 0000000..f37e98e
--- /dev/null
@@ -0,0 +1,29 @@
+// render api
+export { h, Fragment, Portal } from './h'
+export { cloneVNode, createPortal, createFragment } from './vdom'
+export { createRenderer } from './createRenderer'
+
+import { Component as InternalComponent, ComponentClass } from './component'
+
+// the public component constructor with proper type inference.
+export const Component = InternalComponent as ComponentClass
+
+// observer api
+export {
+  autorun,
+  stop,
+  observable,
+  immutable,
+  computed,
+  isObservable,
+  isImmutable,
+  markImmutable,
+  markNonReactive,
+  unwrap
+} from '@vue/observer'
+
+// flags & types
+export { FunctionalComponent } from './component'
+export { ComponentOptions, PropType } from './componentOptions'
+export { VNodeFlags, ChildrenFlags } from './flags'
+export { VNode, VNodeData, VNodeChildren, Key, Ref, Slots, Slot } from './vdom'
diff --git a/packages/core/src/utils.ts b/packages/core/src/utils.ts
new file mode 100644 (file)
index 0000000..465c0d9
--- /dev/null
@@ -0,0 +1,12 @@
+export const EMPTY_OBJ: { readonly [key: string]: any } = Object.freeze({})
+
+export const isReservedProp = (key: string): boolean => {
+  switch (key) {
+    case 'key':
+    case 'ref':
+    case 'slots':
+      return true
+    default:
+      return key.startsWith('nativeOn')
+  }
+}
diff --git a/packages/core/src/vdom.ts b/packages/core/src/vdom.ts
new file mode 100644 (file)
index 0000000..519ea09
--- /dev/null
@@ -0,0 +1,360 @@
+import {
+  MountedComponent,
+  ComponentClass,
+  FunctionalComponent
+} from './component'
+import { VNodeFlags, ChildrenFlags } from './flags'
+import { normalizeComponentProps } from './componentProps'
+import { createComponentClassFromOptions } from './componentUtils'
+import { ComponentPropsOptions } from './componentOptions'
+
+// Vue core is platform agnostic, so we are not using Element for "DOM" nodes.
+export interface RenderNode {
+  vnode?: VNode | null
+  // technically this doesn't exist on platforn render nodes,
+  // but we list it here so that TS can figure out union types
+  $f: false
+}
+
+export interface RenderFragment {
+  children: (RenderNode | RenderFragment)[]
+  $f: true
+}
+
+export interface VNode {
+  _isVNode: true
+  flags: VNodeFlags
+  tag: string | FunctionalComponent | ComponentClass | RenderNode | null
+  data: VNodeData | null
+  children: VNodeChildren
+  childFlags: ChildrenFlags
+  key: Key | null
+  ref: Ref | null
+  slots: Slots | null
+  // only on mounted nodes
+  el: RenderNode | RenderFragment | null
+  // only on mounted component root nodes
+  // points to component node in parent tree
+  parentVNode: VNode | null
+}
+
+export interface MountedVNode extends VNode {
+  el: RenderNode | RenderFragment
+}
+
+export type MountedVNodes = MountedVNode[]
+
+export interface VNodeData {
+  key?: Key | null
+  ref?: Ref | null
+  slots?: Slots | null
+  [key: string]: any
+}
+
+export type VNodeChildren =
+  | VNode[] // ELEMENT | PORTAL
+  | MountedComponent // COMPONENT_STATEFUL
+  | VNode // COMPONENT_FUNCTIONAL
+  | string // TEXT
+  | null
+
+export type Key = string | number
+
+export type Ref = (t: RenderNode | MountedComponent | null) => void
+
+export interface Slots {
+  [name: string]: Slot
+}
+
+export type Slot = (...args: any[]) => VNode[]
+
+export function createVNode(
+  flags: VNodeFlags,
+  tag: string | FunctionalComponent | ComponentClass | RenderNode | null,
+  data: VNodeData | null,
+  children: VNodeChildren | null,
+  childFlags: ChildrenFlags,
+  key: Key | null | undefined,
+  ref: Ref | null | undefined,
+  slots: Slots | null | undefined
+): VNode {
+  const vnode: VNode = {
+    _isVNode: true,
+    flags,
+    tag,
+    data,
+    children,
+    childFlags,
+    key: key === void 0 ? null : key,
+    ref: ref === void 0 ? null : ref,
+    slots: slots === void 0 ? null : slots,
+    el: null,
+    parentVNode: null
+  }
+  if (childFlags === ChildrenFlags.UNKNOWN_CHILDREN) {
+    normalizeChildren(vnode, children)
+  }
+  return vnode
+}
+
+export function createElementVNode(
+  tag: string,
+  data: VNodeData | null,
+  children: VNodeChildren,
+  childFlags: ChildrenFlags,
+  key?: Key | null,
+  ref?: Ref | null
+) {
+  const flags = tag === 'svg' ? VNodeFlags.ELEMENT_SVG : VNodeFlags.ELEMENT_HTML
+  return createVNode(flags, tag, data, children, childFlags, key, ref, null)
+}
+
+export function createComponentVNode(
+  comp: any,
+  data: VNodeData | null,
+  children: VNodeChildren,
+  childFlags: ChildrenFlags,
+  key?: Key | null,
+  ref?: Ref | null
+) {
+  // resolve type
+  let flags: VNodeFlags
+  let propsOptions: ComponentPropsOptions
+
+  // flags
+  const compType = typeof comp
+  if (__COMPAT__ && compType === 'object') {
+    if (comp.functional) {
+      // object literal functional
+      flags = VNodeFlags.COMPONENT_FUNCTIONAL
+      const { render } = comp
+      if (!comp._normalized) {
+        render.pure = comp.pure
+        render.props = comp.props
+        comp._normalized = true
+      }
+      comp = render
+      propsOptions = comp.props
+    } else {
+      // object literal stateful
+      flags = VNodeFlags.COMPONENT_STATEFUL
+      comp =
+        comp._normalized ||
+        (comp._normalized = createComponentClassFromOptions(comp))
+      propsOptions = comp.options && comp.options.props
+    }
+  } else {
+    // assumes comp is function here now
+    if (__DEV__ && compType !== 'function') {
+      // TODO warn invalid comp value in dev
+    }
+    if (comp.prototype && comp.prototype.render) {
+      flags = VNodeFlags.COMPONENT_STATEFUL
+      propsOptions = comp.options && comp.options.props
+    } else {
+      flags = VNodeFlags.COMPONENT_FUNCTIONAL
+      propsOptions = comp.props
+    }
+  }
+
+  if (__DEV__ && flags === VNodeFlags.COMPONENT_FUNCTIONAL && ref) {
+    // TODO warn functional component cannot have ref
+  }
+
+  // props
+  const props = normalizeComponentProps(data, propsOptions, comp)
+
+  // slots
+  let slots: any
+  if (childFlags == null) {
+    childFlags = children
+      ? ChildrenFlags.DYNAMIC_SLOTS
+      : ChildrenFlags.NO_CHILDREN
+    if (children != null) {
+      const childrenType = typeof children
+      if (childrenType === 'function') {
+        // function as children
+        slots = { default: children }
+      } else if (childrenType === 'object' && !(children as VNode)._isVNode) {
+        // slot object as children
+        slots = children
+      } else {
+        slots = { default: () => children }
+      }
+      slots = normalizeSlots(slots)
+    }
+  }
+
+  return createVNode(
+    flags,
+    comp,
+    props,
+    null, // to be set during mount
+    childFlags,
+    key,
+    ref,
+    slots
+  )
+}
+
+export function createTextVNode(text: string): VNode {
+  return createVNode(
+    VNodeFlags.TEXT,
+    null,
+    null,
+    text == null ? '' : text,
+    ChildrenFlags.NO_CHILDREN,
+    null,
+    null,
+    null
+  )
+}
+
+export function createFragment(
+  children: VNodeChildren,
+  childFlags?: ChildrenFlags,
+  key?: Key | null
+) {
+  return createVNode(
+    VNodeFlags.FRAGMENT,
+    null,
+    null,
+    children,
+    childFlags === void 0 ? ChildrenFlags.UNKNOWN_CHILDREN : childFlags,
+    key,
+    null,
+    null
+  )
+}
+
+export function createPortal(
+  target: RenderNode | string,
+  children: VNodeChildren,
+  childFlags?: ChildrenFlags,
+  key?: Key | null,
+  ref?: Ref | null
+): VNode {
+  return createVNode(
+    VNodeFlags.PORTAL,
+    target,
+    null,
+    children,
+    childFlags === void 0 ? ChildrenFlags.UNKNOWN_CHILDREN : childFlags,
+    key,
+    ref,
+    null
+  )
+}
+
+export function cloneVNode(vnode: VNode, extraData?: VNodeData): VNode {
+  const { flags, data } = vnode
+  if (flags & VNodeFlags.ELEMENT || flags & VNodeFlags.COMPONENT) {
+    let clonedData = data
+    if (extraData != null) {
+      clonedData = {}
+      if (data != null) {
+        for (const key in data) {
+          clonedData[key] = data[key]
+        }
+      }
+      for (const key in extraData) {
+        clonedData[key] = extraData[key]
+      }
+    }
+    return createVNode(
+      flags,
+      vnode.tag,
+      clonedData,
+      vnode.children,
+      vnode.childFlags,
+      vnode.key,
+      vnode.ref,
+      vnode.slots
+    )
+  } else if (flags & VNodeFlags.TEXT) {
+    return createTextVNode(vnode.children as string)
+  } else {
+    return vnode
+  }
+}
+
+function normalizeChildren(vnode: VNode, children: any) {
+  let childFlags
+  if (Array.isArray(children)) {
+    const { length } = children
+    if (length === 0) {
+      childFlags = ChildrenFlags.NO_CHILDREN
+      children = null
+    } else if (length === 1) {
+      childFlags = ChildrenFlags.SINGLE_VNODE
+      children = children[0]
+      if (children.el) {
+        children = cloneVNode(children)
+      }
+    } else {
+      childFlags = ChildrenFlags.KEYED_VNODES
+      children = normalizeVNodes(children)
+    }
+  } else if (children == null) {
+    childFlags = ChildrenFlags.NO_CHILDREN
+  } else if (children._isVNode) {
+    childFlags = ChildrenFlags.SINGLE_VNODE
+    if (children.el) {
+      children = cloneVNode(children)
+    }
+  } else {
+    // primitives or invalid values, cast to string
+    childFlags = ChildrenFlags.SINGLE_VNODE
+    children = createTextVNode(children + '')
+  }
+  vnode.children = children
+  vnode.childFlags = childFlags
+}
+
+export function normalizeVNodes(
+  children: any[],
+  newChildren: VNode[] = [],
+  currentPrefix: string = ''
+): VNode[] {
+  for (let i = 0; i < children.length; i++) {
+    const child = children[i]
+    let newChild
+    if (child == null) {
+      newChild = createTextVNode('')
+    } else if (child._isVNode) {
+      newChild = child.el ? cloneVNode(child) : child
+    } else if (Array.isArray(child)) {
+      normalizeVNodes(child, newChildren, currentPrefix + i + '|')
+    } else {
+      newChild = createTextVNode(child + '')
+    }
+    if (newChild) {
+      if (newChild.key == null) {
+        newChild.key = currentPrefix + i
+      }
+      newChildren.push(newChild)
+    }
+  }
+  return newChildren
+}
+
+// ensure all slot functions return Arrays
+function normalizeSlots(slots: { [name: string]: any }): Slots {
+  const normalized: Slots = {}
+  for (const name in slots) {
+    normalized[name] = (...args) => normalizeSlot(slots[name](...args))
+  }
+  return normalized
+}
+
+function normalizeSlot(value: any): VNode[] {
+  if (value == null) {
+    return [createTextVNode('')]
+  } else if (Array.isArray(value)) {
+    return normalizeVNodes(value)
+  } else if (value._isVNode) {
+    return [value]
+  } else {
+    return [createTextVNode(value + '')]
+  }
+}
diff --git a/packages/global.d.ts b/packages/global.d.ts
new file mode 100644 (file)
index 0000000..11614e9
--- /dev/null
@@ -0,0 +1,3 @@
+// Global compile-time constants
+declare var __DEV__: boolean
+declare var __COMPAT__: boolean
diff --git a/packages/observer/.npmignore b/packages/observer/.npmignore
new file mode 100644 (file)
index 0000000..bb5c8a5
--- /dev/null
@@ -0,0 +1,3 @@
+__tests__/
+__mocks__/
+dist/packages
\ No newline at end of file
diff --git a/packages/observer/README.md b/packages/observer/README.md
new file mode 100644 (file)
index 0000000..a6c7f10
--- /dev/null
@@ -0,0 +1,3 @@
+# @vue/observer
+
+> This package is inlined into UMD & Browser ESM builds of user-facing renderers (e.g. `@vue/runtime-dom`), but also published as a package that can be used standalone. The standalone build should not be used alongside a pre-bundled build of a user-facing renderer, as they will have different internal storage for reactivity connections. A user-facing renderer should re-export all APIs from this package.
diff --git a/packages/observer/index.js b/packages/observer/index.js
new file mode 100644 (file)
index 0000000..50a792c
--- /dev/null
@@ -0,0 +1,7 @@
+'use strict'
+
+if (process.env.NODE_ENV === 'production') {
+  module.exports = require('./dist/observer.cjs.prod.js')
+} else {
+  module.exports = require('./dist/observer.cjs.js')
+}
diff --git a/packages/observer/package.json b/packages/observer/package.json
new file mode 100644 (file)
index 0000000..81bccff
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "name": "@vue/observer",
+  "version": "3.0.0-alpha.1",
+  "description": "@vue/observer",
+  "main": "index.js",
+  "module": "dist/observer.esm.js",
+  "typings": "dist/index.d.ts",
+  "unpkg": "dist/observer.umd.js",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/vuejs/vue.git"
+  },
+  "buildOptions": {
+    "name": "VueObserver",
+    "formats": ["esm", "cjs", "umd", "esm-browser"]
+  },
+  "keywords": [
+    "vue"
+  ],
+  "author": "Evan You",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/vuejs/vue/issues"
+  },
+  "homepage": "https://github.com/vuejs/vue/tree/dev/packages/observer#readme"
+}
diff --git a/packages/observer/src/autorun.ts b/packages/observer/src/autorun.ts
new file mode 100644 (file)
index 0000000..6752bf7
--- /dev/null
@@ -0,0 +1,164 @@
+import { OperationTypes } from './operations'
+import { Dep, KeyToDepMap, targetMap } from './state'
+
+export interface Autorun {
+  (): any
+  isAutorun: true
+  active: boolean
+  raw: Function
+  deps: Array<Dep>
+  scheduler?: Scheduler
+  onTrack?: Debugger
+  onTrigger?: Debugger
+}
+
+export interface AutorunOptions {
+  lazy?: boolean
+  scheduler?: Scheduler
+  onTrack?: Debugger
+  onTrigger?: Debugger
+}
+
+export type Scheduler = (run: () => any) => void
+
+export type DebuggerEvent = {
+  runner: Autorun
+  target: any
+  type: OperationTypes
+  key: string | symbol | undefined
+}
+
+export type Debugger = (event: DebuggerEvent) => void
+
+export const activeAutorunStack: Autorun[] = []
+
+const ITERATE_KEY = Symbol('iterate')
+
+export function createAutorun(fn: Function, options: AutorunOptions): Autorun {
+  const runner = function runner(...args): any {
+    return run(runner as Autorun, fn, args)
+  } as Autorun
+  runner.active = true
+  runner.raw = fn
+  runner.scheduler = options.scheduler
+  runner.onTrack = options.onTrack
+  runner.onTrigger = options.onTrigger
+  runner.deps = []
+  return runner
+}
+
+function run(runner: Autorun, fn: Function, args: any[]): any {
+  if (!runner.active) {
+    return fn(...args)
+  }
+  if (activeAutorunStack.indexOf(runner) === -1) {
+    cleanup(runner)
+    try {
+      activeAutorunStack.push(runner)
+      return fn(...args)
+    } finally {
+      activeAutorunStack.pop()
+    }
+  }
+}
+
+export function cleanup(runner: Autorun) {
+  for (let i = 0; i < runner.deps.length; i++) {
+    runner.deps[i].delete(runner)
+  }
+  runner.deps = []
+}
+
+export function track(
+  target: any,
+  type: OperationTypes,
+  key?: string | symbol
+) {
+  const runner = activeAutorunStack[activeAutorunStack.length - 1]
+  if (runner) {
+    if (type === OperationTypes.ITERATE) {
+      key = ITERATE_KEY
+    }
+    // keyMap must exist because only an observed target can call this function
+    const depsMap = targetMap.get(target) as KeyToDepMap
+    let dep = depsMap.get(key as string | symbol)
+    if (!dep) {
+      depsMap.set(key as string | symbol, (dep = new Set()))
+    }
+    if (!dep.has(runner)) {
+      dep.add(runner)
+      runner.deps.push(dep)
+      if (__DEV__ && runner.onTrack) {
+        runner.onTrack({
+          runner,
+          target,
+          type,
+          key
+        })
+      }
+    }
+  }
+}
+
+export function trigger(
+  target: any,
+  type: OperationTypes,
+  key?: string | symbol,
+  extraInfo?: any
+) {
+  const depsMap = targetMap.get(target) as KeyToDepMap
+  const runners = new Set()
+  if (type === OperationTypes.CLEAR) {
+    // collection being cleared, trigger all runners for target
+    depsMap.forEach(dep => {
+      addRunners(runners, dep)
+    })
+  } else {
+    // schedule runs for SET | ADD | DELETE
+    addRunners(runners, depsMap.get(key as string | symbol))
+    // also run for iteration key on ADD | DELETE
+    if (type === OperationTypes.ADD || type === OperationTypes.DELETE) {
+      const iterationKey = Array.isArray(target) ? 'length' : ITERATE_KEY
+      addRunners(runners, depsMap.get(iterationKey))
+    }
+  }
+  runners.forEach(runner => {
+    scheduleRun(runner, target, type, key, extraInfo)
+  })
+}
+
+function addRunners(
+  runners: Set<Autorun>,
+  runnersToAdd: Set<Autorun> | undefined
+) {
+  if (runnersToAdd !== void 0) {
+    runnersToAdd.forEach(runners.add, runners)
+  }
+}
+
+function scheduleRun(
+  runner: Autorun,
+  target: any,
+  type: OperationTypes,
+  key: string | symbol | undefined,
+  extraInfo: any
+) {
+  if (__DEV__ && runner.onTrigger) {
+    runner.onTrigger(
+      Object.assign(
+        {
+          runner,
+          target,
+          key,
+          type
+        },
+        extraInfo
+      )
+    )
+  }
+  if (runner.scheduler !== void 0) {
+    runner.scheduler(runner)
+  } else {
+    runner()
+  }
+}
diff --git a/packages/observer/src/baseHandlers.ts b/packages/observer/src/baseHandlers.ts
new file mode 100644 (file)
index 0000000..15240ac
--- /dev/null
@@ -0,0 +1,120 @@
+import { observable, immutable, unwrap } from './index'
+import { OperationTypes } from './operations'
+import { track, trigger } from './autorun'
+import { LOCKED } from './lock'
+
+const hasOwnProperty = Object.prototype.hasOwnProperty
+
+const builtInSymbols = new Set(
+  Object.getOwnPropertyNames(Symbol)
+    .map(key => (Symbol as any)[key])
+    .filter(value => typeof value === 'symbol')
+)
+
+function get(
+  target: any,
+  key: string | symbol,
+  receiver: any,
+  toObsevable: (t: any) => any
+) {
+  const res = Reflect.get(target, key, receiver)
+  if (typeof key === 'symbol' && builtInSymbols.has(key)) {
+    return res
+  }
+  track(target, OperationTypes.GET, key)
+  return res !== null && typeof res === 'object' ? toObsevable(res) : res
+}
+
+function set(
+  target: any,
+  key: string | symbol,
+  value: any,
+  receiver: any
+): boolean {
+  value = unwrap(value)
+  const hadKey = hasOwnProperty.call(target, key)
+  const oldValue = target[key]
+  const result = Reflect.set(target, key, value, receiver)
+  // don't trigger if target is something up in the prototype chain of original
+  if (target === unwrap(receiver)) {
+    if (__DEV__) {
+      const extraInfo = { oldValue, newValue: value }
+      if (!hadKey) {
+        trigger(target, OperationTypes.ADD, key, extraInfo)
+      } else if (value !== oldValue) {
+        trigger(target, OperationTypes.SET, key, extraInfo)
+      }
+    } else {
+      if (!hadKey) {
+        trigger(target, OperationTypes.ADD, key)
+      } else if (value !== oldValue) {
+        trigger(target, OperationTypes.SET, key)
+      }
+    }
+  }
+  return result
+}
+
+function deleteProperty(target: any, key: string | symbol): boolean {
+  const hadKey = hasOwnProperty.call(target, key)
+  const oldValue = target[key]
+  const result = Reflect.deleteProperty(target, key)
+  if (hadKey) {
+    if (__DEV__) {
+      trigger(target, OperationTypes.DELETE, key, { oldValue })
+    } else {
+      trigger(target, OperationTypes.DELETE, key)
+    }
+  }
+  return result
+}
+
+function has(target: any, key: string | symbol): boolean {
+  const result = Reflect.has(target, key)
+  track(target, OperationTypes.HAS, key)
+  return result
+}
+
+function ownKeys(target: any): (string | number | symbol)[] {
+  track(target, OperationTypes.ITERATE)
+  return Reflect.ownKeys(target)
+}
+
+export const mutableHandlers: ProxyHandler<any> = {
+  get: (target: any, key: string | symbol, receiver: any) =>
+    get(target, key, receiver, observable),
+  set,
+  deleteProperty,
+  has,
+  ownKeys
+}
+
+export const immutableHandlers: ProxyHandler<any> = {
+  get: (target: any, key: string | symbol, receiver: any) =>
+    get(target, key, receiver, LOCKED ? immutable : observable),
+
+  set(target: any, key: string | symbol, value: any, receiver: any): boolean {
+    if (LOCKED) {
+      if (__DEV__) {
+        console.warn(`Set operation failed: target is immutable.`, target)
+      }
+      return true
+    } else {
+      return set(target, key, value, receiver)
+    }
+  },
+
+  deleteProperty(target: any, key: string | symbol): boolean {
+    if (LOCKED) {
+      if (__DEV__) {
+        console.warn(`Delete operation failed: target is immutable.`, target)
+      }
+      return true
+    } else {
+      return deleteProperty(target, key)
+    }
+  },
+
+  has,
+  ownKeys
+}
diff --git a/packages/observer/src/collectionHandlers.ts b/packages/observer/src/collectionHandlers.ts
new file mode 100644 (file)
index 0000000..859677e
--- /dev/null
@@ -0,0 +1,161 @@
+import { unwrap } from './index'
+import { track, trigger } from './autorun'
+import { OperationTypes } from './operations'
+
+function instrument(
+  target: any,
+  key: string | symbol,
+  args: any[],
+  type: OperationTypes
+) {
+  target = unwrap(target)
+  const proto: any = Reflect.getPrototypeOf(target)
+  track(target, type)
+  return proto[key].apply(target, args)
+}
+
+function get(key: string | symbol) {
+  return instrument(this, key, [key], OperationTypes.GET)
+}
+
+function has(key: string | symbol): boolean {
+  return instrument(this, key, [key], OperationTypes.HAS)
+}
+
+function size(target: any) {
+  target = unwrap(target)
+  const proto = Reflect.getPrototypeOf(target)
+  track(target, OperationTypes.ITERATE)
+  return Reflect.get(proto, 'size', target)
+}
+
+function makeWarning(type: OperationTypes) {
+  return function() {
+    if (__DEV__) {
+      console.warn(
+        `${type} operation failed: target is immutable.`,
+        unwrap(this)
+      )
+    }
+  }
+}
+
+const mutableInstrumentations: any = {
+  get,
+  has,
+
+  get size() {
+    return size(this)
+  },
+
+  add(key: any) {
+    const target = unwrap(this)
+    const proto: any = Reflect.getPrototypeOf(this)
+    const hadKey = proto.has.call(target, key)
+    const result = proto.add.apply(target, arguments)
+    if (!hadKey) {
+      if (__DEV__) {
+        trigger(target, OperationTypes.ADD, key, { value: key })
+      } else {
+        trigger(target, OperationTypes.ADD, key)
+      }
+    }
+    return result
+  },
+
+  set(key: any, value: any) {
+    const target = unwrap(this)
+    const proto: any = Reflect.getPrototypeOf(this)
+    const hadKey = proto.has.call(target, key)
+    const oldValue = proto.get.call(target, key)
+    const result = proto.set.apply(target, arguments)
+    if (__DEV__) {
+      const extraInfo = { oldValue, newValue: value }
+      if (!hadKey) {
+        trigger(target, OperationTypes.ADD, key, extraInfo)
+      } else {
+        trigger(target, OperationTypes.SET, key, extraInfo)
+      }
+    } else {
+      if (!hadKey) {
+        trigger(target, OperationTypes.ADD, key)
+      } else {
+        trigger(target, OperationTypes.SET, key)
+      }
+    }
+    return result
+  },
+
+  delete(key: any) {
+    const target = unwrap(this)
+    const proto: any = Reflect.getPrototypeOf(this)
+    const hadKey = proto.has.call(target, key)
+    const oldValue = proto.get ? proto.get.call(target, key) : undefined
+    // forward the operation before queueing reactions
+    const result = proto.delete.apply(target, arguments)
+    if (hadKey) {
+      if (__DEV__) {
+        trigger(target, OperationTypes.DELETE, key, { oldValue })
+      } else {
+        trigger(target, OperationTypes.DELETE, key)
+      }
+    }
+    return result
+  },
+
+  clear() {
+    const target = unwrap(this)
+    const proto: any = Reflect.getPrototypeOf(this)
+    const hadItems = target.size !== 0
+    const oldTarget = target instanceof Map ? new Map(target) : new Set(target)
+    // forward the operation before queueing reactions
+    const result = proto.clear.apply(target, arguments)
+    if (hadItems) {
+      if (__DEV__) {
+        trigger(target, OperationTypes.CLEAR, void 0, { oldTarget })
+      } else {
+        trigger(target, OperationTypes.CLEAR)
+      }
+    }
+    return result
+  }
+}
+
+const immutableInstrumentations: any = {
+  get,
+  has,
+  get size() {
+    return size(this)
+  },
+  add: makeWarning(OperationTypes.ADD),
+  set: makeWarning(OperationTypes.SET),
+  delete: makeWarning(OperationTypes.DELETE),
+  clear: makeWarning(OperationTypes.CLEAR)
+}
+;['forEach', 'keys', 'values', 'entries', Symbol.iterator].forEach(key => {
+  mutableInstrumentations[key] = immutableInstrumentations[key] = function(
+    ...args: any[]
+  ) {
+    return instrument(this, key, args, OperationTypes.ITERATE)
+  }
+})
+
+function getInstrumented(
+  target: any,
+  key: string | symbol,
+  receiver: any,
+  instrumentations: any
+) {
+  target = instrumentations.hasOwnProperty(key) ? instrumentations : target
+  return Reflect.get(target, key, receiver)
+}
+
+export const mutableCollectionHandlers: ProxyHandler<any> = {
+  get: (target: any, key: string | symbol, receiver: any) =>
+    getInstrumented(target, key, receiver, mutableInstrumentations)
+}
+
+export const immutableCollectionHandlers: ProxyHandler<any> = {
+  get: (target: any, key: string | symbol, receiver: any) =>
+    getInstrumented(target, key, receiver, immutableInstrumentations)
+}
diff --git a/packages/observer/src/computed.ts b/packages/observer/src/computed.ts
new file mode 100644 (file)
index 0000000..01a4f7e
--- /dev/null
@@ -0,0 +1,44 @@
+import { autorun, stop } from './index'
+import { Autorun, activeAutorunStack } from './autorun'
+
+export interface ComputedGetter {
+  (): any
+  stop: () => void
+}
+
+export function computed(getter: Function, context?: any): ComputedGetter {
+  let dirty: boolean = true
+  let value: any = undefined
+  const runner = autorun(() => getter.call(context, context), {
+    lazy: true,
+    scheduler: () => {
+      dirty = true
+    }
+  })
+  const computedGetter = (() => {
+    if (dirty) {
+      value = runner()
+      dirty = false
+    }
+    // When computed autoruns are accessed in a parent autorun, the parent
+    // should track all the dependencies the computed property has tracked.
+    // This should also apply for chained computed properties.
+    trackChildRun(runner)
+    return value
+  }) as ComputedGetter
+  computedGetter.stop = () => stop(runner)
+  return computedGetter
+}
+
+function trackChildRun(childRunner: Autorun) {
+  const parentRunner = activeAutorunStack[activeAutorunStack.length - 1]
+  if (parentRunner) {
+    for (let i = 0; i < childRunner.deps.length; i++) {
+      const dep = childRunner.deps[i]
+      if (!dep.has(parentRunner)) {
+        dep.add(parentRunner)
+        parentRunner.deps.push(dep)
+      }
+    }
+  }
+}
diff --git a/packages/observer/src/index.ts b/packages/observer/src/index.ts
new file mode 100644 (file)
index 0000000..1aa0c1d
--- /dev/null
@@ -0,0 +1,152 @@
+import { mutableHandlers, immutableHandlers } from './baseHandlers'
+
+import {
+  mutableCollectionHandlers,
+  immutableCollectionHandlers
+} from './collectionHandlers'
+
+import {
+  targetMap,
+  observedToRaw,
+  rawToObserved,
+  immutableToRaw,
+  rawToImmutable,
+  immutableValues,
+  nonReactiveValues
+} from './state'
+
+import {
+  createAutorun,
+  cleanup,
+  Autorun,
+  AutorunOptions,
+  DebuggerEvent
+} from './autorun'
+
+export { Autorun, DebuggerEvent }
+export { computed, ComputedGetter } from './computed'
+export { lock, unlock } from './lock'
+
+const EMPTY_OBJ = {}
+const collectionTypes: Set<any> = new Set([Set, Map, WeakMap, WeakSet])
+const observableValueRE = /^\[object (?:Object|Array|Map|Set|WeakMap|WeakSet)\]$/
+
+const canObserve = (value: any): boolean => {
+  return (
+    !value._isVue &&
+    !value._isVNode &&
+    observableValueRE.test(Object.prototype.toString.call(value)) &&
+    !nonReactiveValues.has(value)
+  )
+}
+
+type identity = <T>(target: T) => T
+
+export const observable = ((target: any = {}): any => {
+  // if trying to observe an immutable proxy, return the immutable version.
+  if (immutableToRaw.has(target)) {
+    return target
+  }
+  // target is explicitly marked as immutable by user
+  if (immutableValues.has(target)) {
+    return immutable(target)
+  }
+  return createObservable(
+    target,
+    rawToObserved,
+    observedToRaw,
+    mutableHandlers,
+    mutableCollectionHandlers
+  )
+}) as identity
+
+export const immutable = ((target: any = {}): any => {
+  // value is a mutable observable, retrive its original and return
+  // a readonly version.
+  if (observedToRaw.has(target)) {
+    target = observedToRaw.get(target)
+  }
+  return createObservable(
+    target,
+    rawToImmutable,
+    immutableToRaw,
+    immutableHandlers,
+    immutableCollectionHandlers
+  )
+}) as identity
+
+function createObservable(
+  target: any,
+  toProxy: WeakMap<any, any>,
+  toRaw: WeakMap<any, any>,
+  baseHandlers: ProxyHandler<any>,
+  collectionHandlers: ProxyHandler<any>
+) {
+  if ((__DEV__ && target === null) || typeof target !== 'object') {
+    throw new Error(`value is not observable: ${String(target)}`)
+  }
+  // target already has corresponding Proxy
+  let observed = toProxy.get(target)
+  if (observed !== void 0) {
+    return observed
+  }
+  // target is already a Proxy
+  if (toRaw.has(target)) {
+    return target
+  }
+  // only a whitelist of value types can be observed.
+  if (!canObserve(target)) {
+    return target
+  }
+  const handlers = collectionTypes.has(target.constructor)
+    ? collectionHandlers
+    : baseHandlers
+  observed = new Proxy(target, handlers)
+  toProxy.set(target, observed)
+  toRaw.set(observed, target)
+  targetMap.set(target, new Map())
+  return observed
+}
+
+export function autorun(
+  fn: Function,
+  options: AutorunOptions = EMPTY_OBJ
+): Autorun {
+  if ((fn as Autorun).isAutorun) {
+    fn = (fn as Autorun).raw
+  }
+  const runner = createAutorun(fn, options)
+  if (!options.lazy) {
+    runner()
+  }
+  return runner
+}
+
+export function stop(runner: Autorun) {
+  if (runner.active) {
+    cleanup(runner)
+    runner.active = false
+  }
+}
+
+export function isObservable(value: any): boolean {
+  return observedToRaw.has(value) || immutableToRaw.has(value)
+}
+
+export function isImmutable(value: any): boolean {
+  return immutableToRaw.has(value)
+}
+
+export function unwrap<T>(observed: T): T {
+  return observedToRaw.get(observed) || immutableToRaw.get(observed) || observed
+}
+
+export function markImmutable<T>(value: T): T {
+  immutableValues.add(value)
+  return value
+}
+
+export function markNonReactive<T>(value: T): T {
+  nonReactiveValues.add(value)
+  return value
+}
diff --git a/packages/observer/src/lock.ts b/packages/observer/src/lock.ts
new file mode 100644 (file)
index 0000000..417526b
--- /dev/null
@@ -0,0 +1,10 @@
+// global immutability lock
+export let LOCKED = true
+
+export function lock() {
+  LOCKED = true
+}
+
+export function unlock() {
+  LOCKED = false
+}
diff --git a/packages/observer/src/operations.ts b/packages/observer/src/operations.ts
new file mode 100644 (file)
index 0000000..9f6ac52
--- /dev/null
@@ -0,0 +1,11 @@
+export const enum OperationTypes {
+  // using literal strings instead of numbers so that it's easier to inspect
+  // debugger events
+  SET = 'set',
+  ADD = 'add',
+  DELETE = 'delete',
+  CLEAR = 'clear',
+  GET = 'get',
+  HAS = 'has',
+  ITERATE = 'iterate'
+}
diff --git a/packages/observer/src/state.ts b/packages/observer/src/state.ts
new file mode 100644 (file)
index 0000000..9efbe37
--- /dev/null
@@ -0,0 +1,20 @@
+import { Autorun } from './autorun'
+
+// The main WeakMap that stores {target -> key -> dep} connections.
+// Conceptually, it's easier to think of a dependency as a Dep class
+// which maintains a Set of subscribers, but we simply store them as
+// raw Sets to reduce memory overhead.
+export type Dep = Set<Autorun>
+export type KeyToDepMap = Map<string | symbol, Dep>
+export const targetMap: WeakMap<any, KeyToDepMap> = new WeakMap()
+
+// WeakMaps that store {raw <-> observed} pairs.
+export const rawToObserved: WeakMap<any, any> = new WeakMap()
+export const observedToRaw: WeakMap<any, any> = new WeakMap()
+export const rawToImmutable: WeakMap<any, any> = new WeakMap()
+export const immutableToRaw: WeakMap<any, any> = new WeakMap()
+
+// WeakSets for values that are marked immutable or non-reactive during
+// observable creation.
+export const immutableValues: WeakSet<any> = new WeakSet()
+export const nonReactiveValues: WeakSet<any> = new WeakSet()
diff --git a/packages/runtime-dom/.npmignore b/packages/runtime-dom/.npmignore
new file mode 100644 (file)
index 0000000..aa5ee62
--- /dev/null
@@ -0,0 +1,3 @@
+__tests__/
+__mocks__/
+dist/packages
diff --git a/packages/runtime-dom/README.md b/packages/runtime-dom/README.md
new file mode 100644 (file)
index 0000000..e351b74
--- /dev/null
@@ -0,0 +1,21 @@
+# @vue/runtime-dom
+
+``` js
+import { h, render, Component } from '@vue/runtime-dom'
+
+class App extends Component {
+  data () {
+    return {
+      msg: 'Hello World!'
+    }
+  }
+  render () {
+    return h('div', this.msg)
+  }
+}
+
+render(
+  h(App),
+  document.getElementById('app')
+)
+```
diff --git a/packages/runtime-dom/index.js b/packages/runtime-dom/index.js
new file mode 100644 (file)
index 0000000..cdc29b2
--- /dev/null
@@ -0,0 +1,7 @@
+'use strict'
+
+if (process.env.NODE_ENV === 'production') {
+  module.exports = require('./dist/runtime-dom.cjs.prod.js')
+} else {
+  module.exports = require('./dist/runtime-dom.cjs.js')
+}
diff --git a/packages/runtime-dom/package.json b/packages/runtime-dom/package.json
new file mode 100644 (file)
index 0000000..4277265
--- /dev/null
@@ -0,0 +1,30 @@
+{
+  "name": "@vue/runtime-dom",
+  "version": "3.0.0-alpha.1",
+  "description": "@vue/runtime-dom",
+  "main": "index.js",
+  "module": "dist/runtime-dom.esm.js",
+  "typings": "dist/index.d.ts",
+  "unpkg": "dist/runtime-dom.umd.js",
+  "buildOptions": {
+    "name": "Vue",
+    "formats": ["esm", "cjs", "umd", "esm-browser"]
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/vuejs/vue.git"
+  },
+  "keywords": [
+    "vue"
+  ],
+  "author": "Evan You",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/vuejs/vue/issues"
+  },
+  "homepage": "https://github.com/vuejs/vue/tree/dev/packages/runtime-dom#readme",
+  "dependencies": {
+    "@vue/core": "3.0.0-alpha.1",
+    "@vue/scheduler": "3.0.0-alpha.1"
+  }
+}
diff --git a/packages/runtime-dom/src/index.ts b/packages/runtime-dom/src/index.ts
new file mode 100644 (file)
index 0000000..cef0a3e
--- /dev/null
@@ -0,0 +1,39 @@
+import {
+  h,
+  cloneVNode,
+  createPortal,
+  Component,
+  createRenderer
+} from '@vue/core'
+
+import { queueJob, nextTick } from '@vue/scheduler'
+
+import { nodeOps } from './nodeOps'
+import { patchData } from './patchData'
+import { teardownVNode } from './teardownVNode'
+
+const { render } = createRenderer({
+  queueJob,
+  nodeOps,
+  patchData,
+  teardownVNode
+})
+
+// important: inline the definition for nextTick
+const publicNextTick = nextTick as (fn: Function) => Promise<void>
+
+export { h, cloneVNode, createPortal, Component, render, publicNextTick as nextTick }
+
+// also expose observer API
+export {
+  autorun,
+  stop,
+  observable,
+  immutable,
+  computed,
+  isObservable,
+  isImmutable,
+  markImmutable,
+  markNonReactive,
+  unwrap
+} from '@vue/core'
diff --git a/packages/runtime-dom/src/modules/attrs.ts b/packages/runtime-dom/src/modules/attrs.ts
new file mode 100644 (file)
index 0000000..d32f660
--- /dev/null
@@ -0,0 +1,31 @@
+export function patchAttr(
+  el: Element,
+  key: string,
+  value: any,
+  isSVG: boolean
+) {
+  // isSVG short-circuits isXlink check
+  if (isSVG && isXlink(key)) {
+    if (value == null) {
+      el.removeAttributeNS(xlinkNS, getXlinkProp(key))
+    } else {
+      el.setAttributeNS(xlinkNS, key, value)
+    }
+  } else {
+    if (value == null) {
+      el.removeAttribute(key)
+    } else {
+      el.setAttribute(key, value)
+    }
+  }
+}
+
+const xlinkNS = 'http://www.w3.org/1999/xlink'
+
+function isXlink(name: string): boolean {
+  return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink'
+}
+
+function getXlinkProp(name: string): string {
+  return isXlink(name) ? name.slice(6, name.length) : ''
+}
diff --git a/packages/runtime-dom/src/modules/class.ts b/packages/runtime-dom/src/modules/class.ts
new file mode 100644 (file)
index 0000000..f953d46
--- /dev/null
@@ -0,0 +1,29 @@
+// compiler should normlaize class + :class bindings on the same element
+// into a single binding ['staticClass', dynamic]
+
+export function patchClass(el: Element, value: any, isSVG: boolean) {
+  // directly setting className should be faster than setAttribute in theory
+  if (isSVG) {
+    el.setAttribute('class', normalizeClass(value))
+  } else {
+    el.className = normalizeClass(value)
+  }
+}
+
+function normalizeClass(value: any): string {
+  let res = ''
+  if (typeof value === 'string') {
+    res = value
+  } else if (Array.isArray(value)) {
+    for (let i = 0; i < value.length; i++) {
+      res += normalizeClass(value[i]) + ' '
+    }
+  } else if (typeof value === 'object') {
+    for (const name in value) {
+      if (value[name]) {
+        res += name + ' '
+      }
+    }
+  }
+  return res.trim()
+}
diff --git a/packages/runtime-dom/src/modules/events.ts b/packages/runtime-dom/src/modules/events.ts
new file mode 100644 (file)
index 0000000..452ff00
--- /dev/null
@@ -0,0 +1,142 @@
+const delegateRE = /^(?:click|dblclick|submit|(?:key|mouse|touch).*)$/
+
+type EventValue = Function | Function[]
+type TargetRef = { el: Element | Document }
+
+export function patchEvent(
+  el: Element,
+  name: string,
+  prevValue: EventValue | null,
+  nextValue: EventValue | null
+) {
+  if (delegateRE.test(name)) {
+    handleDelegatedEvent(el, name, nextValue)
+  } else {
+    handleNormalEvent(el, name, prevValue, nextValue)
+  }
+}
+
+const eventCounts: Record<string, number> = {}
+const attachedGlobalHandlers: Record<string, Function> = {}
+
+export function handleDelegatedEvent(
+  el: any,
+  name: string,
+  value: EventValue | null
+) {
+  const count = eventCounts[name]
+  let store = el.__events
+  if (value) {
+    if (!count) {
+      attachGlobalHandler(name)
+    }
+    if (!store) {
+      store = el.__events = {}
+    }
+    if (!store[name]) {
+      eventCounts[name]++
+    }
+    store[name] = value
+  } else if (store && store[name]) {
+    eventCounts[name]--
+    store[name] = null
+    if (count === 1) {
+      removeGlobalHandler(name)
+    }
+  }
+}
+
+function attachGlobalHandler(name: string) {
+  const handler = (attachedGlobalHandlers[name] = (e: Event) => {
+    const { type } = e
+    const isClick = type === 'click' || type === 'dblclick'
+    if (isClick && (e as MouseEvent).button !== 0) {
+      e.stopPropagation()
+      return false
+    }
+    e.stopPropagation = stopPropagation
+    const targetRef: TargetRef = { el: document }
+    Object.defineProperty(e, 'currentTarget', {
+      configurable: true,
+      get() {
+        return targetRef.el
+      }
+    })
+    dispatchEvent(e, name, isClick, targetRef)
+  })
+  document.addEventListener(name, handler)
+  eventCounts[name] = 0
+}
+
+function stopPropagation() {
+  this.cancelBubble = true
+  if (!this.immediatePropagationStopped) {
+    this.stopImmediatePropagation()
+  }
+}
+
+function dispatchEvent(
+  e: Event,
+  name: string,
+  isClick: boolean,
+  targetRef: TargetRef
+) {
+  let el = e.target as any
+  while (el != null) {
+    // Don't process clicks on disabled elements
+    if (isClick && el.disabled) {
+      break
+    }
+    const store = el.__events
+    if (store) {
+      const value = store[name]
+      if (value) {
+        targetRef.el = el
+        invokeEvents(e, value)
+        if (e.cancelBubble) {
+          break
+        }
+      }
+    }
+    el = el.parentNode
+  }
+}
+
+function invokeEvents(e: Event, value: EventValue) {
+  if (Array.isArray(value)) {
+    for (let i = 0; i < value.length; i++) {
+      value[i](e)
+    }
+  } else {
+    value(e)
+  }
+}
+
+function removeGlobalHandler(name: string) {
+  document.removeEventListener(name, attachedGlobalHandlers[name] as any)
+  eventCounts[name] = 0
+}
+
+function handleNormalEvent(el: Element, name: string, prev: any, next: any) {
+  const invoker = prev && prev.invoker
+  if (next) {
+    if (invoker) {
+      prev.invoker = null
+      invoker.value = next
+      next.invoker = invoker
+    } else {
+      el.addEventListener(name, createInvoker(next))
+    }
+  } else if (invoker) {
+    el.removeEventListener(name, invoker)
+  }
+}
+
+function createInvoker(value: any) {
+  const invoker = ((e: Event) => {
+    invokeEvents(e, invoker.value)
+  }) as any
+  invoker.value = value
+  value.invoker = invoker
+  return invoker
+}
diff --git a/packages/runtime-dom/src/modules/props.ts b/packages/runtime-dom/src/modules/props.ts
new file mode 100644 (file)
index 0000000..f2e6bd7
--- /dev/null
@@ -0,0 +1,18 @@
+import { VNode, ChildrenFlags } from '@vue/core'
+
+export function patchDOMProp(
+  el: any,
+  key: string,
+  value: any,
+  prevVNode: VNode,
+  unmountChildren: any
+) {
+  if (key === 'innerHTML' || key === 'textContent') {
+    if (prevVNode && prevVNode.children) {
+      unmountChildren(prevVNode.children, prevVNode.childFlags)
+      prevVNode.children = null
+      prevVNode.childFlags = ChildrenFlags.NO_CHILDREN
+    }
+  }
+  el[key] = value
+}
diff --git a/packages/runtime-dom/src/modules/style.ts b/packages/runtime-dom/src/modules/style.ts
new file mode 100644 (file)
index 0000000..1652949
--- /dev/null
@@ -0,0 +1,54 @@
+import { isObservable } from '@vue/core'
+
+// style properties that should NOT have "px" added when numeric
+const nonNumericRE = /acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i
+
+export function patchStyle(el: any, prev: any, next: any, data: any) {
+  // If next is observed, the user is likely to mutate the style object.
+  // We need to normalize + clone it and replace data.style with the clone.
+  if (isObservable(next)) {
+    data.style = normalizeStyle(next)
+  }
+
+  const { style } = el
+  if (!next) {
+    el.removeAttribute('style')
+  } else if (typeof next === 'string') {
+    style.cssText = next
+  } else {
+    // TODO: warn invalid value in dev
+    next = normalizeStyle(next)
+    for (const key in next) {
+      let value = next[key]
+      if (typeof value === 'number' && !nonNumericRE.test(key)) {
+        value = value + 'px'
+      }
+      style.setProperty(key, value)
+    }
+    if (prev && typeof prev !== 'string') {
+      prev = normalizeStyle(prev)
+      for (const key in prev) {
+        if (!next[key]) {
+          style.setProperty(key, '')
+        }
+      }
+    }
+  }
+}
+
+function normalizeStyle(value: any): Record<string, string | number> | void {
+  if (value && typeof value === 'object') {
+    return value
+  } else if (Array.isArray(value)) {
+    const res: Record<string, string | number> = {}
+    for (let i = 0; i < value.length; i++) {
+      const normalized = normalizeStyle(value[i])
+      if (normalized) {
+        for (const key in normalized) {
+          res[key] = normalized[key]
+        }
+      }
+    }
+    return res
+  }
+}
diff --git a/packages/runtime-dom/src/nodeOps.ts b/packages/runtime-dom/src/nodeOps.ts
new file mode 100644 (file)
index 0000000..df17fcd
--- /dev/null
@@ -0,0 +1,39 @@
+const svgNS = 'http://www.w3.org/2000/svg'
+
+export const nodeOps = {
+  createElement: (tag: string, isSVG?: boolean): Element =>
+    isSVG ? document.createElementNS(svgNS, tag) : document.createElement(tag),
+
+  createText: (text: string): Text => document.createTextNode(text),
+
+  setText: (node: Text, text: string) => {
+    node.nodeValue = text
+  },
+
+  appendChild: (parent: Node, child: Node) => {
+    parent.appendChild(child)
+  },
+
+  insertBefore: (parent: Node, child: Node, ref: Node) => {
+    parent.insertBefore(child, ref)
+  },
+
+  replaceChild: (parent: Node, oldChild: Node, newChild: Node) => {
+    parent.replaceChild(newChild, oldChild)
+  },
+
+  removeChild: (parent: Node, child: Node) => {
+    parent.removeChild(child)
+  },
+
+  clearContent: (node: Node) => {
+    node.textContent = ''
+  },
+
+  parentNode: (node: Node): Node | null => node.parentNode,
+
+  nextSibling: (node: Node): Node | null => node.nextSibling,
+
+  querySelector: (selector: string): Node | null =>
+    document.querySelector(selector)
+}
diff --git a/packages/runtime-dom/src/patchData.ts b/packages/runtime-dom/src/patchData.ts
new file mode 100644 (file)
index 0000000..884d5c4
--- /dev/null
@@ -0,0 +1,42 @@
+import { VNode } from '@vue/core'
+import { patchClass } from './modules/class'
+import { patchStyle } from './modules/style'
+import { patchAttr } from './modules/attrs'
+import { patchDOMProp } from './modules/props'
+import { patchEvent } from './modules/events'
+
+export function patchData(
+  el: Element,
+  key: string,
+  prevValue: any,
+  nextValue: any,
+  prevVNode: VNode,
+  nextVNode: VNode,
+  isSVG: boolean,
+  unmountChildren: any
+) {
+  switch (key) {
+    // special
+    case 'class':
+      patchClass(el, nextValue, isSVG)
+      break
+    case 'style':
+      patchStyle(el, prevValue, nextValue, nextVNode.data)
+      break
+    default:
+      if (key.startsWith('on')) {
+        patchEvent(el, key.toLowerCase().slice(2), prevValue, nextValue)
+      } else if (key.startsWith('domProps')) {
+        patchDOMProp(
+          el,
+          key[8].toLowerCase() + key.slice(9),
+          nextValue,
+          prevVNode,
+          unmountChildren
+        )
+      } else {
+        patchAttr(el, key, nextValue, isSVG)
+      }
+      break
+  }
+}
diff --git a/packages/runtime-dom/src/teardownVNode.ts b/packages/runtime-dom/src/teardownVNode.ts
new file mode 100644 (file)
index 0000000..e1302c5
--- /dev/null
@@ -0,0 +1,13 @@
+import { VNode } from '@vue/core'
+import { handleDelegatedEvent } from './modules/events'
+
+export function teardownVNode(vnode: VNode) {
+  const { el, data } = vnode
+  if (data != null) {
+    for (const key in data) {
+      if (key.startsWith('on')) {
+        handleDelegatedEvent(el, key.toLowerCase().slice(2), null)
+      }
+    }
+  }
+}
diff --git a/packages/scheduler/.npmignore b/packages/scheduler/.npmignore
new file mode 100644 (file)
index 0000000..bb5c8a5
--- /dev/null
@@ -0,0 +1,3 @@
+__tests__/
+__mocks__/
+dist/packages
\ No newline at end of file
diff --git a/packages/scheduler/README.md b/packages/scheduler/README.md
new file mode 100644 (file)
index 0000000..826934e
--- /dev/null
@@ -0,0 +1,3 @@
+# @vue/scheduler
+
+> This package is published only for typing and building custom renderers. It is NOT meant to be used in applications.
diff --git a/packages/scheduler/index.js b/packages/scheduler/index.js
new file mode 100644 (file)
index 0000000..9a0883b
--- /dev/null
@@ -0,0 +1,7 @@
+'use strict'
+
+if (process.env.NODE_ENV === 'production') {
+  module.exports = require('./dist/scheduler.cjs.prod.js')
+} else {
+  module.exports = require('./dist/scheduler.cjs.js')
+}
diff --git a/packages/scheduler/package.json b/packages/scheduler/package.json
new file mode 100644 (file)
index 0000000..b65d87c
--- /dev/null
@@ -0,0 +1,21 @@
+{
+  "name": "@vue/scheduler",
+  "version": "3.0.0-alpha.1",
+  "description": "@vue/scheduler",
+  "main": "index.js",
+  "module": "dist/scheduler.esm.js",
+  "typings": "dist/index.d.ts",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/vuejs/vue.git"
+  },
+  "keywords": [
+    "vue"
+  ],
+  "author": "Evan You",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/vuejs/vue/issues"
+  },
+  "homepage": "https://github.com/vuejs/vue/tree/dev/packages/scheduler#readme"
+}
diff --git a/packages/scheduler/src/index.ts b/packages/scheduler/src/index.ts
new file mode 100644 (file)
index 0000000..31f5229
--- /dev/null
@@ -0,0 +1,40 @@
+const queue: Array<() => void> = []
+const postFlushCbs: Array<() => void> = []
+const p = Promise.resolve()
+let flushing = false
+
+export function nextTick(fn: () => void) {
+  p.then(fn)
+}
+
+export function queueJob(job: () => void, postFlushCb?: () => void) {
+  if (queue.indexOf(job) === -1) {
+    if (flushing) {
+      job()
+    } else {
+      queue.push(job)
+    }
+  }
+  if (postFlushCb) {
+    queuePostFlushCb(postFlushCb)
+  }
+  if (!flushing) {
+    nextTick(flushJobs)
+  }
+}
+
+export function queuePostFlushCb(cb: () => void) {
+  postFlushCbs.push(cb)
+}
+
+export function flushJobs() {
+  flushing = true
+  let job
+  while ((job = queue.shift())) {
+    job()
+  }
+  while ((job = postFlushCbs.shift())) {
+    job()
+  }
+  flushing = false
+}
diff --git a/rollup.config.js b/rollup.config.js
new file mode 100644 (file)
index 0000000..320edf5
--- /dev/null
@@ -0,0 +1,147 @@
+const fs = require('fs')
+const path = require('path')
+const ts = require('rollup-plugin-typescript2')
+const replace = require('rollup-plugin-replace')
+const alias = require('rollup-plugin-alias')
+
+if (!process.env.TARGET) {
+  throw new Error('TARGET package must be specified via --environment flag.')
+}
+
+const packagesDir = path.resolve(__dirname, 'packages')
+const packageDir = path.resolve(packagesDir, process.env.TARGET)
+const name = path.basename(packageDir)
+const resolve = p => path.resolve(packageDir, p)
+const pkg = require(resolve(`package.json`))
+const packageOptions = pkg.buildOptions || {}
+
+// build aliases dynamically
+const aliasOptions = { resolve: ['.ts'] }
+fs.readdirSync(packagesDir).forEach(dir => {
+  if (fs.statSync(path.resolve(packagesDir, dir)).isDirectory()) {
+    aliasOptions[`@vue/${dir}`] = path.resolve(packagesDir, `${dir}/src/index`)
+  }
+})
+const aliasPlugin = alias(aliasOptions)
+
+// ensure TS checks only once for each build
+let hasTSChecked = false
+
+const configs = {
+  esm: {
+    file: resolve(`dist/${name}.esm.js`),
+    format: `es`
+  },
+  cjs: {
+    file: resolve(`dist/${name}.cjs.js`),
+    format: `cjs`
+  },
+  umd: {
+    file: resolve(`dist/${name}.umd.js`),
+    format: `umd`
+  },
+  'esm-browser': {
+    file: resolve(`dist/${name}.esm-browser.js`),
+    format: `es`
+  }
+}
+
+const defaultFormats = ['esm', 'cjs']
+const inlineFromats = process.env.FORMATS && process.env.FORMATS.split(',')
+const packageFormats = inlineFromats || packageOptions.formats || defaultFormats
+const packageConfigs = packageFormats.map(format => createConfig(configs[format]))
+
+if (process.env.NODE_ENV === 'production') {
+  packageFormats.forEach(format => {
+    if (format === 'cjs') {
+      packageConfigs.push(createProductionConfig(format))
+    }
+    if (format === 'umd' || format === 'esm-browser') {
+      packageConfigs.push(createMinifiedConfig(format))
+    }
+  })
+}
+
+module.exports = packageConfigs
+
+function createConfig(output, plugins = []) {
+  const isProductionBuild = /\.prod\.js$/.test(output.file)
+  const isUMDBuild = /\.umd(\.prod)?\.js$/.test(output.file)
+  const isBunlderESMBuild = /\.esm\.js$/.test(output.file)
+  const isBrowserESMBuild = /esm-browser(\.prod)?\.js$/.test(output.file)
+
+  if (isUMDBuild) {
+    output.name = packageOptions.name
+  }
+
+  const tsPlugin = ts({
+    check: process.env.NODE_ENV === 'production' && !hasTSChecked,
+    tsconfig: path.resolve(__dirname, 'tsconfig.json'),
+    cacheRoot: path.resolve(__dirname, 'node_modules/.rts2_cache'),
+    tsconfigOverride: {
+      compilerOptions: {
+        declaration: process.env.NODE_ENV === 'production' && !hasTSChecked
+      }
+    }
+  })
+  // we only need to check TS and generate declarations once for each build.
+  // it also seems to run into weird issues when checking multiple times
+  // during a single build.
+  hasTSChecked = true
+
+  return {
+    input: resolve(`src/index.ts`),
+    // UMD and Browser ESM builds inlines everything so that they can be
+    // used alone.
+    external: isUMDBuild || isBrowserESMBuild
+      ? []
+      : Object.keys(aliasOptions),
+    plugins: [
+      tsPlugin,
+      aliasPlugin,
+      createReplacePlugin(isProductionBuild, isBunlderESMBuild),
+      ...plugins
+    ],
+    output,
+    onwarn: (msg, warn) => {
+      if (!/Circular/.test(msg)) {
+        warn(msg)
+      }
+    }
+  }
+}
+
+function createReplacePlugin(isProduction, isBunlderESMBuild) {
+  return replace({
+    __DEV__: isBunlderESMBuild
+      // preserve to be handled by bundlers
+      ? `process.env.NODE_ENV !== 'production'`
+      // hard coded dev/prod builds
+      : !isProduction,
+    // compatibility builds
+    __COMPAT__: !!process.env.COMPAT
+  })
+}
+
+function createProductionConfig(format) {
+  return createConfig({
+    file: resolve(`dist/${name}.${format}.prod.js`),
+    format: /^esm/.test(format) ? 'es' : format
+  })
+}
+
+function createMinifiedConfig(format) {
+  const { terser } = require('rollup-plugin-terser')
+  const isESM = /^esm/.test(format)
+  return createConfig(
+    {
+      file: resolve(`dist/${name}.${format}.prod.js`),
+      format: isESM ? 'es' : format
+    },
+    [
+      terser({
+        module: isESM
+      })
+    ]
+  )
+}
diff --git a/scripts/bootstrap.js b/scripts/bootstrap.js
new file mode 100644 (file)
index 0000000..21098b3
--- /dev/null
@@ -0,0 +1,75 @@
+// create package.json, README, etc. for packages that don't have them yet
+
+const args = require('minimist')(process.argv.slice(2))
+const fs = require('fs')
+const path = require('path')
+const baseVersion = require('../lerna.json').version
+
+const packagesDir = path.resolve(__dirname, '../packages')
+const files = fs.readdirSync(packagesDir)
+
+files.forEach(shortName => {
+  if (!fs.statSync(path.join(packagesDir, shortName)).isDirectory()) {
+    return
+  }
+
+  const name = shortName === `vue` ? shortName : `@vue/${shortName}`
+  const pkgPath = path.join(packagesDir, shortName, `package.json`)
+  if (args.force || !fs.existsSync(pkgPath)) {
+    const json = {
+      name,
+      version: baseVersion,
+      description: name,
+      main: 'index.js',
+      module: `dist/${shortName}.esm.js`,
+      typings: 'dist/index.d.ts',
+      repository: {
+        type: 'git',
+        url: 'git+https://github.com/vuejs/vue.git'
+      },
+      keywords: ['vue'],
+      author: 'Evan You',
+      license: 'MIT',
+      bugs: {
+        url: 'https://github.com/vuejs/vue/issues'
+      },
+      homepage: `https://github.com/vuejs/vue/tree/dev/packages/${shortName}#readme`
+    }
+    fs.writeFileSync(pkgPath, JSON.stringify(json, null, 2))
+  }
+
+  const readmePath = path.join(packagesDir, shortName, `README.md`)
+  if (args.force || !fs.existsSync(readmePath)) {
+    fs.writeFileSync(readmePath, `# ${name}`)
+  }
+
+  const npmIgnorePath = path.join(packagesDir, shortName, `.npmignore`)
+  if (args.force || !fs.existsSync(npmIgnorePath)) {
+    fs.writeFileSync(npmIgnorePath, `__tests__/\n__mocks__/\ndist/packages`)
+  }
+
+  const srcDir = path.join(packagesDir, shortName, `src`)
+  const indexPath = path.join(packagesDir, shortName, `src/index.ts`)
+  if (args.force || !fs.existsSync(indexPath)) {
+    if (!fs.existsSync(srcDir)) {
+      fs.mkdirSync(srcDir)
+    }
+    fs.writeFileSync(indexPath, ``)
+  }
+
+  const nodeIndexPath = path.join(packagesDir, shortName, 'index.js')
+  if (args.force || !fs.existsSync(nodeIndexPath)) {
+    fs.writeFileSync(
+      nodeIndexPath,
+      `
+'use strict'
+
+if (process.env.NODE_ENV === 'production') {
+  module.exports = require('./dist/${shortName}.cjs.prod.js')
+} else {
+  module.exports = require('./dist/${shortName}.cjs.js')
+}
+    `.trim() + '\n'
+    )
+  }
+})
diff --git a/scripts/build.js b/scripts/build.js
new file mode 100644 (file)
index 0000000..98c9739
--- /dev/null
@@ -0,0 +1,70 @@
+const fs = require('fs-extra')
+const path = require('path')
+const zlib = require('zlib')
+const chalk = require('chalk')
+const execa = require('execa')
+const dts = require('dts-bundle')
+const { targets, fuzzyMatchTarget } = require('./utils')
+
+const target = process.argv[2]
+
+;(async () => {
+  if (!target) {
+    await buildAll(targets)
+    checkAllSizes(targets)
+  } else {
+    await buildAll(fuzzyMatchTarget(target))
+    checkAllSizes(fuzzyMatchTarget(target))
+  }
+})()
+
+async function buildAll (targets) {
+  for (const target of targets) {
+    await build(target)
+  }
+}
+
+async function build (target) {
+  const pkgDir = path.resolve(`packages/${target}`)
+
+  await fs.remove(`${pkgDir}/dist`)
+
+  await execa('rollup', [
+    '-c',
+    '--environment',
+    `NODE_ENV:production,TARGET:${target}`
+  ], { stdio: 'inherit' })
+
+  const dtsOptions = {
+    name: target === 'vue' ? target : `@vue/${target}`,
+    main: `${pkgDir}/dist/packages/${target}/src/index.d.ts`,
+    out: `${pkgDir}/dist/index.d.ts`
+  }
+  dts.bundle(dtsOptions)
+  console.log()
+  console.log(chalk.blue(chalk.bold(`generated typings at ${dtsOptions.out}`)))
+
+  await fs.remove(`${pkgDir}/dist/packages`)
+}
+
+function checkAllSizes (targets) {
+  console.log()
+  for (const target of targets) {
+    checkSize(target)
+  }
+  console.log()
+}
+
+function checkSize (target) {
+  const pkgDir = path.resolve(`packages/${target}`)
+  const esmProdBuild = `${pkgDir}/dist/${target}.esm-browser.prod.js`
+  if (fs.existsSync(esmProdBuild)) {
+    const file = fs.readFileSync(esmProdBuild)
+    const minSize = (file.length / 1024).toFixed(2) + 'kb'
+    const gzipped = zlib.gzipSync(file)
+    const gzipSize = (gzipped.length / 1024).toFixed(2) + 'kb'
+    console.log(`${
+      chalk.gray(chalk.bold(target))
+    } min:${minSize} / gzip:${gzipSize}`)
+  }
+}
diff --git a/scripts/dev.js b/scripts/dev.js
new file mode 100644 (file)
index 0000000..7f71703
--- /dev/null
@@ -0,0 +1,25 @@
+// Run Rollup in watch mode for a single package for development.
+// Only the ES modules format will be generated, as it is expected to be tested
+// in a modern browser using <script type="module">.
+// Defaults to watch the `vue` meta package.
+// To specific the package to watch, simply pass its name. e.g.
+// ```
+// yarn dev observer
+// ```
+
+const execa = require('execa')
+const { targets, fuzzyMatchTarget } = require('./utils')
+
+const target = fuzzyMatchTarget(process.argv[2] || 'runtime-dom')
+
+execa(
+  'rollup',
+  [
+    '-wc',
+    '--environment',
+    `TARGET:${target},FORMATS:umd`
+  ],
+  {
+    stdio: 'inherit'
+  }
+)
diff --git a/scripts/utils.js b/scripts/utils.js
new file mode 100644 (file)
index 0000000..aa1ca3d
--- /dev/null
@@ -0,0 +1,19 @@
+const fs = require('fs')
+
+const targets = exports.targets = fs.readdirSync('packages').filter(f => {
+  return fs.statSync(`packages/${f}`).isDirectory()
+})
+
+exports.fuzzyMatchTarget = partialTarget => {
+  const matched = []
+  for (const target of targets) {
+    if (target.match(partialTarget)) {
+      matched.push(target)
+    }
+  }
+  if (matched.length) {
+    return matched
+  } else {
+    throw new Error(`Target ${partialTarget} not found!`)
+  }
+}
diff --git a/scripts/verifyCommit.js b/scripts/verifyCommit.js
new file mode 100644 (file)
index 0000000..4741c06
--- /dev/null
@@ -0,0 +1,32 @@
+// Invoked on the commit-msg git hook by yorkie.
+
+const chalk = require('chalk')
+const msgPath = process.env.GIT_PARAMS
+const msg = require('fs')
+  .readFileSync(msgPath, 'utf-8')
+  .trim()
+
+const commitRE = /^(revert: )?(feat|fix|docs|style|refactor|perf|test|workflow|ci|chore|types)(\(.+\))?: .{1,50}/
+
+if (!commitRE.test(msg)) {
+  console.log()
+  console.error(
+    `  ${chalk.bgRed.white(' ERROR ')} ${chalk.red(
+      `invalid commit message format.`
+    )}\n\n` +
+      chalk.red(
+        `  Proper commit message format is required for automated changelog generation. Examples:\n\n`
+      ) +
+      `    ${chalk.green(`feat(compiler): add 'comments' option`)}\n` +
+      `    ${chalk.green(
+        `fix(v-model): handle events on blur (close #28)`
+      )}\n\n` +
+      chalk.red(`  See .github/COMMIT_CONVENTION.md for more details.\n`) +
+      chalk.red(
+        `  You can also use ${chalk.cyan(
+          `npm run commit`
+        )} to interactively generate a commit message.\n`
+      )
+  )
+  process.exit(1)
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644 (file)
index 0000000..cc1cedf
--- /dev/null
@@ -0,0 +1,31 @@
+{
+  "compilerOptions": {
+    "baseUrl": ".",
+    "outDir": "dist",
+    "sourceMap": false,
+    "target": "esnext",
+    "module": "esnext",
+    "moduleResolution": "node",
+    // "declaration": true,
+    "allowJs": false,
+    "noUnusedLocals": true,
+    "strictNullChecks": true,
+    "noImplicitAny": true,
+    "experimentalDecorators": true,
+    "removeComments": false,
+    "lib": [
+      "esnext",
+      "dom"
+    ],
+    "rootDir": ".",
+    "paths": {
+      "@vue/core": ["packages/core/src"],
+      "@vue/observer": ["packages/observer/src"],
+      "@vue/scheduler": ["packages/scheduler/src"]
+    }
+  },
+  "include": [
+    "packages/global.d.ts",
+    "packages/*/src"
+  ]
+}
diff --git a/yarn.lock b/yarn.lock
new file mode 100644 (file)
index 0000000..b5a927a
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,4042 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0":
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8"
+  dependencies:
+    "@babel/highlight" "^7.0.0"
+
+"@babel/highlight@^7.0.0":
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4"
+  dependencies:
+    chalk "^2.0.0"
+    esutils "^2.0.2"
+    js-tokens "^4.0.0"
+
+"@lerna/add@^3.3.2":
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.3.2.tgz#767a879ecb117be06414e7e76d4d93bb9934fa57"
+  dependencies:
+    "@lerna/bootstrap" "^3.3.2"
+    "@lerna/command" "^3.3.0"
+    "@lerna/filter-options" "^3.3.2"
+    "@lerna/npm-conf" "^3.0.0"
+    "@lerna/validation-error" "^3.0.0"
+    dedent "^0.7.0"
+    npm-package-arg "^6.0.0"
+    p-map "^1.2.0"
+    pacote "^9.1.0"
+    semver "^5.5.0"
+
+"@lerna/batch-packages@^3.1.2":
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/@lerna/batch-packages/-/batch-packages-3.1.2.tgz#74b5312a01a8916204cbc71237ffbe93144b99df"
+  dependencies:
+    "@lerna/package-graph" "^3.1.2"
+    "@lerna/validation-error" "^3.0.0"
+    npmlog "^4.1.2"
+
+"@lerna/bootstrap@^3.3.2":
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-3.3.2.tgz#01e894295dea89dcc0c62ee188f49f78873e08c9"
+  dependencies:
+    "@lerna/batch-packages" "^3.1.2"
+    "@lerna/command" "^3.3.0"
+    "@lerna/filter-options" "^3.3.2"
+    "@lerna/has-npm-version" "^3.3.0"
+    "@lerna/npm-conf" "^3.0.0"
+    "@lerna/npm-install" "^3.3.0"
+    "@lerna/rimraf-dir" "^3.3.0"
+    "@lerna/run-lifecycle" "^3.3.1"
+    "@lerna/run-parallel-batches" "^3.0.0"
+    "@lerna/symlink-binary" "^3.3.0"
+    "@lerna/symlink-dependencies" "^3.3.0"
+    "@lerna/validation-error" "^3.0.0"
+    dedent "^0.7.0"
+    get-port "^3.2.0"
+    multimatch "^2.1.0"
+    npm-package-arg "^6.0.0"
+    npmlog "^4.1.2"
+    p-finally "^1.0.0"
+    p-map "^1.2.0"
+    p-map-series "^1.0.0"
+    p-waterfall "^1.0.0"
+    read-package-tree "^5.1.6"
+    semver "^5.5.0"
+
+"@lerna/changed@^3.3.2":
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-3.3.2.tgz#679c9fd353a82d00e2a27847c79f061d5abdea67"
+  dependencies:
+    "@lerna/collect-updates" "^3.3.2"
+    "@lerna/command" "^3.3.0"
+    "@lerna/listable" "^3.0.0"
+    "@lerna/output" "^3.0.0"
+    "@lerna/version" "^3.3.2"
+
+"@lerna/check-working-tree@^3.3.0":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/@lerna/check-working-tree/-/check-working-tree-3.3.0.tgz#2118f301f28ccb530812e5b27a341b1e6b3c84e2"
+  dependencies:
+    "@lerna/describe-ref" "^3.3.0"
+    "@lerna/validation-error" "^3.0.0"
+
+"@lerna/child-process@^3.3.0":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-3.3.0.tgz#71184a763105b6c8ece27f43f166498d90fe680f"
+  dependencies:
+    chalk "^2.3.1"
+    execa "^1.0.0"
+    strong-log-transformer "^2.0.0"
+
+"@lerna/clean@^3.3.2":
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-3.3.2.tgz#9a7e8a1e400e580de260fa124945b2939a025069"
+  dependencies:
+    "@lerna/command" "^3.3.0"
+    "@lerna/filter-options" "^3.3.2"
+    "@lerna/prompt" "^3.3.1"
+    "@lerna/rimraf-dir" "^3.3.0"
+    p-map "^1.2.0"
+    p-map-series "^1.0.0"
+    p-waterfall "^1.0.0"
+
+"@lerna/cli@^3.2.0":
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-3.2.0.tgz#3ed25bcbc0b8f0878bc6a102ee0296f01476cfdf"
+  dependencies:
+    "@lerna/global-options" "^3.1.3"
+    dedent "^0.7.0"
+    npmlog "^4.1.2"
+    yargs "^12.0.1"
+
+"@lerna/collect-updates@^3.3.2":
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/@lerna/collect-updates/-/collect-updates-3.3.2.tgz#54df5ce59ca05e8aa04ff8a9299f89cc253a9304"
+  dependencies:
+    "@lerna/child-process" "^3.3.0"
+    "@lerna/describe-ref" "^3.3.0"
+    minimatch "^3.0.4"
+    npmlog "^4.1.2"
+    slash "^1.0.0"
+
+"@lerna/command@^3.3.0":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/@lerna/command/-/command-3.3.0.tgz#e81c4716a676b02dbe9d3f548d5f45b4ba32c25a"
+  dependencies:
+    "@lerna/child-process" "^3.3.0"
+    "@lerna/package-graph" "^3.1.2"
+    "@lerna/project" "^3.0.0"
+    "@lerna/validation-error" "^3.0.0"
+    "@lerna/write-log-file" "^3.0.0"
+    dedent "^0.7.0"
+    execa "^1.0.0"
+    is-ci "^1.0.10"
+    lodash "^4.17.5"
+    npmlog "^4.1.2"
+
+"@lerna/conventional-commits@^3.3.0":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-3.3.0.tgz#68302b6ca58b3ab7e91807664deeda2eac025ab0"
+  dependencies:
+    "@lerna/validation-error" "^3.0.0"
+    conventional-changelog-angular "^1.6.6"
+    conventional-changelog-core "^2.0.5"
+    conventional-recommended-bump "^2.0.6"
+    dedent "^0.7.0"
+    fs-extra "^7.0.0"
+    get-stream "^4.0.0"
+    npm-package-arg "^6.0.0"
+    npmlog "^4.1.2"
+    semver "^5.5.0"
+
+"@lerna/create-symlink@^3.3.0":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/@lerna/create-symlink/-/create-symlink-3.3.0.tgz#91de00fd576018ba4251f0c6a5b4b7f768f22a82"
+  dependencies:
+    cmd-shim "^2.0.2"
+    fs-extra "^7.0.0"
+    npmlog "^4.1.2"
+
+"@lerna/create@^3.3.1":
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/@lerna/create/-/create-3.3.1.tgz#cfd7e0cb30d1f45133691165e103d26318d90ebf"
+  dependencies:
+    "@lerna/child-process" "^3.3.0"
+    "@lerna/command" "^3.3.0"
+    "@lerna/npm-conf" "^3.0.0"
+    "@lerna/validation-error" "^3.0.0"
+    camelcase "^4.1.0"
+    dedent "^0.7.0"
+    fs-extra "^7.0.0"
+    globby "^8.0.1"
+    init-package-json "^1.10.3"
+    npm-package-arg "^6.0.0"
+    pify "^3.0.0"
+    semver "^5.5.0"
+    slash "^1.0.0"
+    validate-npm-package-license "^3.0.3"
+    validate-npm-package-name "^3.0.0"
+    whatwg-url "^7.0.0"
+
+"@lerna/describe-ref@^3.3.0":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/@lerna/describe-ref/-/describe-ref-3.3.0.tgz#d373adb530d5428ab91e303ccbfcf51a98374a3a"
+  dependencies:
+    "@lerna/child-process" "^3.3.0"
+    npmlog "^4.1.2"
+
+"@lerna/diff@^3.3.0":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-3.3.0.tgz#c8130a5f508b47fad5fec81404498bc3acdf9cb5"
+  dependencies:
+    "@lerna/child-process" "^3.3.0"
+    "@lerna/command" "^3.3.0"
+    "@lerna/validation-error" "^3.0.0"
+    npmlog "^4.1.2"
+
+"@lerna/exec@^3.3.2":
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-3.3.2.tgz#95ecaca617fd85abdb91e9a378ed06ec1763d665"
+  dependencies:
+    "@lerna/batch-packages" "^3.1.2"
+    "@lerna/child-process" "^3.3.0"
+    "@lerna/command" "^3.3.0"
+    "@lerna/filter-options" "^3.3.2"
+    "@lerna/run-parallel-batches" "^3.0.0"
+    "@lerna/validation-error" "^3.0.0"
+
+"@lerna/filter-options@^3.3.2":
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-3.3.2.tgz#ac90702b7876ff4980dcdeaeac049c433dd01773"
+  dependencies:
+    "@lerna/collect-updates" "^3.3.2"
+    "@lerna/filter-packages" "^3.0.0"
+    dedent "^0.7.0"
+
+"@lerna/filter-packages@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/@lerna/filter-packages/-/filter-packages-3.0.0.tgz#5eb25ad1610f3e2ab845133d1f8d7d40314e838f"
+  dependencies:
+    "@lerna/validation-error" "^3.0.0"
+    multimatch "^2.1.0"
+    npmlog "^4.1.2"
+
+"@lerna/get-npm-exec-opts@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-3.0.0.tgz#8fc7866e8d8e9a2f2dc385287ba32eb44de8bdeb"
+  dependencies:
+    npmlog "^4.1.2"
+
+"@lerna/global-options@^3.1.3":
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/@lerna/global-options/-/global-options-3.1.3.tgz#cf85e24655a91d04d4efc9a80c1f83fc768d08ae"
+
+"@lerna/has-npm-version@^3.3.0":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/@lerna/has-npm-version/-/has-npm-version-3.3.0.tgz#8a73c2c437a0e1e68a19ccbd0dd3c014d4d39135"
+  dependencies:
+    "@lerna/child-process" "^3.3.0"
+    semver "^5.5.0"
+
+"@lerna/import@^3.3.1":
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/@lerna/import/-/import-3.3.1.tgz#deca8c93c9cc03c5844b975c6da9937dd7530440"
+  dependencies:
+    "@lerna/child-process" "^3.3.0"
+    "@lerna/command" "^3.3.0"
+    "@lerna/prompt" "^3.3.1"
+    "@lerna/validation-error" "^3.0.0"
+    dedent "^0.7.0"
+    fs-extra "^7.0.0"
+    p-map-series "^1.0.0"
+
+"@lerna/init@^3.3.0":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/@lerna/init/-/init-3.3.0.tgz#998f3497da3d891867c593b808b6db4b8fc4ccb9"
+  dependencies:
+    "@lerna/child-process" "^3.3.0"
+    "@lerna/command" "^3.3.0"
+    fs-extra "^7.0.0"
+    p-map "^1.2.0"
+    write-json-file "^2.3.0"
+
+"@lerna/link@^3.3.0":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/@lerna/link/-/link-3.3.0.tgz#c0c05ff52d0f0c659fcf221627edfcd58e477a5c"
+  dependencies:
+    "@lerna/command" "^3.3.0"
+    "@lerna/package-graph" "^3.1.2"
+    "@lerna/symlink-dependencies" "^3.3.0"
+    p-map "^1.2.0"
+    slash "^1.0.0"
+
+"@lerna/list@^3.3.2":
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/@lerna/list/-/list-3.3.2.tgz#1412b3cce2a83b1baa4ff6fb962d50b46c28ec98"
+  dependencies:
+    "@lerna/command" "^3.3.0"
+    "@lerna/filter-options" "^3.3.2"
+    "@lerna/listable" "^3.0.0"
+    "@lerna/output" "^3.0.0"
+
+"@lerna/listable@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-3.0.0.tgz#27209b1382c87abdbc964220e75c247d803d4199"
+  dependencies:
+    chalk "^2.3.1"
+    columnify "^1.5.4"
+
+"@lerna/log-packed@^3.0.4":
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/@lerna/log-packed/-/log-packed-3.0.4.tgz#6d1f6ce5ca68b9971f2a27f0ecf3c50684be174a"
+  dependencies:
+    byte-size "^4.0.3"
+    columnify "^1.5.4"
+    has-unicode "^2.0.1"
+    npmlog "^4.1.2"
+
+"@lerna/npm-conf@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-3.0.0.tgz#7a4b8304a0ecd1e366208f656bd3d7f4dcb3b5e7"
+  dependencies:
+    config-chain "^1.1.11"
+    pify "^3.0.0"
+
+"@lerna/npm-dist-tag@^3.3.0":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-3.3.0.tgz#e1c5ab67674216d901266a16846b21cc81ff6afd"
+  dependencies:
+    "@lerna/child-process" "^3.3.0"
+    "@lerna/get-npm-exec-opts" "^3.0.0"
+    npmlog "^4.1.2"
+
+"@lerna/npm-install@^3.3.0":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/@lerna/npm-install/-/npm-install-3.3.0.tgz#16d00ffd668d11b2386b3ac68bdac2cf8320e533"
+  dependencies:
+    "@lerna/child-process" "^3.3.0"
+    "@lerna/get-npm-exec-opts" "^3.0.0"
+    fs-extra "^7.0.0"
+    npm-package-arg "^6.0.0"
+    npmlog "^4.1.2"
+    signal-exit "^3.0.2"
+    write-pkg "^3.1.0"
+
+"@lerna/npm-publish@^3.3.1":
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-3.3.1.tgz#30384665d7ee387343332ece62ca231207bbabea"
+  dependencies:
+    "@lerna/child-process" "^3.3.0"
+    "@lerna/get-npm-exec-opts" "^3.0.0"
+    "@lerna/has-npm-version" "^3.3.0"
+    "@lerna/log-packed" "^3.0.4"
+    fs-extra "^7.0.0"
+    npmlog "^4.1.2"
+    p-map "^1.2.0"
+
+"@lerna/npm-run-script@^3.3.0":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/@lerna/npm-run-script/-/npm-run-script-3.3.0.tgz#3c79601c27c67121155b20e039be53130217db72"
+  dependencies:
+    "@lerna/child-process" "^3.3.0"
+    "@lerna/get-npm-exec-opts" "^3.0.0"
+    npmlog "^4.1.2"
+
+"@lerna/output@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/@lerna/output/-/output-3.0.0.tgz#4ed4a30ed2f311046b714b3840a090990ba3ce35"
+  dependencies:
+    npmlog "^4.1.2"
+
+"@lerna/package-graph@^3.1.2":
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-3.1.2.tgz#b70298a3a8c82e12090da33233bf242223a38f20"
+  dependencies:
+    "@lerna/validation-error" "^3.0.0"
+    npm-package-arg "^6.0.0"
+    semver "^5.5.0"
+
+"@lerna/package@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/@lerna/package/-/package-3.0.0.tgz#14afc9a6cb1f7f7b23c1d7c7aa81bdac7d44c0e5"
+  dependencies:
+    npm-package-arg "^6.0.0"
+    write-pkg "^3.1.0"
+
+"@lerna/project@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/@lerna/project/-/project-3.0.0.tgz#4320d2a2b4080cabcf95161d9c48475217d8a545"
+  dependencies:
+    "@lerna/package" "^3.0.0"
+    "@lerna/validation-error" "^3.0.0"
+    cosmiconfig "^5.0.2"
+    dedent "^0.7.0"
+    dot-prop "^4.2.0"
+    glob-parent "^3.1.0"
+    globby "^8.0.1"
+    load-json-file "^4.0.0"
+    npmlog "^4.1.2"
+    p-map "^1.2.0"
+    resolve-from "^4.0.0"
+    write-json-file "^2.3.0"
+
+"@lerna/prompt@^3.3.1":
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-3.3.1.tgz#ec53f9034a7a02a671627241682947f65078ab88"
+  dependencies:
+    inquirer "^6.2.0"
+    npmlog "^4.1.2"
+
+"@lerna/publish@^3.4.0":
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-3.4.0.tgz#d2665f7b16eb3b2b8962c47fcf31fe901ff9a288"
+  dependencies:
+    "@lerna/batch-packages" "^3.1.2"
+    "@lerna/check-working-tree" "^3.3.0"
+    "@lerna/child-process" "^3.3.0"
+    "@lerna/collect-updates" "^3.3.2"
+    "@lerna/command" "^3.3.0"
+    "@lerna/describe-ref" "^3.3.0"
+    "@lerna/get-npm-exec-opts" "^3.0.0"
+    "@lerna/npm-conf" "^3.0.0"
+    "@lerna/npm-dist-tag" "^3.3.0"
+    "@lerna/npm-publish" "^3.3.1"
+    "@lerna/output" "^3.0.0"
+    "@lerna/prompt" "^3.3.1"
+    "@lerna/run-lifecycle" "^3.3.1"
+    "@lerna/run-parallel-batches" "^3.0.0"
+    "@lerna/validation-error" "^3.0.0"
+    "@lerna/version" "^3.3.2"
+    fs-extra "^7.0.0"
+    libnpmaccess "^3.0.0"
+    npm-package-arg "^6.0.0"
+    npm-registry-fetch "^3.8.0"
+    npmlog "^4.1.2"
+    p-finally "^1.0.0"
+    p-map "^1.2.0"
+    p-pipe "^1.2.0"
+    p-reduce "^1.0.0"
+    semver "^5.5.0"
+
+"@lerna/resolve-symlink@^3.3.0":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/@lerna/resolve-symlink/-/resolve-symlink-3.3.0.tgz#c5d99a60cb17e2ea90b3521a0ba445478d194a44"
+  dependencies:
+    fs-extra "^7.0.0"
+    npmlog "^4.1.2"
+    read-cmd-shim "^1.0.1"
+
+"@lerna/rimraf-dir@^3.3.0":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/@lerna/rimraf-dir/-/rimraf-dir-3.3.0.tgz#687e9bb3668a9e540e281302a52d9a573860f5db"
+  dependencies:
+    "@lerna/child-process" "^3.3.0"
+    npmlog "^4.1.2"
+    path-exists "^3.0.0"
+    rimraf "^2.6.2"
+
+"@lerna/run-lifecycle@^3.3.1":
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-3.3.1.tgz#13a03f353aab6c1639bf8953f58f0c45585785ac"
+  dependencies:
+    "@lerna/npm-conf" "^3.0.0"
+    npm-lifecycle "^2.0.0"
+    npmlog "^4.1.2"
+
+"@lerna/run-parallel-batches@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/@lerna/run-parallel-batches/-/run-parallel-batches-3.0.0.tgz#468704934084c74991d3124d80607857d4dfa840"
+  dependencies:
+    p-map "^1.2.0"
+    p-map-series "^1.0.0"
+
+"@lerna/run@^3.3.2":
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/@lerna/run/-/run-3.3.2.tgz#f521f4a22585c90758f34a584cb1871f8bb2a83e"
+  dependencies:
+    "@lerna/batch-packages" "^3.1.2"
+    "@lerna/command" "^3.3.0"
+    "@lerna/filter-options" "^3.3.2"
+    "@lerna/npm-run-script" "^3.3.0"
+    "@lerna/output" "^3.0.0"
+    "@lerna/run-parallel-batches" "^3.0.0"
+    "@lerna/validation-error" "^3.0.0"
+    p-map "^1.2.0"
+
+"@lerna/symlink-binary@^3.3.0":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/@lerna/symlink-binary/-/symlink-binary-3.3.0.tgz#99ea570b21baabd61ecab27582eeb1d7b2c5f9cf"
+  dependencies:
+    "@lerna/create-symlink" "^3.3.0"
+    "@lerna/package" "^3.0.0"
+    fs-extra "^7.0.0"
+    p-map "^1.2.0"
+    read-pkg "^3.0.0"
+
+"@lerna/symlink-dependencies@^3.3.0":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/@lerna/symlink-dependencies/-/symlink-dependencies-3.3.0.tgz#13bcaed3e37986ab01b13498a459c7f609397dc3"
+  dependencies:
+    "@lerna/create-symlink" "^3.3.0"
+    "@lerna/resolve-symlink" "^3.3.0"
+    "@lerna/symlink-binary" "^3.3.0"
+    fs-extra "^7.0.0"
+    p-finally "^1.0.0"
+    p-map "^1.2.0"
+    p-map-series "^1.0.0"
+
+"@lerna/validation-error@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/@lerna/validation-error/-/validation-error-3.0.0.tgz#a27e90051c3ba71995e2a800a43d94ad04b3e3f4"
+  dependencies:
+    npmlog "^4.1.2"
+
+"@lerna/version@^3.3.2":
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/@lerna/version/-/version-3.3.2.tgz#b1f4be43f61edf97428efca09dddc47ffd769bb4"
+  dependencies:
+    "@lerna/batch-packages" "^3.1.2"
+    "@lerna/check-working-tree" "^3.3.0"
+    "@lerna/child-process" "^3.3.0"
+    "@lerna/collect-updates" "^3.3.2"
+    "@lerna/command" "^3.3.0"
+    "@lerna/conventional-commits" "^3.3.0"
+    "@lerna/output" "^3.0.0"
+    "@lerna/prompt" "^3.3.1"
+    "@lerna/run-lifecycle" "^3.3.1"
+    "@lerna/validation-error" "^3.0.0"
+    chalk "^2.3.1"
+    dedent "^0.7.0"
+    minimatch "^3.0.4"
+    npmlog "^4.1.2"
+    p-map "^1.2.0"
+    p-pipe "^1.2.0"
+    p-reduce "^1.0.0"
+    p-waterfall "^1.0.0"
+    semver "^5.5.0"
+    slash "^1.0.0"
+    temp-write "^3.4.0"
+
+"@lerna/write-log-file@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/@lerna/write-log-file/-/write-log-file-3.0.0.tgz#2f95fee80c6821fe1ee6ccf8173d2b4079debbd2"
+  dependencies:
+    npmlog "^4.1.2"
+    write-file-atomic "^2.3.0"
+
+"@mrmlnc/readdir-enhanced@^2.2.1":
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
+  dependencies:
+    call-me-maybe "^1.0.1"
+    glob-to-regexp "^0.3.0"
+
+"@nodelib/fs.stat@^1.0.1":
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.2.tgz#54c5a964462be3d4d78af631363c18d6fa91ac26"
+
+"@types/detect-indent@0.1.30":
+  version "0.1.30"
+  resolved "https://registry.yarnpkg.com/@types/detect-indent/-/detect-indent-0.1.30.tgz#dc682bb412b4e65ba098e70edad73b4833fb910d"
+
+"@types/estree@0.0.39":
+  version "0.0.39"
+  resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
+
+"@types/glob@5.0.30":
+  version "5.0.30"
+  resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.30.tgz#1026409c5625a8689074602808d082b2867b8a51"
+  dependencies:
+    "@types/minimatch" "*"
+    "@types/node" "*"
+
+"@types/minimatch@*":
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
+
+"@types/mkdirp@0.3.29":
+  version "0.3.29"
+  resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.3.29.tgz#7f2ad7ec55f914482fc9b1ec4bb1ae6028d46066"
+
+"@types/node@*":
+  version "10.9.4"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.9.4.tgz#0f4cb2dc7c1de6096055357f70179043c33e9897"
+
+"@types/node@8.0.0":
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.0.tgz#acaa89247afddc7967e9902fd11761dadea1a555"
+
+JSONStream@^1.0.4, JSONStream@^1.3.4:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.4.tgz#615bb2adb0cd34c8f4c447b5f6512fa1d8f16a2e"
+  dependencies:
+    jsonparse "^1.2.0"
+    through ">=2.2.7 <3"
+
+abbrev@1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+agent-base@4, agent-base@^4.1.0, agent-base@~4.2.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
+  dependencies:
+    es6-promisify "^5.0.0"
+
+agentkeepalive@^3.4.1:
+  version "3.5.1"
+  resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.1.tgz#4eba75cf2ad258fc09efd506cdb8d8c2971d35a4"
+  dependencies:
+    humanize-ms "^1.2.1"
+
+ajv@^5.3.0:
+  version "5.5.2"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
+  dependencies:
+    co "^4.6.0"
+    fast-deep-equal "^1.0.0"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.3.0"
+
+ansi-escapes@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30"
+
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+  dependencies:
+    color-convert "^1.9.0"
+
+aproba@^1.0.3, aproba@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+aproba@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
+
+are-we-there-yet@~1.1.2:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+  dependencies:
+    delegates "^1.0.0"
+    readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+  dependencies:
+    sprintf-js "~1.0.2"
+
+arr-diff@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+  dependencies:
+    arr-flatten "^1.0.1"
+
+arr-diff@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.0.1, arr-flatten@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+arr-union@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
+array-differ@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
+
+array-find-index@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+
+array-ify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece"
+
+array-union@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+  dependencies:
+    array-uniq "^1.0.1"
+
+array-uniq@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+
+array-unique@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+array-unique@^0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
+arrify@^1.0.0, arrify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+asap@^2.0.0:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+
+asn1@~0.2.3:
+  version "0.2.4"
+  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+  dependencies:
+    safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assign-symbols@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
+async@^2.5.0:
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
+  dependencies:
+    lodash "^4.17.10"
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+atob@^2.1.1:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+
+aws-sign2@~0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+
+aws4@^1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
+
+balanced-match@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base@^0.11.1:
+  version "0.11.2"
+  resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+  dependencies:
+    cache-base "^1.0.1"
+    class-utils "^0.3.5"
+    component-emitter "^1.2.1"
+    define-property "^1.0.0"
+    isobject "^3.0.1"
+    mixin-deep "^1.2.0"
+    pascalcase "^0.1.1"
+
+bcrypt-pbkdf@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+  dependencies:
+    tweetnacl "^0.14.3"
+
+block-stream@*:
+  version "0.0.9"
+  resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+  dependencies:
+    inherits "~2.0.0"
+
+bluebird@^3.5.1:
+  version "3.5.2"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a"
+
+brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+braces@^1.8.2:
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+  dependencies:
+    expand-range "^1.8.1"
+    preserve "^0.2.0"
+    repeat-element "^1.1.2"
+
+braces@^2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+  dependencies:
+    arr-flatten "^1.1.0"
+    array-unique "^0.3.2"
+    extend-shallow "^2.0.1"
+    fill-range "^4.0.0"
+    isobject "^3.0.1"
+    repeat-element "^1.1.2"
+    snapdragon "^0.8.1"
+    snapdragon-node "^2.0.1"
+    split-string "^3.0.2"
+    to-regex "^3.0.1"
+
+buffer-from@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+
+builtin-modules@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtins@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
+
+byline@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1"
+
+byte-size@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-4.0.3.tgz#b7c095efc68eadf82985fccd9a2df43a74fa2ccd"
+
+cacache@^11.0.1, cacache@^11.0.2:
+  version "11.2.0"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.2.0.tgz#617bdc0b02844af56310e411c0878941d5739965"
+  dependencies:
+    bluebird "^3.5.1"
+    chownr "^1.0.1"
+    figgy-pudding "^3.1.0"
+    glob "^7.1.2"
+    graceful-fs "^4.1.11"
+    lru-cache "^4.1.3"
+    mississippi "^3.0.0"
+    mkdirp "^0.5.1"
+    move-concurrently "^1.0.1"
+    promise-inflight "^1.0.1"
+    rimraf "^2.6.2"
+    ssri "^6.0.0"
+    unique-filename "^1.1.0"
+    y18n "^4.0.0"
+
+cache-base@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+  dependencies:
+    collection-visit "^1.0.0"
+    component-emitter "^1.2.1"
+    get-value "^2.0.6"
+    has-value "^1.0.0"
+    isobject "^3.0.1"
+    set-value "^2.0.0"
+    to-object-path "^0.3.0"
+    union-value "^1.0.0"
+    unset-value "^1.0.0"
+
+call-me-maybe@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
+
+camelcase-keys@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+  dependencies:
+    camelcase "^2.0.0"
+    map-obj "^1.0.0"
+
+camelcase-keys@^4.0.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77"
+  dependencies:
+    camelcase "^4.1.0"
+    map-obj "^2.0.0"
+    quick-lru "^1.0.0"
+
+camelcase@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+
+camelcase@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+caseless@~0.12.0:
+  version "0.12.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+chalk@^2.0.0, chalk@^2.3.1, chalk@^2.4.1:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+  dependencies:
+    ansi-styles "^3.2.1"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.3.0"
+
+chardet@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
+
+chownr@^1.0.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
+
+ci-info@^1.5.0:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.5.1.tgz#17e8eb5de6f8b2b6038f0cbb714d410bfa9f3030"
+
+class-utils@^0.3.5:
+  version "0.3.6"
+  resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+  dependencies:
+    arr-union "^3.1.0"
+    define-property "^0.2.5"
+    isobject "^3.0.0"
+    static-extend "^0.1.1"
+
+cli-cursor@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+  dependencies:
+    restore-cursor "^2.0.0"
+
+cli-width@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
+
+cliui@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
+  dependencies:
+    string-width "^2.1.1"
+    strip-ansi "^4.0.0"
+    wrap-ansi "^2.0.0"
+
+clone@^1.0.2:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+
+cmd-shim@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb"
+  dependencies:
+    graceful-fs "^4.1.2"
+    mkdirp "~0.5.0"
+
+co@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+code-point-at@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+collection-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+  dependencies:
+    map-visit "^1.0.0"
+    object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+  version "1.9.3"
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+  dependencies:
+    color-name "1.1.3"
+
+color-name@1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+
+columnify@^1.5.4:
+  version "1.5.4"
+  resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb"
+  dependencies:
+    strip-ansi "^3.0.0"
+    wcwidth "^1.0.0"
+
+combined-stream@1.0.6:
+  version "1.0.6"
+  resolved "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
+  dependencies:
+    delayed-stream "~1.0.0"
+
+combined-stream@~1.0.6:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828"
+  dependencies:
+    delayed-stream "~1.0.0"
+
+commander@^2.9.0:
+  version "2.18.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970"
+
+commander@~2.17.1:
+  version "2.17.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
+
+compare-func@^1.3.1:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648"
+  dependencies:
+    array-ify "^1.0.0"
+    dot-prop "^3.0.0"
+
+component-emitter@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@^1.5.0, concat-stream@^1.6.0:
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+  dependencies:
+    buffer-from "^1.0.0"
+    inherits "^2.0.3"
+    readable-stream "^2.2.2"
+    typedarray "^0.0.6"
+
+config-chain@^1.1.11:
+  version "1.1.12"
+  resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa"
+  dependencies:
+    ini "^1.3.4"
+    proto-list "~1.2.1"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+conventional-changelog-angular@^1.6.6:
+  version "1.6.6"
+  resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz#b27f2b315c16d0a1f23eb181309d0e6a4698ea0f"
+  dependencies:
+    compare-func "^1.3.1"
+    q "^1.5.1"
+
+conventional-changelog-core@^2.0.5:
+  version "2.0.11"
+  resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-2.0.11.tgz#19b5fbd55a9697773ed6661f4e32030ed7e30287"
+  dependencies:
+    conventional-changelog-writer "^3.0.9"
+    conventional-commits-parser "^2.1.7"
+    dateformat "^3.0.0"
+    get-pkg-repo "^1.0.0"
+    git-raw-commits "^1.3.6"
+    git-remote-origin-url "^2.0.0"
+    git-semver-tags "^1.3.6"
+    lodash "^4.2.1"
+    normalize-package-data "^2.3.5"
+    q "^1.5.1"
+    read-pkg "^1.1.0"
+    read-pkg-up "^1.0.1"
+    through2 "^2.0.0"
+
+conventional-changelog-preset-loader@^1.1.8:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz#40bb0f142cd27d16839ec6c74ee8db418099b373"
+
+conventional-changelog-writer@^3.0.9:
+  version "3.0.9"
+  resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-3.0.9.tgz#4aecdfef33ff2a53bb0cf3b8071ce21f0e994634"
+  dependencies:
+    compare-func "^1.3.1"
+    conventional-commits-filter "^1.1.6"
+    dateformat "^3.0.0"
+    handlebars "^4.0.2"
+    json-stringify-safe "^5.0.1"
+    lodash "^4.2.1"
+    meow "^4.0.0"
+    semver "^5.5.0"
+    split "^1.0.0"
+    through2 "^2.0.0"
+
+conventional-commits-filter@^1.1.6:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz#4389cd8e58fe89750c0b5fb58f1d7f0cc8ad3831"
+  dependencies:
+    is-subset "^0.1.1"
+    modify-values "^1.0.0"
+
+conventional-commits-parser@^2.1.7:
+  version "2.1.7"
+  resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz#eca45ed6140d72ba9722ee4132674d639e644e8e"
+  dependencies:
+    JSONStream "^1.0.4"
+    is-text-path "^1.0.0"
+    lodash "^4.2.1"
+    meow "^4.0.0"
+    split2 "^2.0.0"
+    through2 "^2.0.0"
+    trim-off-newlines "^1.0.0"
+
+conventional-recommended-bump@^2.0.6:
+  version "2.0.9"
+  resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-2.0.9.tgz#7392421e7d0e3515f3df2040572a23cc73a68a93"
+  dependencies:
+    concat-stream "^1.6.0"
+    conventional-changelog-preset-loader "^1.1.8"
+    conventional-commits-filter "^1.1.6"
+    conventional-commits-parser "^2.1.7"
+    git-raw-commits "^1.3.6"
+    git-semver-tags "^1.3.6"
+    meow "^4.0.0"
+    q "^1.5.1"
+
+copy-concurrently@^1.0.0:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+  dependencies:
+    aproba "^1.1.1"
+    fs-write-stream-atomic "^1.0.8"
+    iferr "^0.1.5"
+    mkdirp "^0.5.1"
+    rimraf "^2.5.4"
+    run-queue "^1.0.0"
+
+copy-descriptor@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+cosmiconfig@^5.0.2:
+  version "5.0.6"
+  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.6.tgz#dca6cf680a0bd03589aff684700858c81abeeb39"
+  dependencies:
+    is-directory "^0.3.1"
+    js-yaml "^3.9.0"
+    parse-json "^4.0.0"
+
+cross-spawn@^6.0.0:
+  version "6.0.5"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+  dependencies:
+    nice-try "^1.0.4"
+    path-key "^2.0.1"
+    semver "^5.5.0"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+currently-unhandled@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+  dependencies:
+    array-find-index "^1.0.1"
+
+cyclist@~0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
+
+dargs@^4.0.1:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+dashdash@^1.12.0:
+  version "1.14.1"
+  resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+  dependencies:
+    assert-plus "^1.0.0"
+
+dateformat@^3.0.0:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
+
+debug@3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+  dependencies:
+    ms "2.0.0"
+
+debug@^2.2.0, debug@^2.3.3:
+  version "2.6.9"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+  dependencies:
+    ms "2.0.0"
+
+debug@^3.1.0:
+  version "3.2.5"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.5.tgz#c2418fbfd7a29f4d4f70ff4cea604d4b64c46407"
+  dependencies:
+    ms "^2.1.1"
+
+debuglog@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
+
+decamelize-keys@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
+  dependencies:
+    decamelize "^1.1.0"
+    map-obj "^1.0.0"
+
+decamelize@^1.1.0, decamelize@^1.1.2:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+decamelize@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7"
+  dependencies:
+    xregexp "4.0.0"
+
+decode-uri-component@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+
+dedent@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
+
+defaults@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
+  dependencies:
+    clone "^1.0.2"
+
+define-property@^0.2.5:
+  version "0.2.5"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+  dependencies:
+    is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+  dependencies:
+    is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+  dependencies:
+    is-descriptor "^1.0.2"
+    isobject "^3.0.1"
+
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+detect-indent@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-0.2.0.tgz#042914498979ac2d9f3c73e4ff3e6877d3bc92b6"
+  dependencies:
+    get-stdin "^0.1.0"
+    minimist "^0.1.0"
+
+detect-indent@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
+
+dezalgo@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456"
+  dependencies:
+    asap "^2.0.0"
+    wrappy "1"
+
+dir-glob@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034"
+  dependencies:
+    arrify "^1.0.1"
+    path-type "^3.0.0"
+
+dot-prop@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177"
+  dependencies:
+    is-obj "^1.0.0"
+
+dot-prop@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
+  dependencies:
+    is-obj "^1.0.0"
+
+dts-bundle@^0.7.3:
+  version "0.7.3"
+  resolved "https://registry.yarnpkg.com/dts-bundle/-/dts-bundle-0.7.3.tgz#372b7bb69c820782e6382f400739a69dced3d59a"
+  dependencies:
+    "@types/detect-indent" "0.1.30"
+    "@types/glob" "5.0.30"
+    "@types/mkdirp" "0.3.29"
+    "@types/node" "8.0.0"
+    commander "^2.9.0"
+    detect-indent "^0.2.0"
+    glob "^6.0.4"
+    mkdirp "^0.5.0"
+
+duplexer@^0.1.1:
+  version "0.1.1"
+  resolved "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
+
+duplexify@^3.4.2, duplexify@^3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410"
+  dependencies:
+    end-of-stream "^1.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+    stream-shift "^1.0.0"
+
+ecc-jsbn@~0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+  dependencies:
+    jsbn "~0.1.0"
+    safer-buffer "^2.1.0"
+
+encoding@^0.1.11:
+  version "0.1.12"
+  resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
+  dependencies:
+    iconv-lite "~0.4.13"
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
+  dependencies:
+    once "^1.4.0"
+
+err-code@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960"
+
+error-ex@^1.2.0, error-ex@^1.3.1:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+  dependencies:
+    is-arrayish "^0.2.1"
+
+es6-promise@^4.0.3:
+  version "4.2.5"
+  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054"
+
+es6-promisify@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
+  dependencies:
+    es6-promise "^4.0.3"
+
+escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+esprima@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+
+estree-walker@^0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39"
+
+esutils@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+execa@^0.10.0:
+  version "0.10.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50"
+  dependencies:
+    cross-spawn "^6.0.0"
+    get-stream "^3.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+execa@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
+  dependencies:
+    cross-spawn "^6.0.0"
+    get-stream "^4.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+expand-brackets@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+  dependencies:
+    is-posix-bracket "^0.1.0"
+
+expand-brackets@^2.1.4:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+  dependencies:
+    debug "^2.3.3"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    posix-character-classes "^0.1.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+expand-range@^1.8.1:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+  dependencies:
+    fill-range "^2.1.0"
+
+extend-shallow@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+  dependencies:
+    is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+  dependencies:
+    assign-symbols "^1.0.0"
+    is-extendable "^1.0.1"
+
+extend@~3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+
+external-editor@^3.0.0:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27"
+  dependencies:
+    chardet "^0.7.0"
+    iconv-lite "^0.4.24"
+    tmp "^0.0.33"
+
+extglob@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+  dependencies:
+    is-extglob "^1.0.0"
+
+extglob@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+  dependencies:
+    array-unique "^0.3.2"
+    define-property "^1.0.0"
+    expand-brackets "^2.1.4"
+    extend-shallow "^2.0.1"
+    fragment-cache "^0.2.1"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+extsprintf@1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+
+extsprintf@^1.2.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+
+fast-deep-equal@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
+
+fast-glob@^2.0.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.2.tgz#71723338ac9b4e0e2fff1d6748a2a13d5ed352bf"
+  dependencies:
+    "@mrmlnc/readdir-enhanced" "^2.2.1"
+    "@nodelib/fs.stat" "^1.0.1"
+    glob-parent "^3.1.0"
+    is-glob "^4.0.0"
+    merge2 "^1.2.1"
+    micromatch "^3.1.10"
+
+fast-json-stable-stringify@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+figgy-pudding@^3.1.0, figgy-pudding@^3.2.1, figgy-pudding@^3.4.1, figgy-pudding@^3.5.1:
+  version "3.5.1"
+  resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790"
+
+figures@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+  dependencies:
+    escape-string-regexp "^1.0.5"
+
+filename-regex@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+fill-range@^2.1.0:
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
+  dependencies:
+    is-number "^2.1.0"
+    isobject "^2.0.0"
+    randomatic "^3.0.0"
+    repeat-element "^1.1.2"
+    repeat-string "^1.5.2"
+
+fill-range@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+    to-regex-range "^2.1.0"
+
+find-up@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+  dependencies:
+    path-exists "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+find-up@^2.0.0, find-up@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+  dependencies:
+    locate-path "^2.0.0"
+
+find-up@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+  dependencies:
+    locate-path "^3.0.0"
+
+flush-write-stream@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.4"
+
+for-in@^1.0.1, for-in@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+  dependencies:
+    for-in "^1.0.1"
+
+forever-agent@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@~2.3.2:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "1.0.6"
+    mime-types "^2.1.12"
+
+fragment-cache@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+  dependencies:
+    map-cache "^0.2.2"
+
+from2@^2.1.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+
+fs-extra@7.0.0, fs-extra@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.0.tgz#8cc3f47ce07ef7b3593a11b9fb245f7e34c041d6"
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^4.0.0"
+    universalify "^0.1.0"
+
+fs-minipass@^1.2.5:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
+  dependencies:
+    minipass "^2.2.1"
+
+fs-write-stream-atomic@^1.0.8:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+  dependencies:
+    graceful-fs "^4.1.2"
+    iferr "^0.1.5"
+    imurmurhash "^0.1.4"
+    readable-stream "1 || 2"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fstream@^1.0.0, fstream@^1.0.2:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
+  dependencies:
+    graceful-fs "^4.1.2"
+    inherits "~2.0.0"
+    mkdirp ">=0.5 0"
+    rimraf "2"
+
+gauge@~2.7.3:
+  version "2.7.4"
+  resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+  dependencies:
+    aproba "^1.0.3"
+    console-control-strings "^1.0.0"
+    has-unicode "^2.0.0"
+    object-assign "^4.1.0"
+    signal-exit "^3.0.0"
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wide-align "^1.1.0"
+
+genfun@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/genfun/-/genfun-4.0.1.tgz#ed10041f2e4a7f1b0a38466d17a5c3e27df1dfc1"
+
+get-caller-file@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+
+get-pkg-repo@^1.0.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d"
+  dependencies:
+    hosted-git-info "^2.1.4"
+    meow "^3.3.0"
+    normalize-package-data "^2.3.0"
+    parse-github-repo-url "^1.3.0"
+    through2 "^2.0.0"
+
+get-port@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc"
+
+get-stdin@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-0.1.0.tgz#5998af24aafc802d15c82c685657eeb8b10d4a91"
+
+get-stdin@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+
+get-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+get-stream@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.0.0.tgz#9e074cb898bd2b9ebabb445a1766d7f43576d977"
+  dependencies:
+    pump "^3.0.0"
+
+get-value@^2.0.3, get-value@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+
+getpass@^0.1.1:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+  dependencies:
+    assert-plus "^1.0.0"
+
+git-raw-commits@^1.3.6:
+  version "1.3.6"
+  resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-1.3.6.tgz#27c35a32a67777c1ecd412a239a6c19d71b95aff"
+  dependencies:
+    dargs "^4.0.1"
+    lodash.template "^4.0.2"
+    meow "^4.0.0"
+    split2 "^2.0.0"
+    through2 "^2.0.0"
+
+git-remote-origin-url@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f"
+  dependencies:
+    gitconfiglocal "^1.0.0"
+    pify "^2.3.0"
+
+git-semver-tags@^1.3.6:
+  version "1.3.6"
+  resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-1.3.6.tgz#357ea01f7280794fe0927f2806bee6414d2caba5"
+  dependencies:
+    meow "^4.0.0"
+    semver "^5.5.0"
+
+gitconfiglocal@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b"
+  dependencies:
+    ini "^1.3.2"
+
+glob-base@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+  dependencies:
+    glob-parent "^2.0.0"
+    is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+  dependencies:
+    is-glob "^2.0.0"
+
+glob-parent@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+  dependencies:
+    is-glob "^3.1.0"
+    path-dirname "^1.0.0"
+
+glob-to-regexp@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
+
+glob@^6.0.4:
+  version "6.0.4"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
+  dependencies:
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "2 || 3"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2:
+  version "7.1.3"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+globby@^8.0.1:
+  version "8.0.1"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50"
+  dependencies:
+    array-union "^1.0.1"
+    dir-glob "^2.0.0"
+    fast-glob "^2.0.2"
+    glob "^7.1.2"
+    ignore "^3.3.5"
+    pify "^3.0.0"
+    slash "^1.0.0"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
+  version "4.1.11"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+handlebars@^4.0.2:
+  version "4.0.12"
+  resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5"
+  dependencies:
+    async "^2.5.0"
+    optimist "^0.6.1"
+    source-map "^0.6.1"
+  optionalDependencies:
+    uglify-js "^3.1.4"
+
+har-schema@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+
+har-validator@~5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29"
+  dependencies:
+    ajv "^5.3.0"
+    har-schema "^2.0.0"
+
+has-flag@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+
+has-unicode@^2.0.0, has-unicode@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has-value@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+  dependencies:
+    get-value "^2.0.3"
+    has-values "^0.1.4"
+    isobject "^2.0.0"
+
+has-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+  dependencies:
+    get-value "^2.0.6"
+    has-values "^1.0.0"
+    isobject "^3.0.0"
+
+has-values@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+
+has-values@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
+hosted-git-info@^2.1.4, hosted-git-info@^2.6.0:
+  version "2.7.1"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
+
+http-cache-semantics@^3.8.1:
+  version "3.8.1"
+  resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
+
+http-proxy-agent@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
+  dependencies:
+    agent-base "4"
+    debug "3.1.0"
+
+http-signature@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+  dependencies:
+    assert-plus "^1.0.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
+https-proxy-agent@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
+  dependencies:
+    agent-base "^4.1.0"
+    debug "^3.1.0"
+
+humanize-ms@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
+  dependencies:
+    ms "^2.0.0"
+
+iconv-lite@^0.4.24, iconv-lite@~0.4.13:
+  version "0.4.24"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3"
+
+iferr@^0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+
+ignore-walk@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
+  dependencies:
+    minimatch "^3.0.4"
+
+ignore@^3.3.5:
+  version "3.3.10"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
+
+import-local@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc"
+  dependencies:
+    pkg-dir "^2.0.0"
+    resolve-cwd "^2.0.0"
+
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+indent-string@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+  dependencies:
+    repeating "^2.0.0"
+
+indent-string@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+ini@^1.3.2, ini@^1.3.4:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+init-package-json@^1.10.3:
+  version "1.10.3"
+  resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe"
+  dependencies:
+    glob "^7.1.1"
+    npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0"
+    promzard "^0.3.0"
+    read "~1.0.1"
+    read-package-json "1 || 2"
+    semver "2.x || 3.x || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+    validate-npm-package-name "^3.0.0"
+
+inquirer@^6.2.0:
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8"
+  dependencies:
+    ansi-escapes "^3.0.0"
+    chalk "^2.0.0"
+    cli-cursor "^2.1.0"
+    cli-width "^2.0.0"
+    external-editor "^3.0.0"
+    figures "^2.0.0"
+    lodash "^4.17.10"
+    mute-stream "0.0.7"
+    run-async "^2.2.0"
+    rxjs "^6.1.0"
+    string-width "^2.1.0"
+    strip-ansi "^4.0.0"
+    through "^2.3.6"
+
+invert-kv@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
+
+ip@^1.1.5:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
+
+is-accessor-descriptor@^0.1.6:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+  dependencies:
+    kind-of "^6.0.0"
+
+is-arrayish@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-buffer@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-builtin-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+  dependencies:
+    builtin-modules "^1.0.0"
+
+is-ci@^1.0.10:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
+  dependencies:
+    ci-info "^1.5.0"
+
+is-data-descriptor@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+  dependencies:
+    kind-of "^6.0.0"
+
+is-descriptor@^0.1.0:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+  dependencies:
+    is-accessor-descriptor "^0.1.6"
+    is-data-descriptor "^0.1.4"
+    kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+  dependencies:
+    is-accessor-descriptor "^1.0.0"
+    is-data-descriptor "^1.0.0"
+    kind-of "^6.0.2"
+
+is-directory@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+
+is-dotfile@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+
+is-equal-shallow@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+  dependencies:
+    is-primitive "^2.0.0"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extendable@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+  dependencies:
+    is-plain-object "^2.0.4"
+
+is-extglob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-finite@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+  dependencies:
+    is-extglob "^1.0.0"
+
+is-glob@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+  dependencies:
+    is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+  dependencies:
+    is-extglob "^2.1.1"
+
+is-number@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
+
+is-obj@^1.0.0:
+  version "1.0.1"
+  resolved "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
+is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+  dependencies:
+    isobject "^3.0.1"
+
+is-posix-bracket@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-promise@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+
+is-stream@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-subset@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6"
+
+is-text-path@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e"
+  dependencies:
+    text-extensions "^1.0.0"
+
+is-typedarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-utf8@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
+is-windows@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
+isarray@1.0.0, isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  dependencies:
+    isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+
+isstream@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+jest-worker@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9"
+  dependencies:
+    merge-stream "^1.0.1"
+
+js-tokens@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+
+js-yaml@^3.9.0:
+  version "3.12.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
+jsbn@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+
+json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+
+json-schema-traverse@^0.3.0:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+
+json-schema@0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
+jsonfile@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+  optionalDependencies:
+    graceful-fs "^4.1.6"
+
+jsonparse@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
+
+jsprim@^1.2.2:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+  dependencies:
+    assert-plus "1.0.0"
+    extsprintf "1.3.0"
+    json-schema "0.2.3"
+    verror "1.10.0"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+lcid@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf"
+  dependencies:
+    invert-kv "^2.0.0"
+
+lerna@^3.4.0:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.4.0.tgz#c1403852b4b3fa986072de11d7f549604fd41775"
+  dependencies:
+    "@lerna/add" "^3.3.2"
+    "@lerna/bootstrap" "^3.3.2"
+    "@lerna/changed" "^3.3.2"
+    "@lerna/clean" "^3.3.2"
+    "@lerna/cli" "^3.2.0"
+    "@lerna/create" "^3.3.1"
+    "@lerna/diff" "^3.3.0"
+    "@lerna/exec" "^3.3.2"
+    "@lerna/import" "^3.3.1"
+    "@lerna/init" "^3.3.0"
+    "@lerna/link" "^3.3.0"
+    "@lerna/list" "^3.3.2"
+    "@lerna/publish" "^3.4.0"
+    "@lerna/run" "^3.3.2"
+    "@lerna/version" "^3.3.2"
+    import-local "^1.0.0"
+    npmlog "^4.1.2"
+
+libnpmaccess@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-3.0.0.tgz#33cc9c8a5cb53e87d06bf2e547c2eba974f619af"
+  dependencies:
+    aproba "^2.0.0"
+    get-stream "^4.0.0"
+    npm-package-arg "^6.1.0"
+    npm-registry-fetch "^3.8.0"
+
+load-json-file@^1.0.0:
+  version "1.1.0"
+  resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    strip-bom "^2.0.0"
+
+load-json-file@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^4.0.0"
+    pify "^3.0.0"
+    strip-bom "^3.0.0"
+
+locate-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+  dependencies:
+    p-locate "^2.0.0"
+    path-exists "^3.0.0"
+
+locate-path@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+  dependencies:
+    p-locate "^3.0.0"
+    path-exists "^3.0.0"
+
+lodash._reinterpolate@~3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
+
+lodash.sortby@^4.7.0:
+  version "4.7.0"
+  resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
+
+lodash.template@^4.0.2:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0"
+  dependencies:
+    lodash._reinterpolate "~3.0.0"
+    lodash.templatesettings "^4.0.0"
+
+lodash.templatesettings@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316"
+  dependencies:
+    lodash._reinterpolate "~3.0.0"
+
+lodash@^4.17.10, lodash@^4.17.5, lodash@^4.2.1:
+  version "4.17.11"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
+
+loud-rejection@^1.0.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
+  dependencies:
+    currently-unhandled "^0.4.1"
+    signal-exit "^3.0.0"
+
+lru-cache@^4.1.2, lru-cache@^4.1.3:
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+  dependencies:
+    pseudomap "^1.0.2"
+    yallist "^2.1.2"
+
+magic-string@^0.22.4:
+  version "0.22.5"
+  resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e"
+  dependencies:
+    vlq "^0.2.2"
+
+make-dir@^1.0.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+  dependencies:
+    pify "^3.0.0"
+
+make-fetch-happen@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz#141497cb878f243ba93136c83d8aba12c216c083"
+  dependencies:
+    agentkeepalive "^3.4.1"
+    cacache "^11.0.1"
+    http-cache-semantics "^3.8.1"
+    http-proxy-agent "^2.1.0"
+    https-proxy-agent "^2.2.1"
+    lru-cache "^4.1.2"
+    mississippi "^3.0.0"
+    node-fetch-npm "^2.0.2"
+    promise-retry "^1.1.1"
+    socks-proxy-agent "^4.0.0"
+    ssri "^6.0.0"
+
+map-age-cleaner@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74"
+  dependencies:
+    p-defer "^1.0.0"
+
+map-cache@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
+map-obj@^1.0.0, map-obj@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+
+map-obj@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9"
+
+map-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+  dependencies:
+    object-visit "^1.0.0"
+
+math-random@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac"
+
+mem@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf"
+  dependencies:
+    map-age-cleaner "^0.1.1"
+    mimic-fn "^1.0.0"
+    p-is-promise "^1.1.0"
+
+meow@^3.3.0:
+  version "3.7.0"
+  resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+  dependencies:
+    camelcase-keys "^2.0.0"
+    decamelize "^1.1.2"
+    loud-rejection "^1.0.0"
+    map-obj "^1.0.1"
+    minimist "^1.1.3"
+    normalize-package-data "^2.3.4"
+    object-assign "^4.0.1"
+    read-pkg-up "^1.0.1"
+    redent "^1.0.0"
+    trim-newlines "^1.0.0"
+
+meow@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975"
+  dependencies:
+    camelcase-keys "^4.0.0"
+    decamelize-keys "^1.0.0"
+    loud-rejection "^1.0.0"
+    minimist "^1.1.3"
+    minimist-options "^3.0.1"
+    normalize-package-data "^2.3.4"
+    read-pkg-up "^3.0.0"
+    redent "^2.0.0"
+    trim-newlines "^2.0.0"
+
+merge-stream@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1"
+  dependencies:
+    readable-stream "^2.0.1"
+
+merge2@^1.2.1:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.2.tgz#03212e3da8d86c4d8523cebd6318193414f94e34"
+
+micromatch@^2.3.11:
+  version "2.3.11"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+  dependencies:
+    arr-diff "^2.0.0"
+    array-unique "^0.2.1"
+    braces "^1.8.2"
+    expand-brackets "^0.1.4"
+    extglob "^0.3.1"
+    filename-regex "^2.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.1"
+    kind-of "^3.0.2"
+    normalize-path "^2.0.1"
+    object.omit "^2.0.0"
+    parse-glob "^3.0.4"
+    regex-cache "^0.4.2"
+
+micromatch@^3.1.10:
+  version "3.1.10"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    braces "^2.3.1"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    extglob "^2.0.4"
+    fragment-cache "^0.2.1"
+    kind-of "^6.0.2"
+    nanomatch "^1.2.9"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.2"
+
+mime-db@~1.36.0:
+  version "1.36.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397"
+
+mime-types@^2.1.12, mime-types@~2.1.19:
+  version "2.1.20"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19"
+  dependencies:
+    mime-db "~1.36.0"
+
+mimic-fn@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+
+"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimist-options@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954"
+  dependencies:
+    arrify "^1.0.1"
+    is-plain-obj "^1.1.0"
+
+minimist@0.0.8:
+  version "0.0.8"
+  resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^0.1.0:
+  version "0.1.0"
+  resolved "http://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de"
+
+minimist@^1.1.3, minimist@^1.2.0:
+  version "1.2.0"
+  resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minimist@~0.0.1:
+  version "0.0.10"
+  resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
+
+minipass@^2.2.1, minipass@^2.3.3:
+  version "2.3.4"
+  resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957"
+  dependencies:
+    safe-buffer "^5.1.2"
+    yallist "^3.0.0"
+
+minizlib@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
+  dependencies:
+    minipass "^2.2.1"
+
+mississippi@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
+  dependencies:
+    concat-stream "^1.5.0"
+    duplexify "^3.4.2"
+    end-of-stream "^1.1.0"
+    flush-write-stream "^1.0.0"
+    from2 "^2.1.0"
+    parallel-transform "^1.1.0"
+    pump "^3.0.0"
+    pumpify "^1.3.3"
+    stream-each "^1.1.0"
+    through2 "^2.0.0"
+
+mixin-deep@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+  dependencies:
+    for-in "^1.0.2"
+    is-extendable "^1.0.1"
+
+"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
+  version "0.5.1"
+  resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+  dependencies:
+    minimist "0.0.8"
+
+modify-values@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022"
+
+move-concurrently@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+  dependencies:
+    aproba "^1.1.1"
+    copy-concurrently "^1.0.0"
+    fs-write-stream-atomic "^1.0.8"
+    mkdirp "^0.5.1"
+    rimraf "^2.5.4"
+    run-queue "^1.0.3"
+
+ms@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+ms@^2.0.0, ms@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+
+multimatch@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b"
+  dependencies:
+    array-differ "^1.0.0"
+    array-union "^1.0.1"
+    arrify "^1.0.0"
+    minimatch "^3.0.0"
+
+mute-stream@0.0.7, mute-stream@~0.0.4:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+
+nanomatch@^1.2.9:
+  version "1.2.13"
+  resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    fragment-cache "^0.2.1"
+    is-windows "^1.0.2"
+    kind-of "^6.0.2"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+nice-try@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+
+node-fetch-npm@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7"
+  dependencies:
+    encoding "^0.1.11"
+    json-parse-better-errors "^1.0.0"
+    safe-buffer "^5.1.1"
+
+node-gyp@^3.8.0:
+  version "3.8.0"
+  resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c"
+  dependencies:
+    fstream "^1.0.0"
+    glob "^7.0.3"
+    graceful-fs "^4.1.2"
+    mkdirp "^0.5.0"
+    nopt "2 || 3"
+    npmlog "0 || 1 || 2 || 3 || 4"
+    osenv "0"
+    request "^2.87.0"
+    rimraf "2"
+    semver "~5.3.0"
+    tar "^2.0.0"
+    which "1"
+
+"nopt@2 || 3":
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+  dependencies:
+    abbrev "1"
+
+normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5, normalize-package-data@^2.4.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+  dependencies:
+    hosted-git-info "^2.1.4"
+    is-builtin-module "^1.0.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+  dependencies:
+    remove-trailing-separator "^1.0.1"
+
+npm-bundled@^1.0.1:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979"
+
+npm-lifecycle@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-2.1.0.tgz#1eda2eedb82db929e3a0c50341ab0aad140ed569"
+  dependencies:
+    byline "^5.0.0"
+    graceful-fs "^4.1.11"
+    node-gyp "^3.8.0"
+    resolve-from "^4.0.0"
+    slide "^1.1.6"
+    uid-number "0.0.6"
+    umask "^1.1.0"
+    which "^1.3.1"
+
+"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1"
+  dependencies:
+    hosted-git-info "^2.6.0"
+    osenv "^0.1.5"
+    semver "^5.5.0"
+    validate-npm-package-name "^3.0.0"
+
+npm-packlist@^1.1.10:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de"
+  dependencies:
+    ignore-walk "^3.0.1"
+    npm-bundled "^1.0.1"
+
+npm-pick-manifest@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-2.1.0.tgz#dc381bdd670c35d81655e1d5a94aa3dd4d87fce5"
+  dependencies:
+    npm-package-arg "^6.0.0"
+    semver "^5.4.1"
+
+npm-registry-fetch@^3.0.0, npm-registry-fetch@^3.8.0:
+  version "3.8.0"
+  resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-3.8.0.tgz#aa7d9a7c92aff94f48dba0984bdef4bd131c88cc"
+  dependencies:
+    JSONStream "^1.3.4"
+    bluebird "^3.5.1"
+    figgy-pudding "^3.4.1"
+    lru-cache "^4.1.3"
+    make-fetch-happen "^4.0.1"
+    npm-package-arg "^6.1.0"
+
+npm-run-path@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+  dependencies:
+    path-key "^2.0.0"
+
+"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+  dependencies:
+    are-we-there-yet "~1.1.2"
+    console-control-strings "~1.1.0"
+    gauge "~2.7.3"
+    set-blocking "~2.0.0"
+
+number-is-nan@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+oauth-sign@~0.9.0:
+  version "0.9.0"
+  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+
+object-assign@^4.0.1, object-assign@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-copy@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+  dependencies:
+    copy-descriptor "^0.1.0"
+    define-property "^0.2.5"
+    kind-of "^3.0.3"
+
+object-visit@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+  dependencies:
+    isobject "^3.0.0"
+
+object.omit@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+  dependencies:
+    for-own "^0.1.4"
+    is-extendable "^0.1.1"
+
+object.pick@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+  dependencies:
+    isobject "^3.0.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  dependencies:
+    wrappy "1"
+
+onetime@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+  dependencies:
+    mimic-fn "^1.0.0"
+
+optimist@^0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
+  dependencies:
+    minimist "~0.0.1"
+    wordwrap "~0.0.2"
+
+os-homedir@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620"
+  dependencies:
+    execa "^0.10.0"
+    lcid "^2.0.0"
+    mem "^4.0.0"
+
+os-tmpdir@^1.0.0, os-tmpdir@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@0, osenv@^0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.0"
+
+p-defer@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
+
+p-finally@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-is-promise@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e"
+
+p-limit@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+  dependencies:
+    p-try "^1.0.0"
+
+p-limit@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec"
+  dependencies:
+    p-try "^2.0.0"
+
+p-locate@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+  dependencies:
+    p-limit "^1.1.0"
+
+p-locate@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+  dependencies:
+    p-limit "^2.0.0"
+
+p-map-series@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca"
+  dependencies:
+    p-reduce "^1.0.0"
+
+p-map@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
+
+p-pipe@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9"
+
+p-reduce@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
+
+p-try@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+p-try@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1"
+
+p-waterfall@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-waterfall/-/p-waterfall-1.0.0.tgz#7ed94b3ceb3332782353af6aae11aa9fc235bb00"
+  dependencies:
+    p-reduce "^1.0.0"
+
+pacote@^9.1.0:
+  version "9.1.0"
+  resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.1.0.tgz#59810859bbd72984dcb267269259375d32f391e5"
+  dependencies:
+    bluebird "^3.5.1"
+    cacache "^11.0.2"
+    figgy-pudding "^3.2.1"
+    get-stream "^3.0.0"
+    glob "^7.1.2"
+    lru-cache "^4.1.3"
+    make-fetch-happen "^4.0.1"
+    minimatch "^3.0.4"
+    minipass "^2.3.3"
+    mississippi "^3.0.0"
+    mkdirp "^0.5.1"
+    normalize-package-data "^2.4.0"
+    npm-package-arg "^6.1.0"
+    npm-packlist "^1.1.10"
+    npm-pick-manifest "^2.1.0"
+    npm-registry-fetch "^3.0.0"
+    osenv "^0.1.5"
+    promise-inflight "^1.0.1"
+    promise-retry "^1.1.1"
+    protoduck "^5.0.0"
+    rimraf "^2.6.2"
+    safe-buffer "^5.1.2"
+    semver "^5.5.0"
+    ssri "^6.0.0"
+    tar "^4.4.3"
+    unique-filename "^1.1.0"
+    which "^1.3.0"
+
+parallel-transform@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
+  dependencies:
+    cyclist "~0.2.2"
+    inherits "^2.0.3"
+    readable-stream "^2.1.5"
+
+parse-github-repo-url@^1.3.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50"
+
+parse-glob@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+  dependencies:
+    glob-base "^0.3.0"
+    is-dotfile "^1.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.0"
+
+parse-json@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+  dependencies:
+    error-ex "^1.2.0"
+
+parse-json@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+  dependencies:
+    error-ex "^1.3.1"
+    json-parse-better-errors "^1.0.1"
+
+pascalcase@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
+path-dirname@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+
+path-exists@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+  dependencies:
+    pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-key@^2.0.0, path-key@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-parse@^1.0.5:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
+
+path-type@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+  dependencies:
+    graceful-fs "^4.1.2"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+path-type@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
+  dependencies:
+    pify "^3.0.0"
+
+performance-now@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+
+pify@^2.0.0, pify@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pify@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+
+pinkie-promise@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+  dependencies:
+    pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+
+pkg-dir@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+  dependencies:
+    find-up "^2.1.0"
+
+posix-character-classes@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+
+preserve@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+prettier@^1.14.2:
+  version "1.14.2"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.2.tgz#0ac1c6e1a90baa22a62925f41963c841983282f9"
+
+process-nextick-args@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+promise-inflight@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+
+promise-retry@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d"
+  dependencies:
+    err-code "^1.0.0"
+    retry "^0.10.0"
+
+promzard@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee"
+  dependencies:
+    read "1"
+
+proto-list@~1.2.1:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
+
+protoduck@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.0.tgz#752145e6be0ad834cb25716f670a713c860dce70"
+  dependencies:
+    genfun "^4.0.1"
+
+pseudomap@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+psl@^1.1.24:
+  version "1.1.29"
+  resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67"
+
+pump@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
+pump@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
+pumpify@^1.3.3:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+  dependencies:
+    duplexify "^3.6.0"
+    inherits "^2.0.3"
+    pump "^2.0.0"
+
+punycode@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+punycode@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+
+q@^1.5.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+
+qs@~6.5.2:
+  version "6.5.2"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+
+quick-lru@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8"
+
+randomatic@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.0.tgz#36f2ca708e9e567f5ed2ec01949026d50aa10116"
+  dependencies:
+    is-number "^4.0.0"
+    kind-of "^6.0.0"
+    math-random "^1.0.1"
+
+read-cmd-shim@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b"
+  dependencies:
+    graceful-fs "^4.1.2"
+
+"read-package-json@1 || 2", read-package-json@^2.0.0:
+  version "2.0.13"
+  resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a"
+  dependencies:
+    glob "^7.1.1"
+    json-parse-better-errors "^1.0.1"
+    normalize-package-data "^2.0.0"
+    slash "^1.0.0"
+  optionalDependencies:
+    graceful-fs "^4.1.2"
+
+read-package-tree@^5.1.6:
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.2.1.tgz#6218b187d6fac82289ce4387bbbaf8eef536ad63"
+  dependencies:
+    debuglog "^1.0.1"
+    dezalgo "^1.0.0"
+    once "^1.3.0"
+    read-package-json "^2.0.0"
+    readdir-scoped-modules "^1.0.0"
+
+read-pkg-up@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+  dependencies:
+    find-up "^1.0.0"
+    read-pkg "^1.0.0"
+
+read-pkg-up@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07"
+  dependencies:
+    find-up "^2.0.0"
+    read-pkg "^3.0.0"
+
+read-pkg@^1.0.0, read-pkg@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+  dependencies:
+    load-json-file "^1.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^1.0.0"
+
+read-pkg@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
+  dependencies:
+    load-json-file "^4.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^3.0.0"
+
+read@1, read@~1.0.1:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
+  dependencies:
+    mute-stream "~0.0.4"
+
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2:
+  version "2.3.6"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~2.0.0"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.1.1"
+    util-deprecate "~1.0.1"
+
+readdir-scoped-modules@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747"
+  dependencies:
+    debuglog "^1.0.1"
+    dezalgo "^1.0.0"
+    graceful-fs "^4.1.2"
+    once "^1.3.0"
+
+redent@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
+  dependencies:
+    indent-string "^2.1.0"
+    strip-indent "^1.0.1"
+
+redent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa"
+  dependencies:
+    indent-string "^3.0.0"
+    strip-indent "^2.0.0"
+
+regex-cache@^0.4.2:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
+  dependencies:
+    is-equal-shallow "^0.1.3"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+  dependencies:
+    extend-shallow "^3.0.2"
+    safe-regex "^1.1.0"
+
+remove-trailing-separator@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
+
+repeat-string@^1.5.2, repeat-string@^1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+  dependencies:
+    is-finite "^1.0.0"
+
+request@^2.87.0:
+  version "2.88.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
+  dependencies:
+    aws-sign2 "~0.7.0"
+    aws4 "^1.8.0"
+    caseless "~0.12.0"
+    combined-stream "~1.0.6"
+    extend "~3.0.2"
+    forever-agent "~0.6.1"
+    form-data "~2.3.2"
+    har-validator "~5.1.0"
+    http-signature "~1.2.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.19"
+    oauth-sign "~0.9.0"
+    performance-now "^2.1.0"
+    qs "~6.5.2"
+    safe-buffer "^5.1.2"
+    tough-cookie "~2.4.3"
+    tunnel-agent "^0.6.0"
+    uuid "^3.3.2"
+
+require-directory@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-main-filename@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+resolve-cwd@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
+  dependencies:
+    resolve-from "^3.0.0"
+
+resolve-from@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+
+resolve-from@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+
+resolve-url@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
+resolve@1.8.1:
+  version "1.8.1"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26"
+  dependencies:
+    path-parse "^1.0.5"
+
+restore-cursor@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+  dependencies:
+    onetime "^2.0.0"
+    signal-exit "^3.0.2"
+
+ret@~0.1.10:
+  version "0.1.15"
+  resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+
+retry@^0.10.0:
+  version "0.10.1"
+  resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4"
+
+rimraf@2, rimraf@^2.5.4, rimraf@^2.6.2:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+  dependencies:
+    glob "^7.0.5"
+
+rollup-plugin-alias@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/rollup-plugin-alias/-/rollup-plugin-alias-1.4.0.tgz#120cba7c46621c03138f0ca6fd5dd2ade9872db9"
+  dependencies:
+    slash "^1.0.0"
+
+rollup-plugin-replace@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/rollup-plugin-replace/-/rollup-plugin-replace-2.0.0.tgz#19074089c8ed57184b8cc64e967a03d095119277"
+  dependencies:
+    magic-string "^0.22.4"
+    minimatch "^3.0.2"
+    rollup-pluginutils "^2.0.1"
+
+rollup-plugin-terser@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-2.0.2.tgz#1b59d67c80fc0d499cdc29a6991944b2d671ea03"
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    jest-worker "^23.2.0"
+    terser "^3.8.2"
+
+rollup-plugin-typescript2@^0.17.0:
+  version "0.17.0"
+  resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.17.0.tgz#a540eecfe9ad8ff5e8e86eaf5069bb2a7f84f33a"
+  dependencies:
+    fs-extra "7.0.0"
+    resolve "1.8.1"
+    rollup-pluginutils "2.3.1"
+    tslib "1.9.3"
+
+rollup-pluginutils@2.3.1, rollup-pluginutils@^2.0.1:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.1.tgz#760d185ccc237dedc12d7ae48c6bcd127b4892d0"
+  dependencies:
+    estree-walker "^0.5.2"
+    micromatch "^2.3.11"
+
+rollup@^0.65.0:
+  version "0.65.0"
+  resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.65.0.tgz#280db1252169b68fc3043028346b337dde453fba"
+  dependencies:
+    "@types/estree" "0.0.39"
+    "@types/node" "*"
+
+run-async@^2.2.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
+  dependencies:
+    is-promise "^2.1.0"
+
+run-queue@^1.0.0, run-queue@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+  dependencies:
+    aproba "^1.1.1"
+
+rxjs@^6.1.0:
+  version "6.3.2"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.2.tgz#6a688b16c4e6e980e62ea805ec30648e1c60907f"
+  dependencies:
+    tslib "^1.9.0"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.2"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+
+safe-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+  dependencies:
+    ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+
+"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.4.1, semver@^5.5.0:
+  version "5.5.1"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477"
+
+semver@~5.3.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-value@^0.4.3:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.1"
+    to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.3"
+    split-string "^3.0.1"
+
+shebang-command@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+  dependencies:
+    shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+slash@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+slide@^1.1.6:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
+
+smart-buffer@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.1.tgz#07ea1ca8d4db24eb4cac86537d7d18995221ace3"
+
+snapdragon-node@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+  dependencies:
+    define-property "^1.0.0"
+    isobject "^3.0.0"
+    snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+  dependencies:
+    kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+  dependencies:
+    base "^0.11.1"
+    debug "^2.2.0"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    map-cache "^0.2.2"
+    source-map "^0.5.6"
+    source-map-resolve "^0.5.0"
+    use "^3.1.0"
+
+socks-proxy-agent@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz#5936bf8b707a993079c6f37db2091821bffa6473"
+  dependencies:
+    agent-base "~4.2.0"
+    socks "~2.2.0"
+
+socks@~2.2.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/socks/-/socks-2.2.1.tgz#68ad678b3642fbc5d99c64c165bc561eab0215f9"
+  dependencies:
+    ip "^1.1.5"
+    smart-buffer "^4.0.1"
+
+sort-keys@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128"
+  dependencies:
+    is-plain-obj "^1.0.0"
+
+source-map-resolve@^0.5.0:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+  dependencies:
+    atob "^2.1.1"
+    decode-uri-component "^0.2.0"
+    resolve-url "^0.2.1"
+    source-map-url "^0.4.0"
+    urix "^0.1.0"
+
+source-map-support@~0.5.6:
+  version "0.5.9"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f"
+  dependencies:
+    buffer-from "^1.0.0"
+    source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+
+source-map@^0.5.6:
+  version "0.5.7"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+spdx-correct@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
+  dependencies:
+    spdx-expression-parse "^3.0.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9"
+
+spdx-expression-parse@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
+  dependencies:
+    spdx-exceptions "^2.1.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f"
+
+split-string@^3.0.1, split-string@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+  dependencies:
+    extend-shallow "^3.0.0"
+
+split2@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493"
+  dependencies:
+    through2 "^2.0.2"
+
+split@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9"
+  dependencies:
+    through "2"
+
+sprintf-js@~1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+sshpk@^1.7.0:
+  version "1.14.2"
+  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98"
+  dependencies:
+    asn1 "~0.2.3"
+    assert-plus "^1.0.0"
+    dashdash "^1.12.0"
+    getpass "^0.1.1"
+    safer-buffer "^2.0.2"
+  optionalDependencies:
+    bcrypt-pbkdf "^1.0.0"
+    ecc-jsbn "~0.1.1"
+    jsbn "~0.1.0"
+    tweetnacl "~0.14.0"
+
+ssri@^6.0.0:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8"
+  dependencies:
+    figgy-pudding "^3.5.1"
+
+static-extend@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+  dependencies:
+    define-property "^0.2.5"
+    object-copy "^0.1.0"
+
+stream-each@^1.1.0:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae"
+  dependencies:
+    end-of-stream "^1.1.0"
+    stream-shift "^1.0.0"
+
+stream-shift@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
+
+string-width@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+    strip-ansi "^4.0.0"
+
+string_decoder@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+  dependencies:
+    safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+  dependencies:
+    ansi-regex "^3.0.0"
+
+strip-bom@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+  dependencies:
+    is-utf8 "^0.2.0"
+
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-eof@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+strip-indent@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
+  dependencies:
+    get-stdin "^4.0.1"
+
+strip-indent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
+
+strong-log-transformer@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.0.0.tgz#fa6d8e0a9e62b3c168c3cad5ae5d00dc97ba26cc"
+  dependencies:
+    byline "^5.0.0"
+    duplexer "^0.1.1"
+    minimist "^1.2.0"
+    through "^2.3.4"
+
+supports-color@^5.3.0:
+  version "5.5.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+  dependencies:
+    has-flag "^3.0.0"
+
+tar@^2.0.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
+  dependencies:
+    block-stream "*"
+    fstream "^1.0.2"
+    inherits "2"
+
+tar@^4.4.3:
+  version "4.4.6"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b"
+  dependencies:
+    chownr "^1.0.1"
+    fs-minipass "^1.2.5"
+    minipass "^2.3.3"
+    minizlib "^1.1.0"
+    mkdirp "^0.5.0"
+    safe-buffer "^5.1.2"
+    yallist "^3.0.2"
+
+temp-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
+
+temp-write@^3.4.0:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-3.4.0.tgz#8cff630fb7e9da05f047c74ce4ce4d685457d492"
+  dependencies:
+    graceful-fs "^4.1.2"
+    is-stream "^1.1.0"
+    make-dir "^1.0.0"
+    pify "^3.0.0"
+    temp-dir "^1.0.0"
+    uuid "^3.0.1"
+
+terser@^3.8.2:
+  version "3.8.2"
+  resolved "https://registry.yarnpkg.com/terser/-/terser-3.8.2.tgz#48b880f949f8d038aca4dfd00a37c53d96ecf9fb"
+  dependencies:
+    commander "~2.17.1"
+    source-map "~0.6.1"
+    source-map-support "~0.5.6"
+
+text-extensions@^1.0.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.8.0.tgz#6f343c62268843019b21a616a003557bdb952d2b"
+
+through2@^2.0.0, through2@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+  dependencies:
+    readable-stream "^2.1.5"
+    xtend "~4.0.1"
+
+through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6:
+  version "2.3.8"
+  resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+tmp@^0.0.33:
+  version "0.0.33"
+  resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+  dependencies:
+    os-tmpdir "~1.0.2"
+
+to-object-path@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+  dependencies:
+    kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+  dependencies:
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+  dependencies:
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    regex-not "^1.0.2"
+    safe-regex "^1.1.0"
+
+tough-cookie@~2.4.3:
+  version "2.4.3"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
+  dependencies:
+    psl "^1.1.24"
+    punycode "^1.4.1"
+
+tr46@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
+  dependencies:
+    punycode "^2.1.0"
+
+trim-newlines@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
+
+trim-newlines@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20"
+
+trim-off-newlines@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3"
+
+tslib@1.9.3, tslib@^1.9.0:
+  version "1.9.3"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
+
+tunnel-agent@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+  dependencies:
+    safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+  version "0.14.5"
+  resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+typedarray@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+typescript@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.3.tgz#4853b3e275ecdaa27f78fda46dc273a7eb7fc1c8"
+
+uglify-js@^3.1.4:
+  version "3.4.9"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3"
+  dependencies:
+    commander "~2.17.1"
+    source-map "~0.6.1"
+
+uid-number@0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
+
+umask@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d"
+
+union-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+  dependencies:
+    arr-union "^3.1.0"
+    get-value "^2.0.6"
+    is-extendable "^0.1.1"
+    set-value "^0.4.3"
+
+unique-filename@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3"
+  dependencies:
+    unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab"
+  dependencies:
+    imurmurhash "^0.1.4"
+
+universalify@^0.1.0:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+
+unset-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+  dependencies:
+    has-value "^0.3.1"
+    isobject "^3.0.0"
+
+urix@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
+use@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+
+util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+uuid@^3.0.1, uuid@^3.3.2:
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
+
+validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.3:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+  dependencies:
+    spdx-correct "^3.0.0"
+    spdx-expression-parse "^3.0.0"
+
+validate-npm-package-name@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e"
+  dependencies:
+    builtins "^1.0.3"
+
+verror@1.10.0:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+  dependencies:
+    assert-plus "^1.0.0"
+    core-util-is "1.0.2"
+    extsprintf "^1.2.0"
+
+vlq@^0.2.2:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26"
+
+wcwidth@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
+  dependencies:
+    defaults "^1.0.3"
+
+webidl-conversions@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
+
+whatwg-url@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd"
+  dependencies:
+    lodash.sortby "^4.7.0"
+    tr46 "^1.0.1"
+    webidl-conversions "^4.0.2"
+
+which-module@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+
+which@1, which@^1.2.9, which@^1.3.0, which@^1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+  dependencies:
+    isexe "^2.0.0"
+
+wide-align@^1.1.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+  dependencies:
+    string-width "^1.0.2 || 2"
+
+wordwrap@~0.0.2:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+
+wrap-ansi@^2.0.0:
+  version "2.1.0"
+  resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+write-file-atomic@^2.0.0, write-file-atomic@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
+  dependencies:
+    graceful-fs "^4.1.11"
+    imurmurhash "^0.1.4"
+    signal-exit "^3.0.2"
+
+write-json-file@^2.2.0, write-json-file@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f"
+  dependencies:
+    detect-indent "^5.0.0"
+    graceful-fs "^4.1.2"
+    make-dir "^1.0.0"
+    pify "^3.0.0"
+    sort-keys "^2.0.0"
+    write-file-atomic "^2.0.0"
+
+write-pkg@^3.1.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-3.2.0.tgz#0e178fe97820d389a8928bc79535dbe68c2cff21"
+  dependencies:
+    sort-keys "^2.0.0"
+    write-json-file "^2.2.0"
+
+xregexp@4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020"
+
+xtend@~4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
+
+yallist@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yallist@^3.0.0, yallist@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
+
+yargs-parser@^10.1.0:
+  version "10.1.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8"
+  dependencies:
+    camelcase "^4.1.0"
+
+yargs@^12.0.1:
+  version "12.0.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc"
+  dependencies:
+    cliui "^4.0.0"
+    decamelize "^2.0.0"
+    find-up "^3.0.0"
+    get-caller-file "^1.0.1"
+    os-locale "^3.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1 || ^4.0.0"
+    yargs-parser "^10.1.0"