diff --git a/packages/wepy-cli/templates/empty/.editorconfig b/.editorconfig
similarity index 100%
rename from packages/wepy-cli/templates/empty/.editorconfig
rename to .editorconfig
diff --git a/.eslintignore b/.eslintignore
index b2232964a..9b6acad55 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -1,9 +1,11 @@
 /lib
-scripts
+coverage/
 packages/*/node_modules
 packages/*/lib
 packages/*/dist
 packages/*/test/fixtures
 packages/*/coverage
 packages/wepy-cli/templates
-gulpfile.js
\ No newline at end of file
+packages/cli/test/core/fixtures
+gulpfile.js
+
diff --git a/.eslintrc b/.eslintrc
index f44542323..1949f2ac1 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -1,6 +1,7 @@
 {
   "parser": "babel-eslint",
   "env": {
+    "es6": true,
     "node": true,
     "mocha": true
   },
@@ -21,7 +22,5 @@
     "no-empty": 0,
     "yoda": 0,
     "no-new-func": 0
-  },
-  "globals": {
   }
-}
\ No newline at end of file
+}
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
index c58155f36..5af6dab73 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE.md
@@ -20,12 +20,12 @@
 
 * 已经在issue中搜索过，并且没有找到相似的issue或者解决方案。
 
-* *I searched issue already but I did't find any relevant issues or solutions.*
+* *I searched issue already but I didn't find any relevant issues or solutions.*
 
 
 * 完善下面模板中的信息
 
-* *Please filled out the following template*
+* *Please fill out the following template*
 
 
 
@@ -37,6 +37,7 @@ DELETE THE INFORMATION ABOVE(INCLUDE THE SEPARATION LINE) BEFORE YOU OPEN AN ISS
 ## Description
 
   [问题描述：站在其它人的角度尽可能清晰地、简洁地把问题描述清楚]
+  
   [Description of the issue]
 
 ## Environment
@@ -70,5 +71,7 @@ DELETE THE INFORMATION ABOVE(INCLUDE THE SEPARATION LINE) BEFORE YOU OPEN AN ISS
 ## Relevant Code / Logs
 
   ```
-  // TODO(you): code or logs ohere to reproduce the problem
-  ```
+  // TODO(you): code or logs here to reproduce the problem
+  // 可以使用小程序代码片段功能，方便其它人帮助你定位代码问题
+  // 详情可参考这里：https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html
+  ```
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 000000000..a7e10cafd
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,14 @@
+<!--
+Thank you for your pull request. Please provide a description above and review
+the requirements below.
+
+Bug fixes and new features should include tests and possibly benchmarks.
+-->
+
+##### Checklist
+<!-- Remove items that do not apply. For completed items, change [ ] to [x]. -->
+
+- [ ] `npm run test` passes
+- [ ] tests and/or benchmarks are included
+- [ ] cases or donate is changed or added
+- [ ] documentation is changed or added
diff --git a/.github/stale.yml b/.github/stale.yml
new file mode 100644
index 000000000..60671042a
--- /dev/null
+++ b/.github/stale.yml
@@ -0,0 +1,20 @@
+# Number of days of inactivity before an issue becomes stale
+daysUntilStale: 3600
+# Number of days of inactivity before a stale issue is closed
+daysUntilClose: 1700
+# Issues with these labels will never be considered stale
+exemptLabels:
+  - pinned
+  - security
+# Label to use when marking an issue as stale
+staleLabel: Inactive
+# Comment to post when marking an issue as stale. Set to `false` to disable
+markComment: >
+  This issue has been automatically marked as stale because it has not had
+  recent activity. It will be closed if no further activity occurs. Thank you
+  for your contributions.
+  因为这个 Issue 最近没有任何有效回复，所以被自动标记为了`stale`。
+  如果在未来7天依旧没有任何激活操作，那么该 Issue 将会被自动关闭。
+  感谢您的提问。
+# Comment to post when closing a stale issue. Set to `false` to disable
+closeComment: false
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 000000000..25d052aeb
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,55 @@
+name: WePY CI Build
+
+on: [push, pull_request]
+
+jobs:
+  build:
+    runs-on: ubuntu-18.04
+    strategy:
+      matrix:
+        node-version: [10.x]
+    steps:
+    - name: Install expect
+      run: | 
+        sudo apt -qy update && sudo apt install -y expect
+    - uses: actions/checkout@v2
+    - name: Use Node.js ${{ matrix.node-version }}
+      uses: actions/setup-node@v1
+      with:
+        node-version: ${{ matrix.node-version }}
+    - run: npm install
+    - run: npm run bootstrap 
+    - run: npm run test
+    - run: npm run bootstrap:prod
+    - run: npm run test:build
+    - name: Coveralls
+      uses: coverallsapp/github-action@master
+      with:
+        github-token: ${{ secrets.GITHUB_TOKEN }}
+  release:
+    if: github.event_name == 'push' && startsWith(github.event.head_commit.message, 'release:')
+    name: Release
+    runs-on: ubuntu-18.04
+    needs: [build]
+    steps:
+    - uses: actions/checkout@v2
+    - uses: actions/setup-node@v1
+      with:
+        node-version: 12
+        registry-url: https://registry.npmjs.org/
+    - run: git reset --hard
+    - run: |
+        git config --global user.email "gcaufy@gmail.com"
+        git config --global user.name "WePY CI"
+    - run: npm install
+    - run: npm run bootstrap
+    - run: git status
+    - run: git checkout .
+    - name: NPM release
+      env:
+        NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }}
+        GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
+      run: node ./scripts/ci-release.js
+    - run: git status
+    - run: git log
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 000000000..81504b816
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,43 @@
+# This is a basic workflow to help you get started with Actions
+
+name: Release
+
+# Controls when the action will run. Triggers the workflow on push or pull request
+# events but only for the master branch
+on:
+  push:
+    tags:
+      - '**'
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+      - name: Use Node.js ${{ matrix.node-version }}
+        uses: actions/setup-node@v1
+        with:
+          node-version: '10.19'
+      - run: npm install
+      - run: npm run bootstrap
+      - run: npm run test
+      - name: Set Tag Variable
+        id: vars
+        run: echo ::set-output name=tag::${GITHUB_REF:10}
+      - name: Check Tag
+        env:
+          RELEASE_VERSION: ${{ steps.vars.outputs.tag }}
+        run: |
+          echo $GITHUB_REF
+          echo $RELEASE_VERSION
+          echo ${{ steps.vars.outputs.tag }}
+
+      - name: Build dist
+        run: npm run build
+      - name: NPM release
+        env:
+          TAG_NAME: ${{ steps.vars.outputs.tag}}
+          NPM_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }}
+        run: |
+          echo "//registry.npmjs.org/:_authToken=${NPM_AUTH_TOKEN}" > ~/.npmrc
+          node ./scripts/npm-ci-release.js "$TAG_NAME"
+          node ./scripts/npm-tags.js "$TAG_NAME" next
diff --git a/.gitignore b/.gitignore
index 73301cd1c..4661b6c47 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,12 +3,12 @@ sftp-config.json
 diff
 log
 npm-debug.log
-lib/
 demo/
+.nyc_output/
 .vscode
 coverage
 lerna-debug.log
 /packages/*/lib
 .DS_Store
 .idea
-/yarn.lock
\ No newline at end of file
+/yarn.lock
diff --git a/.nycrc b/.nycrc
new file mode 100644
index 000000000..618c05384
--- /dev/null
+++ b/.nycrc
@@ -0,0 +1,3 @@
+{
+    "reporter": ["lcov", "text-summary"]
+}
diff --git a/.prettierrc.yml b/.prettierrc.yml
new file mode 100644
index 000000000..defc3755e
--- /dev/null
+++ b/.prettierrc.yml
@@ -0,0 +1,51 @@
+# 一行最多 120 字符
+printWidth: 120
+# 使用 2 个空格缩进
+tabWidth: 2
+# 不使用缩进符，而使用空格
+useTabs: false
+# 行尾不需要分号
+semi: true
+# 使用单引号
+singleQuote: true
+# 对象的 key 仅在必要时用引号
+quoteProps: as-needed
+# jsx 不使用单引号，而使用双引号
+jsxSingleQuote: false
+# 末尾不需要逗号
+trailingComma: none
+# 大括号内的首尾需要空格
+bracketSpacing: true
+# jsx 标签的反尖括号需要换行
+jsxBracketSameLine: false
+# 箭头函数，只有一个参数的时候，不需要括号
+arrowParens: avoid
+# 每个文件格式化的范围是文件的全部内容
+rangeStart: 0
+# 不需要写文件开头的 @prettier
+requirePragma: false
+# 不需要自动在文件开头插入 @prettier
+insertPragma: false
+# 使用默认的折行标准
+proseWrap: preserve
+# 根据显示样式决定 html 要不要折行
+htmlWhitespaceSensitivity: css
+# 换行符使用 lf
+endOfLine: lf
+# 后缀文件名特有规则
+overrides:
+  - files: '*.{wxss,less}'
+    options:
+      parser: less
+  - files: '*.json,.*rc'
+    options:
+      parser: json
+  - files: '*.{wxml,html}'
+    options:
+      parser: html
+      htmlWhitespaceSensitivity: strict
+      # 避免text标签换行
+      printWidth: 999
+  - files: '*.wxs'
+    options:
+      parser: babel
diff --git a/.travis.yml b/.travis.yml
index a00d65072..96fadb638 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,10 +1,29 @@
 language: node_js
 
 node_js:
-  - "6"
+  - '10'
+
+matrix:
+  include:
+    - os: linux
+    - os: osx
 
 sudo: false
+
+before_install:
+  - if [[ "$TRAVIS_OS_NAME" == "linux"                      ]] ; then sudo apt-get -qq update        ; fi
+  - if [[ "$TRAVIS_OS_NAME" == "linux" && ! $(which expect) ]] ; then sudo apt-get install -y expect ; fi
+  - if [[ "$TRAVIS_OS_NAME" == "osx"                        ]] ; then stty cols 80                   ; fi
+  - if [[ "$TRAVIS_OS_NAME" == "osx"                        ]] ; then brew update                    ; fi
+  - if [[ "$TRAVIS_OS_NAME" == "osx"   && ! $(which expect) ]] ; then brew install expect            ; fi
+
+install:
+  - 'npm install'
+  - 'npm run bootstrap'
+
 script:
-    - "npm run test"
-    - "bash ./scripts/gen.sh"
-after_script: "npm install coveralls && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage"
+  - 'npm run test'
+  - 'npm run bootstrap:prod'
+  - 'npm run test:build'
+
+after_script: 'npm install coveralls && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e68fb1235..26876ce5e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,254 +1,20 @@
-## 1.6.1 (comming soon)
-* `A` 添加了`cliLogs`配置项，为`true`时，会将CLI的报错信息注入到代码中，不用切回CLI去查看错误信息。[ISSUE 484](https://github.com/wepyjs/wepy/issues/484)
-* `F` 修复了组件使用`scoped`样式时，生成hash不一致的问题。[ISSUE 539](https://github.com/wepyjs/wepy/issues/539)
-* `F` 修复了源码目录里有空内容组件编译报错的问题。[ISSUE 538](https://github.com/wepyjs/wepy/issues/538)
-* `F` 修复了当模板格式错误时，编译报错的问题。
-* `F` 修复了引用带路径的NPM模块时，编译报错的问题。
-* `A` 配置文件中添加了`watchOption`参数。
-* `F` 修复了repeat中，使用静态props异常的问题。[PR 538](https://github.com/Tencent/wepy/pull/605)
-* `F` 修复了同页面跳转，可能会导致数据绑定失效的问题。[ISSUE 621](https://github.com/wepyjs/wepy/issues/621)
-
-## 1.6.0 (2017-10-25) 
-* `F` 修复了`@import scss`编译出错的问题。[ISSUE 303](https://github.com/wepyjs/wepy/issues/303)
-* `F` 修复了在repeat中使用静态传值不生效的问题。[ISSUE 204](https://github.com/wepyjs/wepy/issues/204)
-* `F` 修复了使用绝对路径跳转时，`onPrefetch`没被调用的问题。[ISSUE 244](https://github.com/wepyjs/wepy/issues/244)
-* `F` 修复了在组件中没有`<style>`节点报错的BUG。[ISSUE 160](https://github.com/wepyjs/wepy/issues/160)
-* `F` 修复了repeat中for变量为null或者undefined报错的问题。[PR 353](https://github.com/wepyjs/wepy/pull/353)
-* `A` 添加了computed的watch和sync功能。[ISSUE 318](https://github.com/wepyjs/wepy/issues/318)
-* `F` 修复了`--watch`模式下，修复外链文件可能不会触发编译的问题。
-* `F` 修复了repeat中传多个参数无效的BUG。[ISSUE 348](https://github.com/wepyjs/wepy/issues/348)
-* `D` 弃用babel-preset-2015。[ISSUE 407](https://github.com/wepyjs/wepy/issues/407)
-* `F` 修复引用第三方私有NPM组件编译报错的问题。[PR 398](https://github.com/wepyjs/wepy/pull/398)
-* `F` 修复getCurrentPages调用错误的问题。[PR 396](https://github.com/wepyjs/wepy/pull/396)
-* `F` 修复使用repeat时，默认数据为空引发的BUG。[PR 411](https://github.com/wepyjs/wepy/pull/411)
-* `F` 修复了使用第三方组件时，修改ouput属性导致引用错乱的BUG。[ISSUE 415](https://github.com/wepyjs/wepy/pull/415)
-* `A` 添加了`resolve`, `alias`的功能
-* `F` 修复了生成JSON时没有通过plugins处理的问题。[ISSUE 403](https://github.com/wepyjs/wepy/pull/403)
-* `F` 修复了组件中引用相对路径在某些情况下不准确的问题。[ISSUE 345](https://github.com/wepyjs/wepy/pull/345)
-* `F` 修复了repeat使用驼峰命名组件出现问题的BUG。[ISSUE 397](https://github.com/wepyjs/wepy/pull/397)
-* `F` 修复绑定多个事件传参时，参数混乱的问题。[ISSUE 385](https://github.com/wepyjs/wepy/pull/385)
-
-## 1.5.8 (2017-08-05)
-* `A` 添加了`appConfig`字段。[ISSUE 199](https://github.com/wepyjs/wepy/issues/199)
-* `F` 修复了使用缩进的`sass`语法时编译报错的问题。[ISSUE 208](https://github.com/wepyjs/wepy/issues/208)
-* `F` 修复了使用PUG编译时，首行不能缩进的问题。[ISSUE 211](https://github.com/wepyjs/wepy/issues/211)
-* `A` 添加组件 kebab-case 写法支持。[ISSUE 242](https://github.com/wepyjs/wepy/issues/242)
-* `F` 修复了当项目文件夹存在空文件时编译会卡死的问题。[ISSUE 253](https://github.com/wepyjs/wepy/issues/253)
-* `A` 添加了组件对`class`的支持。[ISSUE 255](https://github.com/wepyjs/wepy/issues/255)
-* `F` 修复了页面中使用`:class`无效的BUG。[ISSUE 257](https://github.com/wepyjs/wepy/issues/257)
-
-## 1.5.7 (2017-06-15)
-* `F` 修复了`App`中的`this`指向问题。
-* `F` 修复了`component`不支持mixin的onLoad的问题。[ISSUE 177](https://github.com/wepyjs/wepy/issues/177)
-* `F` 修复了引用第三方组件时，样式引用路径不对的问题。
-* `F` 修复了使用`pug`时，`props`不生效的问题。[ISSUE 186](https://github.com/wepyjs/wepy/issues/186)
-* `F` 修复了使用扩展运算符`...`时，编译不正确的问题。[ISSUE 190](https://github.com/wepyjs/wepy/issues/190)
-* `F` 修复了目录中包含src时，第三方组件编译路径不正确的问题。[ISSUE 183](https://github.com/wepyjs/wepy/issues/183)
-* `A` 添加数据的`watch`支持。[ISSUE 155](https://github.com/wepyjs/wepy/issues/155)
-
-## 1.5.6 (2017-05-22)
-* `F` 修复了特殊情况下require路径编译出错的问题。[ISSUE 128](https://github.com/wepyjs/wepy/issues/128)
-* `F` 修复了`wepy.createVideoContext`调用报错的问题。[ISSUE 133](https://github.com/wepyjs/wepy/issues/133)
-* `F` 修复了`should not change the protected attribute __wxWebviewId__`的warning。[ISSUE 143](https://github.com/wepyjs/wepy/issues/143)
-* `F` 修复了`output`参数不生效的问题。[ISSUE 145](https://github.com/wepyjs/wepy/issues/145)
-* `A` 添加了对`npm`的`scope`的支持，如`import sth from '@scoped/sth';`
-
-## 1.5.4 (2017-05-05)
-* `A` 添加`:class`标签支持，如`:class="{className: mycondition > 1}"`。[ISSUE #99](https://github.com/wepyjs/wepy/issues/99)
-* `F` 修复了在使用slot时，添加注释会导致编译报错的BUG。
-* `F` 修复了属性值中使用`>`会导致属性编译出错的BUG。[ISSUE #118](https://github.com/wepyjs/wepy/issues/118)
-* `F` 修复了在`onLoad`中使用`this.$redirect`报错的BUG。
-* `F` 修复了外链样式时，import路径错乱的BUG。
-* `F` 修复了空`<template>`节点编译报错的BUG。
-* `F` 修复了`<template>`中只有两个`component`时，只会显示一个的BUG。[ISSUE #123](https://github.com/wepyjs/wepy/issues/123)
-
-## 1.5.2 (2017-04-17)
-* `A` style标签添加了scoped属性的支持。[ISSUE #79](https://github.com/wepyjs/wepy/issues/79)
-* `F` 修改了项目外层有`src`目录会导致编译文件目录错乱的BUG。[ISSUE #91](https://github.com/wepyjs/wepy/issues/91)
-* `A` 添加了redux支持，使用`wepy new demo --redux`生成带有redux示例的DEMO。[PR #93](https://github.com/wepyjs/wepy/pull/93)
-* `F` 修复了手动删除dist目录时，不会自动生成`npm`文件的问题。
-
-
-
-## 1.5.1 (2017-03-27) 
-* `F` 修复了`onUnload`中直接赋值导致赋值失效的BUG。
-* `A` 添加了`wepy-compiler-babel`的sourceMap支持。
-* `A` 事件绑定优化，对于非原生事件，添加`.user`后缀也可识别。[PR #76](https://github.com/wepyjs/wepy/pull/76)
-* `A` 添加`page.$preload`方法，扩展`onLoad`的第二个参数为`preloadData`。
-* `A` 添加了`eslint`支持。[PR #80](https://github.com/wepyjs/wepy/pull/80)
-
-**感谢@dolymood的贡献**
-
-
-## 1.4.8 (2017-03-16)
-* `F` 修复了在data中的数据存在undefined的情况下会出现异常的BUG。
-* `F` 统一修复`$invoke`，`$broadcast`，`$emit`事件在执行完成时会出发`$apply`。
-* `A` 添加了`@`符号来代替`bind`和`catch`。[ISSUE #71](https://github.com/wepyjs/wepy/issues/71)
-* `A` 添加了组件自定义事件，如`@doSomething="someFunc"`。参考文档[组件自定义事件](https://github.com/wepyjs/wepy#组件自定义事件)。
-* `F` 修复demo默认使用`@`符。
-
-
-## 1.4.7 (2017-03-15)
-* `F` 修复1.4.6版本中只一个`props`生效的BUG。[ISSUE #68](https://github.com/wepyjs/wepy/issues/68)
-* `F` 修复了使用引用类型作为双向绑定不会触发父组件脏检查的BUG。
-* `F` 修复了在`template`的`root`元素为自定义组件会导致编译报错的BUG。[ISSUE #67](https://github.com/wepyjs/wepy/issues/67)
-
-
-## 1.4.6 (2017-03-14)
-* `F` 移除了编译过程中自动生成的`xmlns:wx`属性。
-* `F` 修改自带demo并发10个请求报错的BUG。
-* `F` 修复了项目在没有安装NPM资源，时使用wepy报错的BUG。
-* `A` 添加了repeat标签，代替`<block wx:for></block>`。
-* `F` 修复了在`wx:for`中使用自定义组件时，使用props无法取值的BUG。
-* `A` 在默认demo中添加了repeat示例。
-* `F` 修复了使用pug出错时的错误提示。
-
-## 1.4.5 (2017-03-07)
-* `F` 修复了组件未定义`methods`时，使用`$invoke`报错的BUG。
-* `F` 使用空template报错的BUG。
-* `A` 添加了`computed`属性。
-* `A` 添加了`onRoute`事件。
-* `A` `wepy-cli`添加了`--empty`选项，`wepy new demo --empty`用于生成空项目。
-
-
-## 1.4.4 (2017-02-28)
-* `F` 修复`$invoke`事件`event`参数错误的BUG。[PR #50](https://github.com/wepyjs/wepy/issues/50)
-* `F` 修复`onShareAppMessage`报错的问题。[PR #52](https://github.com/wepyjs/wepy/issues/52)
-* `F` 修复了在没有申明`data`时使用`props`报错的BUG。[PR #54](https://github.com/wepyjs/wepy/issues/54)
-
-## 1.4.3 (2017-02-22)
-* `F` 修复调用原生api参数报错的BUG。
-* `A` 添加wepy-plugin-replace插件。
-* `F` 修复了Mixin事件中，event丢失的BUG。[PR #40](https://github.com/wepyjs/wepy/pull/40)
-* `F` 修复了IOS 1.10.2 中Promise.resolve没被调用的BUG。
-* `F` 修复了Mixin的自定义事件无效的BUG。[ISSUE #44](https://github.com/wepyjs/wepy/issues/44)
-* `F` 修复了SASS和SCSS编译混乱的BUG。[ISSUE #43](https://github.com/wepyjs/wepy/issues/43)
-* `A` 解决了不支持`moment.js`的问题。[ISSUE #45](https://github.com/wepyjs/wepy/issues/45)
-* `F` 优化了wepy使用async/await的方式，不再依赖`babel-polyfill`。
-* `F` 生成DEMO默认使用`async/await`。
-* `A` 组件支持`'hidden', 'wx:if', 'wx:elif', 'wx:else'`四个属性。[PR #47](https://github.com/wepyjs/wepy/pull/47)
-
-**感谢@shenqihui的贡献**
-
-## 1.4.2 (2017-02-09)
-* 添加slot支持，参看[slot说明](https://github.com/wepyjs/wepy#组件内容分发slot)。
-* 更新最新template支持slot。
-
-## 1.4.1 (2017-01-26)
-* 修复了`onShareAppMessage`在所有页面都生效的问题。
-* 修改了`bind/catch`事件的传参机制，支持传入非String类型参数。
-* 修改了页面响应事件和组件通讯事件的参数顺序，改为默认最后一个参数为$event。
-* 不再会重写wx原有API，例如使用wepy.request代替wx.request。
-* 添加了两个API：app.use()，app.intercept()，参看[拦截器说明](https://github.com/wepyjs/wepy#拦截器)。
-* 不再默认添加Promise polyfill支持，需要手动import，然后使用`app.use('promisify')`。
-* 不再默认处理request并发问题，需要手动调用`app.use('requestfix')`。
-* 不再默认支持async/await，需要手动引入`babel-polyfill`。
-* 将默认npm目录压缩后的大小由170kb减少至23kb。
-
-**以上改动将不向下兼容，升级前请查看[迁移指南](https://github.com/wepyjs/wepy/wiki/%E5%8D%87%E7%BA%A7%E6%8C%87%E5%8D%97#13x---141)**
-
-
-## 1.3.11 (2017-01-16)
-* 页面和组件均添加`$wxapp`和`$wxpage`属性
-* 添加了`wepy-plugin-filemin`，可以压缩`wxml`和`json`文件。
-* 修复了`onShareAppMessage` API 不生效的问题。
-* 修复了组件template使用pug时不会编译的问题。
-* 加入了node版本检测功能，低于Node版本低于5时提示更新Node版本。
-
-## 1.3.10 (2017-01-10)
-* 修复了less文件中使用import找不到路径的BUG。
-* 修复了prop默认值混乱的BUG。
-* 修复了prop默认值不会触发coerce的BUG。
-* 优化编译过程中的一个报错提示。
-
-## 1.3.9 (2017-01-05)
-* 修复了wx.createCanvasContext在prmoise下报错的问题。
-* 添加了`.wepyignore`忽略编译一些非必要文件。[ISSUE 12](https://github.com/wepyjs/wepy/issues/12)。
-* 添加了typescript支持，wepy-compile-typescript。
-* 添加了stylus支持，wepy-compile-stylus。
-
-## 1.3.8 (2016-12-30)
-* 修改组件原属性`name`，`prefix`为`$name`，`$prefix`。防止命名冲突的问题，参见[Issue](https://github.com/wepyjs/wepy/issues/8)。
-* 修复了编译过程中的日志错误的问题。
-* 简化语法，可以使用`:myprop`代替`v-bind:myprop`。
-* 使用props时，添加了`once`和`sync`关键字，`:myprop.once="data"`：当父组件data改变时，不会修改子组件的myprop的值，除非将`once`改为`sync`关键字。默认为`once`
-* 子组件申明props时，添加了`twoWay`选项，为false时，子组件数据变更不影响父组件。为true时，同步到父组件。
-* 1.3.6版本后props默认父子互相不影响，除非加上`sync`和`twoWay`的属性。
-* 编译时加入了版本检测，cli如果检测到wepy不符合版本要求会自动更新wepy版本。
-
-## 1.3.5 (2016-12-23)
-* 修复了升级1.3.3导致旧项目报`id is not defined`的错误。
-* 发布过程中加入了LF强制转换逻辑，确保MAC在更新后不会出现`env: node\r: No such file or directory`的错误。
-* 修复了用`<component>`时，导致样式丢失的问题。
-* 修复了用`<component>`时，props不工作的问题。
-* 更新了`wepy-wechat-demo`使用自定义component与props，并添加toast组件。
-
-## 1.3.3 (2016-12-22)
-* 修复了config使用单引号导致解析出错的问题。感谢[@Lxxyx]()
-* 支持自定义组件标签，`<component id="mycom" path="mycom"></component>` 优化为 `<mycom></mycom>`。
-* 新增props传值功能，支持静态传值如 `num="50"` 或者绑定传值如 `v-bind:num="parentnum"`，使用方式基于与[Vue Props传值](https://vuejs.org.cn/guide/components.html#Props)一致。
-* 修复了组件支持事件传参，但页面不支持的问题。
-
-
-## 1.3.2 (2016-12-19)
-* 修复wx:else, scroll-x等boolean属性报warning的[问题](https://github.com/wepyjs/wepy/issues/5)。
-* 修复了组件method不存在时，mixin的method不会被注册的BUG。感谢[@huike1989]()。
-* 修复了引用第三方组件路径报错的BUG。感谢[@huike1989]()。
-
-## 1.3.1 (2016-12-16)
-* 新增对第三方Compiler的支持。
-* 新增pug编译器。
-* 重新整理代码结构，使用lerna维护不同的NPM包。
-* 重新处理Plugins，同样交由第三方包处理。
-* 添加了编译时检测依赖的Compiler或者Plugins是否缺失的逻辑，如果缺失会自行安装。
-* 添加了cli工具版本检测的功能。
-
-*老版本在升级1.3.1版本时，要修改`wepy.config.js`并且添加compilers属性，并且安装对应的编译器方可使用。[参考这里](https://github.com/wepyjs/wepy#wepyconfigjs-配置文件说明)*
-
-
-## 1.1.9 (2016-12-14)
-* 新增了wepy upgrade命令升级wepyjs版本。
-* 新增对第三方组件的支持。
-* 新增第三方组件[wepy-com-toast](https://github.com/wepyjs/wepy-com-toast)。
-* 模板中添加toast组件测试。
-
-
-## 1.1.8 (2016-12-08)
-* 修复了script使用src外链报错的BUG。
-* 修复了LESS编译会调用到SASS的BUG。
-* 优化了事件传参数，支持直接传参。详情[参考文档](https://github.com/wepyjs/wepy#2-优化事件参数传递)。
-* 加入了Travis-CI以及Coveralls。
-* 修复其它细节BUG问题
-
-## 1.1.7 (2016-12-06)
-* script/template/style的属性同时支持type和lang。
-* 添加mixins支持，详情请[参考文档](https://github.com/wepyjs/wepy#混合)。
-
-## 1.1.6 (2016-12-02)
-* 修复了组件ID大写导致无法识别的问题。
-* 添加了对小程序页面所有响应事件的支持。
-* 修改wepy.config.js支持plugins。
-* 添加UglifyJsPlugin，在编译时对生成的所有JS文件进行压缩。
-* 添加ImageMinPlugin(不推荐使用，处理大图片时还有问题)，
-* 添加`wepy build --no-cache`参数，编译时会重新编译所有依赖文件。
-* `wepy new demo`时，由在当前目录下生成项目改为创建demo目录，然后再生成项目。
-* 更新生成demo支持最新功能。
-
-## 1.1.4 (2016-12-01)
-
-* 添加了小程序其它页面事件的支持
-* 修改默认配置文件.wepyrc为wepy.config.js，方便以后功能扩展。（兼容老配置文件）
-
-## 1.1.3 (2016-11-28)
-
-* 修复SASS编译异常导致watch结束的BUG
-* 修复子组件修改时不会触发父组件更新的BUG
-* 修复`$invoke('../')`的BUG
-* 修复页面onLoad事件中传参的BUG
-
-## 1.1.1 (2016-11-23)
-
-* 添加了对sass/scss的编译支持
-* .wepyrc中加入对less/sass的配置支持
-* .wepyrc中添加`wpyExt`选项
-* 更新生成模板
+# Change Log
+
+## 2.1.0 (2020-07-04) (beta)
+
+#### :rocket: New Feature
+* `core`
+  * [#2634](https://github.com/Tencent/wepy/pull/2634) feat: added routed lifecycle ([@Gcaufy](https://github.com/Gcaufy))
+* `babel-plugin-import-regenerator`, `cli`, `compiler-babel`, `compiler-less`, `compiler-postcss`, `compiler-sass`, `compiler-stylus`, `compiler-typescript`, `core`, `plugin-define`, `plugin-eslint`, `plugin-uglifyjs`, `redux`, `use-intercept`, `use-promisify`, `x`
+  * [#2620](https://github.com/Tencent/wepy/pull/2620) feat: added ci npm release support ([@Gcaufy](https://github.com/Gcaufy))
+
+#### :bug: Bug Fix
+* `core`
+  * [#2633](https://github.com/Tencent/wepy/pull/2633) fix(core): 修复了 type 必填的问题 ([@Gcaufy](https://github.com/Gcaufy))
+
+#### Committers: 5
+- Damon Chen ([@chenyu445](https://github.com/chenyu445))
+- Deep ([@deepfunc](https://github.com/deepfunc))
+- Gcaufy ([@Gcaufy](https://github.com/Gcaufy))
+- Sail ([@dlhandsome](https://github.com/dlhandsome))
+- 这也太那个了吧 ([@dev-itsheng](https://github.com/dev-itsheng))
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 7d6861eff..4ff79a50d 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,49 +1,102 @@
 # Contributing
 
+我们提倡您通过提 issue 和 pull request 方式来促进 WePY 的发展。
 
-欢迎任意形式的贡献。
 
-## Issues
+## Acknowledgements
 
+非常感谢以下几位贡献者对于 WePY 的做出的贡献：
 
-* BUG 上报
-如果 WePY 不工作或者异常，确认是 WePY 本身问题并且在 Issue 中搜索未找到答案时，欢迎提 Issue 讨论。
+- dlhandsome [awsomeduan@gmail.com](mailto:awsomeduan@gmail.com)
+- dolymood [dolymood@gmail.com](mailto:dolymood@gmail.com)
+- baisheng [baisheng@gmail.com](mailto:baisheng@gmail.com)
+- deepfunc [xiekai0601@gmail.com](mailto:xiekai0601@gmail.com)
+- nishino-tsukasa [nishinotsukasavirgo@gmail.com](mailto:nishinotsukasavirgo@gmail.com)
 
-* 新功能支持
-如果你觉得 WePY 存在不足的地方，或者有更好的 idea，欢迎提 Issue 讨论。
+其中特别致谢 dlhandsome 提交的38个 commits, 对 WePY 做出了1,350增加和362处删减(截止02/28/18日)。
 
-* 问题讨论
-如果你对 WePY 存在疑问或者不确定的地方，欢迎提 Issue 讨论。
+WePY 持续招募贡献者，即使是在 issue 中回答问题，或者做一些简单的 bugfix ，也会给 WePY 带来很大的帮助。
 
+WePY 已开发近一年，在此感谢所有开发者对于 WePY 的喜欢和支持，希望你能够成为 WePY 的核心贡献者，加入 WePY ，共同打造一个更棒的小程序开发框架！🍾🎉
 
-## Pull requests
+​                       
 
-* 开发调试代码
+## Issue 提交
 
+#### 对于贡献者
+
+在提 issue 前请确保满足一下条件：
+
+- 必须是一个 bug 或者功能新增。
+- 必须是 WePY 相关问题，原生小程序问题去[开发者论坛](https://developers.weixin.qq.com/)。
+- 已经在 issue 中搜索过，并且没有找到相似的 issue 或者解决方案。
+- 完善下面模板中的信息
+
+如果已经满足以上条件，我们提供了 issue 的标准模版，请按照模板填写。
+
+​             
+
+##  Pull request
+
+我们除了希望听到您的反馈和建议外，我们也希望您接受代码形式的直接帮助，对我们的 GitHub 发出 pull request 请求。
+
+以下是具体步骤：
+
+#### Fork仓库
+
+点击 `Fork` 按钮，将需要参与的项目仓库 fork 到自己的 Github 中。
+
+#### Clone 已 fork 项目
+
+在自己的 github 中，找到 fork 下来的项目，git clone 到本地。
+
+```bash
+$ git clone git@github.com:<yourname>/wepy.git
+```
+
+#### 添加 WePY 仓库
+
+将 fork 源仓库连接到本地仓库：
+
+```bash
+$ git remote add <name> <url>
+# 例如：
+$ git remote add wepy git@github.com:Tencent/wepy.git
 ```
-# Download code
-git clone git@github.com:wepyjs/wepy.git
 
-cd wepy
+#### 保持与 WePY 仓库的同步
+
+更新上游仓库：
+
+```bash
+$ git pull --rebase <name> <branch>
+# 等同于以下两条命令
+$ git fetch <name> <branch>
+$ git rebase <name>/<branch>
+```
+
+#### commit 信息提交
+
+commit 信息请遵循[commit消息约定](./CONTRIBUTING_COMMIT.md)，以便可以自动生成 `CHANGELOG` 。具体格式请参考 commit 文档规范。
+
 
-# Start
-# This command will generate `wepy-dev` and `wepy-debug` command for you
-npm run bootstrap
 
+#### 开发调试代码
 
+```bash
 # Build code
-npm run build
+$ npm run build
 
 # Watch
-npm run watch
+$ npm run watch
 
 # Run test cases
-npm run test
+$ npm run test
 
 # Useage
-wepy build # Global wepy you installed by npm
+$ wepy build # Global wepy you installed by npm
 
-wepy-dev build # Local wepy you compiled by your local repository
+$ wepy-dev build # Local wepy you compiled by your local repository
 
-wepy-debug build # Debug local wepy using node --inspect
+$ wepy-debug build # Debug local wepy using node --inspect
 ```
diff --git a/CONTRIBUTING_COMMIT.md b/CONTRIBUTING_COMMIT.md
new file mode 100644
index 000000000..959e7cce0
--- /dev/null
+++ b/CONTRIBUTING_COMMIT.md
@@ -0,0 +1,102 @@
+# Commit规范
+
+在对项目作出更改后，我们需要生成 commit 来记录自己的更改。以下是参照 Angular 对 commit 格式的规范：
+
+## (1) 格式
+
+提交信息包括三个部分：`Header`，`Body` 和 `Footer`。
+
+```
+<Header>
+
+<Body>
+
+<Footer>
+```
+
+其中，Header 是必需的，Body 和 Footer 可以省略。
+
+#### 1> Header
+
+Header 部分只有一行，包括俩个字段：`type`（必需）和`subject`（必需）。
+
+```
+<type>: <subject>
+```
+
+**type**
+
+type 用于说明 commit 的类别，可以使用如下类别：
+
+- feat：新功能（feature）
+- fix：修补bug
+- doc：文档（documentation）
+- style： 格式（不影响代码运行的变动）
+- refactor：重构（即不是新增功能，也不是修改bug的代码变动）
+- test：增加测试
+- chore：构建过程或辅助工具的变动
+
+**subject**
+
+subject 是 commit 目的的简短描述。
+
+- 以动词开头，使用第一人称现在时，比如改变，而不是改变了。
+- 结尾不加句号（。）
+
+#### 2> Body
+
+Body 部分是对本次 commit 的详细描述，可以分成多行。下面是一个范例。
+
+```
+More detailed explanatory text, if necessary.  Wrap it to 
+about 72 characters or so. 
+
+Further paragraphs come after blank lines.
+
+- Bullet points are okay, too
+- Use a hanging indent
+```
+
+**注意：**应该说明代码变动的动机，以及与以前行为的对比。
+
+#### 3> Footer
+
+​	Footer 部分应该包含：(1)Breaking Changes;  (2)关闭 issue；
+
+​	**Breaking Changes**：
+
+​	如果当前代码与上一个版本不兼容，则 Footer 部分以`BREAKING CHANGE`开头，后面是对变动的描述、以及变动理由和迁移方法。这种使用较少，了解即可。
+
+​	**Issue 部分：**
+
+- 通过 commit 关联 issue：
+
+  如果当前提交信息关联了某个 issue，那么可以在 Footer 部分关联这个 issue：
+
+  ```
+  issue #2
+  ```
+
+- 通过 commit 关闭 issue，当提交到**默认分支**时，提交信息里可以使用 `fix/fixes/fixed` ， `close/closes/closed` 或者 `resolve/resolves/resolved`等关键词，后面再跟上 issue 号，这样就会关闭这个 issue：
+
+```
+Closes #1
+```
+
+​	注意，如果不是提交到默认分支，那么并不能关闭这个 issue，但是在这个 issue 下面会显示相关的信息表示曾经想要关闭这个 issue，当这个分支合并到默认分支时，就可以关闭这个 issue 了。
+
+#### 4> 例子
+
+下面是一个完整的例子：
+
+```
+feat: 添加了分享功能
+
+给每篇文章添加了分享功能
+
+- 添加分享到微信功能
+- 添加分享到朋友圈功能
+
+Issue #1, #2
+Closes #1
+```
diff --git a/LICENSE b/LICENSE
index f3c94a08f..35f6a81a6 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Tencent is pleased to support the open source community by making WePY available.  
+Tencent is pleased to support the open source community by making WePY available.
 Copyright (C) 2017 THL A29 Limited, a Tencent company.  All rights reserved.
 If you have downloaded a copy of the WePY binary from Tencent, please note that the WePY binary is licensed under the MIT License.
 If you have downloaded a copy of the WePY source code from Tencent, please note that WePY source code is licensed under the MIT License, except for the third-party components listed below which are subject to different license terms.  Your integration of WePY into your own projects may require compliance with the MIT License, as well as the other licenses applicable to the third-party components included within WePY.
@@ -6,7 +6,7 @@ A copy of the MIT License is included in this file.
 
 Other dependencies and licenses:
 
-Open Source Software Licensed Under the BSD 3-Clause License: 
+Open Source Software Licensed Under the BSD 3-Clause License:
 ----------------------------------------------------------------------------------------
 1. istanbul  0.4.5
 Copyright 2012 Yahoo! Inc.
@@ -24,7 +24,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 
 
 
-Open Source Software Licensed Under the MIT License: 
+Open Source Software Licensed Under the MIT License:
 ----------------------------------------------------------------------------------------
 1. bable  6.5.2
 Copyright (c) 2014-2016 Sebastian McKenzie <sebmck@gmail.com>
@@ -48,8 +48,8 @@ Copyright (c) 2014 Forbes Lindesay
 7. postcss  5.2.16
 Copyright 2013 Andrey Sitnik <andrey@sitnik.ru>
 
-8. node-sass  4.0.0
-Copyright (c) 2013-2016 Andrew Nesbitt
+8. sass  4.0.0
+Copyright (c) Natalie Weizenbaum <nweiz@google.com>
 
 9. stylus  0.54.5
 Copyright (c) Automattic <developer.wordpress.com>
diff --git a/README.md b/README.md
index 88b9b6110..d32259534 100644
--- a/README.md
+++ b/README.md
@@ -1,86 +1,94 @@
-## WePY
+[English](./README_EN.md) | 简体中文
+
+## WePY 2 (beta)
 
 [![npm version](https://badge.fury.io/js/wepy.svg)](https://badge.fury.io/js/wepy)
-[![travis-ci](https://travis-ci.org/Tencent/wepy.svg?branch=master)](https://travis-ci.org/Tencent/wepy)
-[![Coverage Status](https://coveralls.io/repos/github/Tencent/wepy/badge.svg?branch=master)](https://coveralls.io/github/Tencent/wepy?branch=master)
+[![travis-ci](https://travis-ci.org/Tencent/wepy.svg?branch=1.7.x)](https://travis-ci.org/Tencent/wepy)
+![Github CI](https://github.com/Tencent/wepy/workflows/WePY%20CI%20Build/badge.svg?branch=2.0.x)
+[![Coverage Status](https://coveralls.io/repos/github/Tencent/wepy/badge.svg?branch=1.7.x)](https://coveralls.io/github/Tencent/wepy?branch=1.7.x)
 [![Dependency Status](https://david-dm.org/Tencent/wepy.svg)](https://david-dm.org/Tencent/wepy)
 
 ### 介绍
 
-WePY资源汇总：[awesome-wepy](https://github.com/aben1188/awesome-wepy)
+WePY 资源汇总：[awesome-wepy](https://github.com/aben1188/awesome-wepy)
 
-WePY 是一款让小程序支持组件化开发的框架，通过预编译的手段让开发者可以选择自己喜欢的开发风格去开发小程序。框架的细节优化，Promise，Async Functions的引入都是为了能让开发小程序项目变得更加简单，高效。
+WePY (发音: /'wepi/)是一款让小程序支持组件化开发的框架，通过预编译的手段让开发者可以选择自己喜欢的开发风格去开发小程序。框架的细节优化，Promise，Async Functions 的引入都是为了能让开发小程序项目变得更加简单，高效。
 
-同时WePY也是一款成长中的框架，大量吸收借鉴了一些优化前端工具以及框架的设计理念和思想。如果WePY有不足地方，或者你有更好的想法，欢迎提交ISSUE或者PR。
+同时 WePY 也是一款成长中的框架，大量吸收借鉴了一些优化前端工具以及框架的设计理念和思想。如果 WePY 有不足地方，或者你有更好的想法，欢迎提交 ISSUE 或者 PR。
 
 
 ### 特性：
 
-* 类Vue开发风格
-* 支持自定义组件开发
-* 支持引入NPM包
-* 支持[Promise](https://github.com/wepyjs/wepy/wiki/wepy%E9%A1%B9%E7%9B%AE%E4%B8%AD%E4%BD%BF%E7%94%A8Promise)
-* 支持ES2015+特性，如[Async Functions](https://github.com/wepyjs/wepy/wiki/wepy%E9%A1%B9%E7%9B%AE%E4%B8%AD%E4%BD%BF%E7%94%A8async-await)
-* 支持多种编译器，Less/Sass/Styus、Babel/Typescript、Pug
-* 支持多种插件处理，文件压缩，图片压缩，内容替换等
-* 支持 Sourcemap，ESLint等
-* 小程序细节优化，如请求列队，事件优化等
-
+- 类 Vue 开发风格
+- 支持自定义组件开发
+- 支持引入 NPM 包
+- 支持 [Promise](https://github.com/wepyjs/wepy/wiki/wepy%E9%A1%B9%E7%9B%AE%E4%B8%AD%E4%BD%BF%E7%94%A8Promise)
+- 支持 ES2015+ 特性，如 [Async Functions](https://github.com/wepyjs/wepy/wiki/wepy%E9%A1%B9%E7%9B%AE%E4%B8%AD%E4%BD%BF%E7%94%A8async-await)
+- 支持多种编译器，Less/Sass/Stylus/PostCSS、Babel/Typescript、Pug
+- 支持多种插件处理，文件压缩，图片压缩，内容替换等
+- 支持 Sourcemap，ESLint 等
+- 小程序细节优化，如请求列队，事件优化等
 
 ### Demo
 
 ```html
 <style lang="less">
-    @color: #4D926F;
-    .userinfo {
-        color: @color;
-    }
+@color: #4D926F;
+  .num {
+  color: @color;
+  }
 </style>
-<template lang="pug">
-    view(class='container')
-        view(class='userinfo' @tap='tap')
-            mycom(:prop.sync='myprop' @fn.user='myevent')
-            text {{now}}
+<template>
+  <div class="container">
+    <div class="num" @tap="num++">
+      {{num}}
+    </div>
+    <custom-component></custom-component>
+    <vendor-component></vendor-component>
+    <div>{{text}}</div>
+    <input v-model="text"/>
+  </div>
 </template>
+<config>
+{
+  usingComponents: {
+    customComponent: '@/components/customComponent',
+    vendorComponent: 'module:vendorComponent'
+  }
+}
+</config>
 
 <script>
-    import wepy from 'wepy';
-    import mycom from '../components/mycom';
-
-    export default class Index extends wepy.page {
-        
-        components = { mycom };
-        data = {
-            myprop: {}
-        };
-        computed = {
-            now () { return +new Date(); }
-        };
-        async onLoad() {
-            await sleep(3);
-            console.log('Hello World');
-        }
-        sleep(time) {
-            return new Promise((resolve, reject) => setTimeout(() => resolve, time * 1000));
-        }
-    }
+  import wepy from '@wepy/core';
+
+  wepy.page({
+    data: {
+      num: 0,
+      text: 'Hello World',
+    },
+  });
 </script>
 ```
 
-
-
 ### 安装使用
 
 #### 安装（更新） wepy 命令行工具。
 
 ```console
-npm install wepy-cli -g
+npm install @wepy/cli@next -g
 ```
 
 #### 生成开发示例
 
 ```console
-wepy new myproject
+wepy init standard myproject
+```
+
+#### 安装依赖
+
+```console
+cd myproject
+npm install
 ```
 
 #### 开发实时编译
@@ -89,53 +97,79 @@ wepy new myproject
 wepy build --watch
 ```
 
-#### 开发者工具使用
+#### 开发者工具导入项目
 
-1. 使用`微信开发者工具`新建项目，本地开发选择`dist`目录。
-2. `微信开发者工具`-->项目-->关闭ES6转ES5。<font style="color:red">重要：漏掉此项会运行报错。</font>
-3. `微信开发者工具`-->项目-->关闭上传代码时样式自动补全 <font style="color:red">重要：某些情况下漏掉此项会也会运行报错。</font>
-4. `微信开发者工具`-->项目-->关闭代码压缩上传 <font style="color:red">重要：开启后，会导致真机computed, props.sync 等等属性失效。[#270](https://github.com/wepyjs/wepy/issues/270)</font>
-5. 项目根目录运行`wepy build --watch`，开启实时编译。
+使用`微信开发者工具`新建项目，本地开发选择项目根目录，会自动导入项目配置。
 
 ### 哪些小程序是用 WePY 开发的
 
-阅邻二手书、
-[深大的树洞](https://github.com/jas0ncn/szushudong)、
+腾讯疫苗查询小程序、
+腾讯翻译君小程序、
+腾讯地图小程序、
+玩转故宫小程序、
 手机充值+、
-爱羽客羽毛球、
-小小羽球、
-七弦琴大数据、
-七弦琴小助手、
-培恩医学、
-公务员朝夕刷题、
-独角兽公司、
+手机余额查询、
+手机流量充值优惠、
+[友福图书馆](https://library.ufutx.com)[（开源）](https://github.com/glore/library)、
+[素洁商城](https://github.com/dyq086/wxYuHanStore)[（开源）](https://github.com/dyq086/wxYuHanStore)、
+[NewsLite](https://github.com/yshkk/shanbay-mina)[（开源）](https://github.com/yshkk/shanbay-mina)、
+[西安找拼车](https://github.com/chenqingspring)[（开源）](https://github.com/chenqingspring)、
+[深大的树洞](https://github.com/jas0ncn/szushudong)[（开源）](https://github.com/jas0ncn/szushudong)、
+[求知微阅读](https://github.com/KingJeason/wepy-books)[（开源）](https://github.com/KingJeason/wepy-books)、
+[给你的 iPhone X 换个发型](https://bangs.baran.wang/)、
+[天天跟我买](http://www.xiaohongchun.com.cn/index)、
+[坚橙](https://zhanart.com/wepy.html)、
+群脱单、
+米淘联盟、
+帮助圈、
+众安保险福利、
+阅邻二手书、
+趣店招聘、
+[满熊阅读（开源：](https://github.com/Thunf/wepy-demo-bookmall) [微信小程序](https://github.com/Thunf/wepy-demo-bookmall)、[支付宝小程序）](https://github.com/Thunf/wepy-demo-bookmall/tree/alipay)、
+育儿柚道、
+平行进口报价内参、
+GitHub 掘金版、
+班级群管、
+鲜花说小店、
 逛人备忘、
 英语助手君、
-农资优选、
 花花百科、
+独角兽公司、
+爱羽客羽毛球、
 斑马小店、
-鲜花说小店、
-[趣店招聘](http://7xrhcw.com1.z0.glb.clouddn.com/wechat_default_300.jpg)、
-[满🐻阅读](http://7xrhcw.com1.z0.glb.clouddn.com/wechat_default_344.jpg) + 代码简例[wepy-demo-bookmall](https://github.com/Thunf/wepy-demo-bookmall)、
-[平行进口报价内参](https://miniapp.ourauto.club/qrcode.jpg)、
-[求知微阅读(完全开源)](https://github.com/KingJeason/wepy-books)、
-[坚橙](https://zhanart.com/wepy.html)
+小小羽球、
+培恩医学、
+农资优选、
+公务员朝夕刷题、
+七弦琴小助手、
+七弦琴大数据、
+爽到家小程序、
+[应用全球排行](https://github.com/szpnygo/wepy_ios_top)[（开源）](https://github.com/szpnygo/wepy_ios_top)、
+[we 川大](https://github.com/mohuishou/scuplus-wechat)[（开源）](https://github.com/mohuishou/scuplus-wechat)、
+聊会儿、
+[诗词墨客](https://github.com/huangjianke/weapp-poem)[（开源）](https://github.com/huangjianke/weapp-poem)、
+[南京邮电大学](https://github.com/GreenPomelo/Undergraduate)[（开源）](https://github.com/GreenPomelo/Undergraduate)
+
 ...
 
 ### 交流群
- 
- WePY 交流群已满500人，请加 gcaufy_helper 好友或者扫码加好友，验证回复 `wepy` 按照指引进群。
 
- ![wepy_qr_code](https://user-images.githubusercontent.com/2182004/32309877-8bded674-bfc9-11e7-9daa-9ba4012690fb.png)
+WePY 交流群已满 500 人，请加 gcaufy_helper 好友或者扫码加好友，验证回复 `wepy` 按照指引进群。
 
+![wepy_qr_code](https://user-images.githubusercontent.com/2182004/82732473-feb50c80-9d3f-11ea-9a5f-0efc6ce40f74.png)
+
+### 参与贡献
+
+如果你有好的意见或建议，欢迎给我们提 Issues 或 Pull Requests，为提升微信小程序开发体验贡献力量。<br>详见：[CONTRIBUTING.md](./CONTRIBUTING.md)
+
+[腾讯开源激励计划](https://opensource.tencent.com/contribution) 鼓励开发者的参与和贡献，期待你的加入。
 
 ### Links
 
 [Documentation](https://tencent.github.io/wepy/)
 
-[Changelog](https://tencent.github.io/wepy/#/CHANGELOG)
-
-[Contributing](https://github.com/tencent/wepy/blob/master/CONTRIBUTING.md)
+[Changelog](https://tencent.github.io/wepy/document.html#/changelog)
 
-[License MIT](https://github.com/tencent/wepy/blob/master/LICENSE)
+[Contributing](./CONTRIBUTING.md)
 
+[License MIT](./LICENSE)
diff --git a/README_EN.md b/README_EN.md
new file mode 100644
index 000000000..96726eb1f
--- /dev/null
+++ b/README_EN.md
@@ -0,0 +1,175 @@
+English | [简体中文](./README.md)
+
+## WePY 2 (beta)
+
+[![npm version](https://badge.fury.io/js/wepy.svg)](https://badge.fury.io/js/wepy)
+[![travis-ci](https://travis-ci.org/Tencent/wepy.svg?branch=1.7.x)](https://travis-ci.org/Tencent/wepy)
+![Github CI](https://github.com/Tencent/wepy/workflows/WePY%20CI%20Build/badge.svg?branch=2.0.x)
+[![Coverage Status](https://coveralls.io/repos/github/Tencent/wepy/badge.svg?branch=1.7.x)](https://coveralls.io/github/Tencent/wepy?branch=1.7.x)
+[![Dependency Status](https://david-dm.org/Tencent/wepy.svg)](https://david-dm.org/Tencent/wepy)
+
+### Introduce
+
+WePY resource summary：[awesome-wepy](https://github.com/aben1188/awesome-wepy)
+
+WePY (pronounced: /'wepi/) is a framework that enables componentization of small programs by pre-compiling them so that developers can choose their own development style.Details optimization of the framework, the introduction of Promise and Async Functions are all aimed at making it easier and more efficient to develop applets.
+
+At the same time, WePY is also a growing framework, drawing heavily on the design concepts and ideas of some front-end optimization tools and frameworks.If WePY has a problem, or if you have a better idea, feel free to submit an ISSUE or PR.
+
+
+### Features:
+
+- Class Vue development style
+- Support for custom component development
+- Support for introducing NPM packages
+- support [Promise](https://github.com/wepyjs/wepy/wiki/wepy%E9%A1%B9%E7%9B%AE%E4%B8%AD%E4%BD%BF%E7%94%A8Promise)
+- Support for ES2015+ features，如 [Async Functions](https://github.com/wepyjs/wepy/wiki/wepy%E9%A1%B9%E7%9B%AE%E4%B8%AD%E4%BD%BF%E7%94%A8async-await)
+- Supports multiple compilers, Less/Sass/Stylus/PostCSS, Babel/Typescript, Pug
+- Supports a variety of plug-in processing, file compression, image compression, content replacement, etc
+- Supports Sourcemap, ESLint, etc
+- Small program details optimization, such as request queuing, event optimization, etc
+
+### Demo
+
+```html
+<style lang="less">
+@color: #4D926F;
+  .num {
+  color: @color;
+  }
+</style>
+<template>
+  <div class="container">
+    <div class="num" @tap="num++">
+      {{num}}
+    </div>
+    <custom-component></custom-component>
+    <vendor-component></vendor-component>
+    <div>{{text}}</div>
+    <input v-model="text"/>
+  </div>
+</template>
+<config>
+{
+  usingComponents: {
+    customComponent: '@/components/customComponent',
+    vendorComponent: 'module:vendorComponent'
+  }
+}
+</config>
+
+<script>
+  import wepy from '@wepy/core';
+
+  wepy.page({
+    data: {
+      num: 0,
+      text: 'Hello World',
+    },
+  });
+</script>
+```
+
+### Usage
+
+#### Install (upgrade) the WEPY command-line tool.
+
+```bash
+npm install @wepy/cli@next -g
+```
+
+#### Get start with an example
+
+```console
+wepy init standard myproject
+```
+
+#### Install dependencies
+
+```console
+cd myproject
+npm install
+```
+
+#### Watch mode
+
+```console
+wepy build --watch
+```
+
+#### Import project
+
+Create a new project using`WeChat developer tool`.If the local developer selects the project root directory, the project configuration will be automatically imported.
+
+### Which applets are developed with WePY
+
+腾讯疫苗查询小程序、
+腾讯翻译君小程序、
+腾讯地图小程序、
+玩转故宫小程序、
+手机充值+、
+手机余额查询、
+手机流量充值优惠、
+[友福图书馆](https://library.ufutx.com)[（开源）](https://github.com/glore/library)、
+[素洁商城](https://github.com/dyq086/wxYuHanStore)[（开源）](https://github.com/dyq086/wxYuHanStore)、
+[NewsLite](https://github.com/yshkk/shanbay-mina)[（开源）](https://github.com/yshkk/shanbay-mina)、
+[西安找拼车](https://github.com/chenqingspring)[（开源）](https://github.com/chenqingspring)、
+[深大的树洞](https://github.com/jas0ncn/szushudong)[（开源）](https://github.com/jas0ncn/szushudong)、
+[求知微阅读](https://github.com/KingJeason/wepy-books)[（开源）](https://github.com/KingJeason/wepy-books)、
+[给你的 iPhone X 换个发型](https://bangs.baran.wang/)、
+[天天跟我买](http://www.xiaohongchun.com.cn/index)、
+[坚橙](https://zhanart.com/wepy.html)、
+群脱单、
+米淘联盟、
+帮助圈、
+众安保险福利、
+阅邻二手书、
+趣店招聘、
+[满熊阅读（开源：](https://github.com/Thunf/wepy-demo-bookmall) [微信小程序](https://github.com/Thunf/wepy-demo-bookmall)、[支付宝小程序）](https://github.com/Thunf/wepy-demo-bookmall/tree/alipay)、
+育儿柚道、
+平行进口报价内参、
+GitHub 掘金版、
+班级群管、
+鲜花说小店、
+逛人备忘、
+英语助手君、
+花花百科、
+独角兽公司、
+爱羽客羽毛球、
+斑马小店、
+小小羽球、
+培恩医学、
+农资优选、
+公务员朝夕刷题、
+七弦琴小助手、
+七弦琴大数据、
+爽到家小程序、
+[应用全球排行](https://github.com/szpnygo/wepy_ios_top)[（开源）](https://github.com/szpnygo/wepy_ios_top)、
+[we 川大](https://github.com/mohuishou/scuplus-wechat)[（开源）](https://github.com/mohuishou/scuplus-wechat)、
+聊会儿、
+[诗词墨客](https://github.com/huangjianke/weapp-poem)[（开源）](https://github.com/huangjianke/weapp-poem)、
+[南京邮电大学](https://github.com/GreenPomelo/Undergraduate)[（开源）](https://github.com/GreenPomelo/Undergraduate)
+
+...
+
+### Wechat group
+
+WePY group has reached 500 members，Please add gcaufy_helper friends or scan the code to add friends, verify the reply 'wepy' according to the reference to enter the group.
+
+![wepy_qr_code](https://user-images.githubusercontent.com/2182004/82732473-feb50c80-9d3f-11ea-9a5f-0efc6ce40f74.png)
+
+### Contribution
+
+If you have any comments or Suggestions, please feel free to contribute to improving the WeChat app-development experience by asking for Issues or Pull Requests.<br>see details：[CONTRIBUTING.md](./CONTRIBUTING.md)
+
+[Tencent Open Source Incentive Plan](https://opensource.tencent.com/contribution) EncouraTencent Open Source Incentive Plange developers to participate and contribute. Look forward to your participation.
+
+### Links
+
+[Documentation](https://tencent.github.io/wepy/)
+
+[Changelog](https://tencent.github.io/wepy/document.html#/changelog)
+
+[Contributing](./CONTRIBUTING.md)
+
+[License MIT](./LICENSE)
\ No newline at end of file
diff --git a/docs/404.html b/docs/404.html
deleted file mode 100644
index 45bfaeadf..000000000
--- a/docs/404.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<html>
-	<head>
-		  <meta charset="UTF-8">
-		    <link rel="sylesheet" href="//unpkg.com/docsify/themes/vue.css">
-	</head>
-	<body>
-		  <div id="app"></div>
-	</body>
-	<script src="/pkg.cm/docsify"></script>
-	<script>
-	var _hmt = _hmt || [];
-	(function() {
-	var hm = document.createElement("script");
-	hm.src = "https://hm.baidu.com/hm.js?14c98a4c2ac48bfa7a4c6e9bf797d125";
-	var s = document.getElementsByTagName("script")[0]; 
-	s.parentNode.insertBefore(hm, s);
-	})();
-	</script>
-</html>
diff --git a/docs/README.md b/docs/README.md
deleted file mode 100644
index 602efda7e..000000000
--- a/docs/README.md
+++ /dev/null
@@ -1,1492 +0,0 @@
-# 微信小程序组件化开发框架WePY官方文档
-
-## 快速入门指南
-
-### WePY项目的创建与使用
-
-WePY的安装或更新都通过`npm`进行。
-
-**全局安装或更新WePY命令行工具**
-
-```bash
-npm install wepy-cli -g
-```
-
-**在开发目录中生成Demo开发项目**
-
-```bash
-wepy new myproject
-```
-
-**切换至项目目录**
-
-```bash
-cd myproject
-```
-
-**开启实时编译**
-
-```bash
-wepy build --watch
-```
-
-### WePY项目的目录结构
-
-```
-├── dist                   微信开发者工具指定的目录（该目录由WePY的build指令自动编译生成，请不要直接修改该目录下的文件）
-├── node_modules           
-├── src                    代码编写的目录（该目录为使用WePY后的开发目录）
-|   ├── components         WePY组件目录（组件不属于完整页面，仅供完整页面或其他组件引用）
-|   |   ├── com_a.wpy      可复用的WePY组件a
-|   |   └── com_b.wpy      可复用的WePY组件b
-|   ├── pages              WePY页面目录（属于完整页面）
-|   |   ├── index.wpy      index页面（经build后，会在dist目录下的pages目录生成index.js、index.json、index.wxml和index.wxss文件）
-|   |   └── other.wpy      other页面（经build后，会在dist目录下的pages目录生成other.js、other.json、other.wxml和other.wxss文件）
-|   └── app.wpy            小程序配置项（全局数据、样式、声明钩子等；经build后，会在dist目录下生成app.js、app.json和app.wxss文件）
-└── package.json           项目的package配置
-```
-
-### 参考建议
-
-1. WePY借鉴了Vue.js（后文简称Vue）的语法风格和功能特性，如果你之前从未接触过Vue，建议先阅读Vue的[官方文档](https://cn.vuejs.org/v2/guide/)，以熟悉相关概念，否则在阅读WePY文档以及使用WePY进行开发的过程中，将会遇到比较多的障碍。
-
-2. 开发建议使用第三方成熟IDE或编辑器(具体请参看后文的`代码高亮`部分)，`微信开发者工具`仅用于实时预览和调试。
-
-### 重要提醒
-
-1. 使用`微信开发者工具`-->`添加项目`，`项目目录`请选择`dist`目录。
-
-2. `微信开发者工具`-->`项目`-->`关闭ES6转ES5`。 <font style="color:red">重要：漏掉此项会运行报错。</font>
-
-3. `微信开发者工具`-->`项目`-->`关闭上传代码时样式自动补全`。 <font style="color:red">重要：某些情况下漏掉此项也会运行报错。</font>
-
-4. `微信开发者工具`-->`项目`-->`关闭代码压缩上传`。 <font style="color:red">重要：开启后，会导致真机computed, props.sync 等等属性失效。</font>（注：压缩功能可使用WePY提供的build指令代替，详见后文相关介绍以及Demo项目根目录中的`wepy.config.js`和`package.json`文件。）
-
-5. 本地项目根目录运行`wepy build --watch`，开启实时编译。（注：如果同时在`微信开发者工具`-->`设置`-->`编辑器`中勾选了`文件保存时自动编译小程序`，将可以实时预览，非常方便。）
-
-### 代码高亮
-
-文件后缀为`.wpy`，可共用`Vue`的高亮规则，但需要手动设置。下面提供一些常见IDE或编辑器中实现代码高亮的相关设置步骤以供参考(也可通过更改文件后缀名的方式来实现高亮，详见后文相关介绍)。
-
-- **Sublime**
-
-&emsp;&emsp;1. 打开`Sublime->Preferences->Browse Packages..`进入用户包文件夹。
-
-&emsp;&emsp;2. 在此文件夹下打开cmd，运行`git clone git@github.com:vuejs/vue-syntax-highlight.git`，无GIT用户可以直接下载[zip包](https://github.com/vuejs/vue-syntax-highlight/archive/master.zip)解压至当前文件夹。
-
-&emsp;&emsp;3. 关闭`.wpy`文件重新打开即可高亮。
-
-- **WebStorm/PhpStorm**
-
-&emsp;&emsp;1. 打开`Settings`，搜索`Plugins`，搜索`Vue.js`插件并安装。
-
-&emsp;&emsp;2. 打开`Settings`，搜索`File Types`，找到`Vue.js Template`，在`Registered Patterns`添加`*.wpy`，即可高亮。
-
-- **Atom**
-
-&emsp;&emsp;1. 在Atom里先安装Vue的语法高亮 - `language-vue`，如果装过了就忽略这一步。
-
-&emsp;&emsp;2. 打开`Atom -> Config`菜单。在`core`键下添加：
-
-```javascript
-customFileTypes:
-   "text.html.vue": [
-      "wpy"
-   ]
-```
-
-- **VS Code**
-
-&emsp;&emsp;1. 在 Code 里先安装 Vue 的语法高亮插件 `Vetur`。
-
-&emsp;&emsp;2. 打开任意 `.wpy` 文件。
-
-&emsp;&emsp;3. 点击右下角的选择语言模式，默认为`纯文本`。
-
-&emsp;&emsp;4. 在弹出的窗口中选择 `.wpy 的配置文件关联...`。
-
-&emsp;&emsp;5. 在`选择要与 .wpy 关联的语言模式` 中选择 `Vue`。
-
-- **VIM**
-
-&emsp;&emsp;1. 安装 `Vue` 的 VIM 高亮插件，例如 [posva/vim-vue](https://github.com/posva/vim-vue)。
-
-&emsp;&emsp;2. 配置 `.wpy` 后缀名的文件使用 `Vue` 语法高亮。
-
-    ```vim
-    au BufRead,BufNewFile *.wpy setlocal filetype=vue.html.javascript.css
-    ```
-
-### 代码规范
-
-1. 变量与方法尽量使用驼峰式命名，并且注意避免使用`$`开头。
-   以`$`开头的标识符为WePY框架的内建属性和方法，可在JavaScript脚本中以`this.`的方式直接使用，具体请[参考API文档](#api)。
-   
-2. 小程序入口、页面、组件文件名的后缀为`.wpy`；外链的文件可以是其它后缀。
-   具体请参考[wpy文件说明](#wpy文件说明)。
-   
-3. 使用ES6语法开发。
-   框架在ES6下开发，因此也需要使用ES6开发小程序，ES6中有大量的语法糖可以让我们的代码更加简洁高效。
-   
-4. 使用Promise。
-   框架默认对小程序提供的API全都进行了 Promise 处理，甚至可以直接使用`async/await`等新特性进行开发（注意：WePY 1.4.1以后的版本默认不支持async/await语法，因为可能导致iOS 10.0.1崩溃，如果不在意该问题可手动开启，具体可参看[这里](https://github.com/wepyjs/wepy/wiki/wepy%E9%A1%B9%E7%9B%AE%E4%B8%AD%E4%BD%BF%E7%94%A8async-await)）。
-   
-5. 事件绑定语法使用优化语法代替。
-   原`bindtap="click"`替换为`@tap="click"`，原`catchtap="click"`替换为`@tap.stop="click"`。更多`@`符用法，参见[组件自定义事件](https://github.com/wepyjs/wepy#组件自定义事件)。
-   
-6. 事件传参使用优化后语法代替。
-   原`bindtap="click" data-index={{index}}`替换为`@tap="click({{index}})"`。
-   
-7. 自定义组件命名应避开微信原生组件名称以及功能标签`<repeat>`。
-   不可以使用`input、button、view、repeat`等微信小程序原生组件名称命名自定义组件；另外也不要使用WePY框架定义的辅助标签`repeat`命名。有关`repeat`的详细信息，请参见[循环列表组件引用](https://github.com/wepyjs/wepy#循环列表组件引用)。
-
-
-## 主要功能特性
-
-### 开发模式转换
-
-WePY框架在开发过程中参考了Vue等现有框架的一些语法风格和功能特性，对原生小程序的开发模式进行了再次封装，更贴近于MVVM架构模式。以下是使用WePY前后的代码对比。
-
-原生代码：
-
-```javascript
-//index.js
-
-//获取应用实例
-var app = getApp()
-
-//通过Page构造函数创建页面逻辑
-Page({
-    //可用于页面模板绑定的数据
-    data: {
-        motto: 'Hello World',
-        userInfo: {}
-    },
-    
-    //事件处理函数
-    bindViewTap: function() {
-        console.log('button clicked')
-    },
-    
-    //页面的生命周期函数
-    onLoad: function () {
-        console.log('onLoad')
-    }
-})
-```
-
-基于WePY的代码：
-
-```javascript
-//index.wpy中的<script>部分
-
-import wepy from 'wepy';
-
-//通过继承自wepy.page的类创建页面逻辑
-export default class Index extends wepy.page {
-    //可用于页面模板绑定的数据
-    data = {
-        motto: 'Hello World',
-        userInfo: {}
-    };
-    
-    //事件处理函数(集中保存在methods对象中)
-    methods = {
-        bindViewTap () {
-            console.log('button clicked');
-        }
-    };
-    
-    //页面的生命周期函数
-    onLoad() {
-        console.log('onLoad');
-    };
-}
-```
-
-### 支持组件化开发
-
-参见章节：[组件](#组件)
-
-示例代码：
-
-```html
-// index.wpy
-
-<template>
-    <view>
-        <panel>
-            <h1 slot="title"></h1>
-        </panel>
-        <counter1 :num="myNum"></counter1>
-        <counter2 :num.sync="syncNum"></counter2>
-        <list :item="items"></list>
-    </view>
-</template>
-
-<script>
-import wepy from 'wepy';
-//引入List、Panel和Counter组件
-import List from '../components/list';
-import Panel from '../components/panel';
-import Counter from '../components/counter';
-
-export default class Index extends wepy.page {
-    //页面配置
-    config = {
-        "navigationBarTitleText": "test"
-    };
-   
-    //声明页面中将要使用到的组件
-    components = {
-        panel: Panel,
-        counter1: Counter,
-        counter2: Counter,
-        list: List
-    };
-   
-    //可用于页面模板中绑定的数据
-    data = {
-        myNum: 50,
-        syncNum: 100,
-        items: [1, 2, 3, 4]
-    }
-}
-</script>
-```
-
-### 支持加载外部NPM包
-
-在编译过程当中，会递归遍历代码中的`require`然后将对应依赖文件从node_modules当中拷贝出来，并且修改`require`为相对路径，从而实现对外部NPM包的支持。如下图：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554645/482b0f64-b198-11e6-8d4e-70c92326004f.png">
-</p>
-
-### 单文件模式，目录结构更清晰，开发更方便
-
-原生小程序要求app实例必须有3个文件：`app.js`、`app.json`、`app.wxss`，而page页面则一般有4个文件：`page.js`、`page.json`、`page.wxml`、`page.wxss`，并且还要求app实例的3个文件以及page页面的4个文件除后缀名外必须同名，具体可参看<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/framework/structure.html?t=20161107" target="_blank">官方目录结构</a>。
-
-而在WePY中则使用了单文件模式，将原生小程序app实例的3个文件统一为`app.wpy`，page页面的4个文件统一为`page.wpy`。使用WePY开发前后的开发目录结构对比如下：
-
-原生小程序的目录结构：
-
-```
-project
-├── pages
-|   ├── index
-|   |   ├── index.js    index 页面逻辑
-|   |   ├── index.json  index 页面配置
-|   |   ├── index.wxml  index 页面结构
-|   |   └── index.wxss  index 页面样式
-|   └── log
-|       ├── log.js      log 页面逻辑
-|       ├── log.json    log 页面配置
-|       ├── log.wxml    log 页面结构
-|       └── log.wxss    log 页面样式
-├── app.js              小程序逻辑
-├── app.json            小程序公共配置
-└── app.wxss            小程序公共样式
-```
-
-使用WePY框架后的开发目录结构(主要为src目录的结构，dist目录除外)：
-```
-    注：dist目录为WePY通过build指令生成的目录，除额外增加的npm目录外，其目录结构与原生小程序的目录结构类似。
-```
-
-```
-project
-└── src
-    ├── pages
-    |   ├── index.wpy    index 页面逻辑、配置、结构、样式
-    |   └── log.wpy      log 页面逻辑、配置、结构、样式
-    └──app.wpy           小程序逻辑、公共配置、公共样式
-```
-
-### 默认使用babel编译，支持ES6/7的一些新特性
-
-用户可以通过修改`wepy.config.js`(老版本使用`.wepyrc`)配置文件，配置自己熟悉的babel环境进行开发。默认开启使用了一些新的特性如`promise`、`async/await`（自WePY 1.4.1开始必须手动开启，原因参见前文`代码规范`一节中的介绍）等等。
-
-示例代码：
-
-```javascript
-import wepy from 'wepy';
-
-export default class Index extends wepy.page {
-    getData() {
-        return new Promise((resolve, reject) => {
-            setTimeout(() => {
-                resolve({data: 123});
-            }, 3000);
-        });
-    };
-    
-    async onLoad() {
-        let data = await this.getData();
-        console.log(data.data);
-    };
-}
-```
-
-### 针对原生API进行优化
-
-对小程序原生API进行promise处理，同时修复了一些原生API的缺陷，比如：wx.request的并发问题等。
-
-原生代码：
-
-```javascript
-onLoad = function () {
-    var self = this;
-    wx.login({
-        success: function (data) {
-            wx.getUserInfo({
-                success: function (userinfo) {
-                    self.setData({userInfo: userinfo});
-                }
-            });
-        }
-    });
-}
-```
-
-基于WePY的代码：
-
-```javascript
-import wepy from 'wepy';
-
-async onLoad() {
-    await wepy.login();
-    this.userInfo = await wepy.getUserInfo();
-}
-```
-
-在同时并发10个request请求测试时：
-
-不使用WePY:
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554651/5185f740-b198-11e6-88f8-45e359090dc3.png" alt="2 small">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554886/c30e802a-b199-11e6-927d-08cd4e5ed0b0.png" alt="2 small">
-</p>
-
-使用WePY后：
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554663/65704c2e-b198-11e6-8277-abb77e0c7b3e.png">
-</p>
-
-## 进阶介绍
-
-### wepy.config.js配置文件说明
-
-执行`wepy new demo`后，会生成类似下面这样的配置文件。
-
-```javascript
-
-let prod = process.env.NODE_ENV === 'production';
-
-module.exports = {
-    'output': 'dist',
-    'source': 'src',
-    'wpyExt': '.wpy',
-    'compilers': {
-        less: {
-            'compress': true
-        },
-        /*sass: {
-            'outputStyle': 'compressed'
-        },*/
-        babel: {
-            'presets': [
-                'es2015',
-                'stage-1'
-            ],
-            'plugins': [
-                'transform-export-extensions',
-                'syntax-export-extensions',
-                'transform-runtime'
-            ]
-        }
-    },
-    'plugins': {
-    }
-};
-
-if (prod) {
-    // 压缩sass
-    module.exports.compilers['sass'] = {'outputStyle': 'compressed'};
-
-    // 压缩less
-    module.exports.compilers['less'] = {'compress': true};
-
-    // 压缩js
-    module.exports.plugins = {
-        'uglifyjs': {
-            filter: /\.js$/,
-            config: {
-            }
-        },
-        'imagemin': {
-            filter: /\.(jpg|png|jpeg)$/,
-            config: {
-                'jpg': {
-                    quality: 80
-                },
-                'png': {
-                    quality: 80
-                }
-            }
-        }
-    };
-}
-```
-
-**wpyExt：** 缺省值为'.wpy'，IDE默认情况下不会对此文件类型进行高亮处理，这种情况下，除了按照前文`代码高亮`部分的介绍进行设置之外，还可以直接将相关文件的后缀名由`.wpy`修改为`.vue`(因为与Vue的高亮规则一样)，然后将此选项修改为`.vue`，也能解决部分IDE中代码高亮的问题。
-
-**compilers：** compilers为`1.3.1`版本之后的功能，如果需要使用其它语法，请先配置`compilers`，然后再安装相应的compilers。目前支持`wepy-compiler-less`，`wepy-compiler-sass`、`wepy-compiler-babel`、`wepy-compiler-pug`，其他compiler持续开发中......
-
-对应各compiler请参考各自文档：
-
-> **sass：** sass编译配置，参见<a href="https://github.com/sass/node-sass" target="_blank">这里</a>。
-
-> **less：** less编译配置，参见<a href="http://lesscss.org/#using-less-usage-in-code" target="_blank">这里</a>。
-
-> **stylus：** stylus编译配置，参见<a href="http://www.zhangxinxu.com/jq/stylus/js.php" target="_blank">这里</a>。
-
-> **babel：** babel编译配置，参见<a href="http://babeljs.io/docs/usage/options/" target="_blank">这里</a>。
-
-> **typescript：** typescript编译配置，参见<a href="https://www.tslang.cn/docs/home.html" target="_blank">这里</a>。
-
-**plugins：** plugins为`1.1.6`版本之后的功能，目前支持js压缩`wepy-plugin-ugliyjs`、图片压缩`wepy-plugin-imagemin`，其他plugin持续开发中......
-
-### 关于compilers和plugins
-
-1.3.1版本新功能，文档建设中...
-
-### .wpy文件说明
-
-`.wpy`文件的编译过程过下：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/22774706/422375b0-eee3-11e6-9046-04d9cd3aa429.png" alt="5 small">
-</p>
-
-一个`.wpy`文件可分为三大部分，各自对应于一个标签：
-
-1. 脚本部分，即`<script></script>`标签中的内容，又可分为两个部分：
-
-&emsp;&emsp;&emsp;&emsp;逻辑部分，除了config对象之外的部分，对应于原生的`.js`文件；
-
-&emsp;&emsp;&emsp;&emsp;配置部分，即config对象，对应于原生的`.json`文件。
-
-2. 结构部分，即`<template></template>`模板部分，对应于原生的`.wxml`文件。
-
-3. 样式部分，即`<style></style>`样式部分，对应于原生的`.wxss`文件。
-
-其中，小程序入口文件`app.wpy`不需要`template`，所以编译时会被忽略。`.wpy`文件中的`script`、`template`、`style`这三个标签都支持`lang`和`src`属性，`lang`决定了其代码编译过程，`src`决定是否外联代码，存在`src`属性且有效时，会忽略内联代码。
-
-示例如下：
-
-```Html
-<style lang="less" src="page1.less"></style>
-<template lang="wxml" src="page1.wxml"></template>
-<script>
-    // some code
-</script>
-```
-
-各标签对应的`lang`值如下表所示：
-
-| 标签       | lang默认值 | lang支持值                      |
-| -------- | ------- | ---------------------------- |
-| style    | `css`   | `css`、`less`、`sass`、`stylus` |
-| template | `wxml`  | `wxml`、`xml`、`pug(原jade)`    |
-| script   | `babel` | `babel`、`TypeScript`         |
-
-### 脚本部分介绍
-
-#### 小程序入口app.wpy
-
-```html
-<script>
-import wepy from 'wepy';
-export default class extends wepy.app {
-    config = {
-        "pages":[
-            "pages/index/index"
-        ],
-        "window":{
-            "backgroundTextStyle": "light",
-            "navigationBarBackgroundColor": "#fff",
-            "navigationBarTitleText": "WeChat",
-            "navigationBarTextStyle": "black"
-        }
-    };
-    onLaunch() {
-        console.log(this);
-    }
-}
-</script>
-
-<style lang="less">
-/** less **/
-</style>
-```
-
-入口文件`app.wpy`中所声明的小程序实例继承自`wepy.app`类，包含一个`config`属性和其它全局属性、方法、事件。其中`config`属性对应原生的`app.json`文件，build编译时会根据`config`属性自动生成`app.json`文件，如果需要修改`config`中的内容，请使用微信提供的相关API。
-
-#### 页面page.wpy
-
-```html
-<script>
-import wepy from 'wepy';
-import Counter from '../components/counter';
-   
-export default class Page extends wepy.page {
-    config = {};
-    components = {counter1: Counter};
-
-    data = {};
-    methods = {};
-
-    events = {};
-    onLoad() {};
-    // Other properties
-}
-</script>
-
-<template lang="wxml">
-    <view>
-    </view>
-    <counter1></counter1>
-</template>
-
-<style lang="less">
-/** less **/
-</style>
-```
-
-页面文件`page.wpy`中所声明的页面实例继承自`wepy.page`类，该类的主要属性介绍如下：
-
-| 属性         | 说明                                       |
-| ---------- | ---------------------------------------- |
-| config     | 页面配置对象，对应于原生的`page.json`文件，类似于`app.wpy`中的config |
-| components | 页面组件列表对象，声明页面所引入的组件列表                               |
-| data       | 页面渲染数据对象，存放可用于页面模板绑定的渲染数据                                |
-| methods    | wxml事件处理函数对象，存放响应wxml中所捕获到的事件的函数，如`bindtap`、`bindchange`        |
-| events     | WePY组件事件处理函数对象，存放响应组件之间通过`$broadcast`、`$emit`、`$invoke`所传递的事件的函数            |
-| 其它         | 小程序页面生命周期函数，如`onLoad`、`onReady`等，以及其它自定义的方法与属性    |
-
-#### 组件com.wpy
-
-```html
-<template lang="wxml">
-    <view>  </view>
-</template>
-
-<script>
-import wepy from 'wepy';
-export default class Com extends wepy.component {
-    components = {};
-
-    data = {};
-    methods = {};
-
-    events = {};
-    // Other properties
-}
-</script>
-
-<style lang="less">
-/** less **/
-</style>
-```
-
-组件文件`com.wpy`中所声明的组件实例继承自`wepy.component`类，除了不需要`config`配置以及页面特有的一些生命周期函数之外，其属性与页面属性大致相同。
-
-### 实例
-
-通过前文的介绍可知，在 WePY 中，小程序被分为三个实例：小程序实例`App`、页面实例`Page`、组件实例`Component`。其中`Page`实例继承自`Component`。各自的声明方式如下：
-
-```javascript
-import wepy from 'wepy';
-
-// 声明一个App小程序实例
-export default class MyAPP extends wepy.app {
-}
-
-// 声明一个Page页面实例
-export default class IndexPage extends wepy.page {
-}
-
-// 声明一个Component组件实例
-export default class MyComponent extends wepy.component {
-}
-```
-
-#### App小程序实例
-
-App小程序实例中主要包含小程序生命周期函数、config配置对象、globalData全局数据对象，以及其他自定义方法与属性。
-
-```javascript
-import wepy from 'wepy';
-
-export default class MyAPP extends wepy.app {
-    customData = {};
-
-    customFunction ()　{ }
-
-    onLaunch () {}
-
-    onShow () {}
-
-    config = {}  // 对应 app.json 文件
-    
-    globalData = {}
-}
-```
-
-在Page页面实例中，可以通过`this.$parent`来访问App实例。
-
-
-#### Page页面实例和Component组件实例
-
-由于Page页面实际上继承自Component组件，即Page也是组件。除扩展了页面所特有的`config`配置以及特有的页面生命周期函数之外，其它属性和方法与Component一致，因此这里以Page页面为例进行介绍。
-
-
-```javascript
-import wepy from 'wepy';
-
-// export default class MyPage extends wepy.page {
-export default class MyComponent extends wepy.component {
-    customData = {}  // 自定义数据
-
-    customFunction ()　{}  //自定义方法
-
-    onLoad () {}  // 在Page和Component共用的生命周期函数
-
-    onShow () {}  // 只在Page中存在的页面生命周期函数
-
-    config = {};  // 只在Page实例中存在的配置数据，对应于原生的page.json文件
-    
-    data = {};  // 页面所需数据均需在这里声明，可用于模板数据绑定
-
-    components = {};  // 声明页面中所引用的组件，或声明组件中所引用的子组件
-
-    mixins = [];  // 声明页面所引用的Mixin实例
-
-    computed = {};  // 声明计算属性（详见后文介绍）
-
-    watch = {};  // 声明数据watcher（详见后文介绍）
-
-    methods = {};  // 声明页面wxml中标签的事件处理函数。注意，此处只用于声明页面wxml中标签的bind、catch事件，自定义方法需以自定义方法的方式声明
-
-    events = {};  // 声明组件之间的事件处理函数
-}
-```
-
-注意，对于WePY中的methods属性，因为与Vue中的使用习惯不一致，非常容易造成误解，这里需要特别强调一下：WePY中的methods属性只能声明页面wxml标签的bind、catch事件，不能声明自定义方法，这与Vue中的用法是不一致的。示例如下：
-
-```javascript
-// 错误示例
-
-import wepy from 'wepy';
-
-export default class MyComponent extends wepy.component {
-    methods = {
-        bindtap () {
-            let rst = this.commonFunc();
-            // doSomething
-        },
-        
-        bindinput () {
-            let rst = this.commonFunc();
-            // doSomething
-        },
-        
-        //错误：普通自定义方法不能放在methods对象中
-        customFunction () {
-            return 'sth.';
-        }
-    };
-
-}
-
-
-// 正确示例
-
-import wepy from 'wepy';
-
-export default class MyComponent extends wepy.component {
-    methods = {
-        bindtap () {
-            let rst = this.commonFunc();
-            // doSomething
-        },
-        
-        bindinput () {
-            let rst = this.commonFunc();
-            // doSomething
-        },
-    }
-
-    //正确：普通自定义方法在methods对象外声明，与methods平级
-    customFunction () {
-        return 'sth.';
-    }
-
-}
-```
-
-### 组件
-
-原生小程序支持js<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/framework/app-service/module.html?t=20161107" target="_blank">模块化</a>，但彼此独立，业务代码与交互事件仍需在页面处理。无法实现组件化的松耦合与复用的效果。
-
-例如模板A中绑定一个`bindtap="myclick"`，模板B中同样绑定一样`bindtap="myclick"`，那么就会影响同一个页面事件。对于数据同样如此。因此，只有通过改变变量或者事件方法，或者给其加不同前缀才能实现绑定不同事件或者不同数据。当页面复杂之后就十分不利于开发维护。
-
-因此，在WePY中实现了小程序的组件化开发，组件的所有业务与功能在组件本身实现，组件与组件之间彼此隔离，上述例子在WePY的组件化开发过程中，A组件只会影响到A所绑定的`myclick`，B也如此。
-
-WePY编译组件的过程如下：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/22774767/8f090dd6-eee3-11e6-942b-1591a6379ad3.png">
-</p>
-
-#### 普通组件引用
-
-当页面需要引入组件或组件需要引入子组件时，必须在`.wpy`文件的`<script>`脚本部分先import组件文件，然后在`components`对象中给组件声明唯一的组件ID，接着在`<template>`模板部分中添加以`components`对象中所声明的组件ID进行命名的自定义标签以插入组件。如：
-
-```html
-/**
-project
-└── src
-    ├── coms
-    |   └── child.wpy
-    ├── pages
-    |   ├── index.wpy    index 页面配置、结构、样式、逻辑
-    |   └── log.wpy      log 页面配置、结构、样式、逻辑
-    └──app.wpy           小程序配置项（全局公共配置、公共样式、声明钩子等）
-**/
-
-// index.wpy
-
-<template>
-    <!-- 以`<script>`脚本部分中所声明的组件ID为名命名自定义标签，从而在`<template>`模板部分中插入组件 -->
-    <child></child>
-</template>
-
-<script>
-    import wepy from 'wepy';
-    //引入组件文件
-    import Child from './coms/child';
-   
-    export default class Index extends wepy.component {
-        //声明组件，分配组件id为child
-        components = {
-            child: Child
-        };
-    }
-</script>
-```
-
-需要注意的是，WePY中的组件都是静态组件，是以组件ID作为唯一标识的，每一个ID都对应一个组件实例，当页面引入两个相同ID的组件时，这两个组件共用同一个实例与数据，当其中一个组件数据变化时，另外一个也会一起变化。
-
-如果需要避免这个问题，则需要分配多个组件ID和实例。代码如下：
-
-```html
-<template>
-    <view class="child1">
-        <child></child>
-    </view>
-   
-    <view class="child2">
-        <anotherchild></anotherchild>
-    </view>
-</template>
-
-
-<script>
-    import wepy from 'wepy';
-    import Child from './coms/child';
-   
-    export default class Index extends wepy.component {
-        components = {
-            //为两个相同组件的不同实例分配不同的组件ID，从而避免数据同步变化的问题
-            child: Child,
-            anotherchild: Child
-        };
-    }
-</script>
-```
-
-*注意*：WePY中，在父组件`template`模板部分插入驼峰式命名的子组件标签时，不能将驼峰式命名转换成短横杆式命名(比如将`childCom`转换成`child-com`)，这与Vue中的习惯是不一致。
-
-
-#### 组件的循环渲染
-
-*1.4.6新增*
-
-当需要循环渲染WePY组件时(类似于通过`wx:for`循环渲染原生的wxml标签)，必须使用WePY定义的辅助标签`<repeat>`，代码如下：
-
-```Html
-/**
-project
-└── src
-    ├── components
-    |   └── child.wpy
-    ├── pages
-    |   ├── index.wpy    index 页面配置、结构、样式、逻辑
-    |   └── log.wpy      log 页面配置、结构、样式、逻辑
-    └──app.wpy           小程序配置项（全局样式配置、声明钩子等）
-**/
-
-// index.wpy
-
-<template>
-    <!-- 注意，使用for属性，而不是使用wx:for属性 -->
-    <repeat for="{{list}}" key="index" index="index" item="item">
-        <!-- 插入<script>脚本部分所声明的child组件，同时传入item -->
-        <child :item="item"></child>
-    </repeat>
-</template>
-
-<script>
-    import wepy from 'wepy';
-    // 引入child组件文件
-    import Child from './coms/child';
-   
-    export default class Index extends wepy.component {
-        components = {
-            // 声明页面中要使用到的Child组件的ID为child
-            child: Child
-        }
-   
-        data = {
-            list: [{id: 1, title: 'title1'}, {id: 2, title: 'title2'}]
-        }
-    }
-</script>
-```
-
-页面可以引入组件，而组件还可以引入子组件。一个页面引入若干组件后，组件结构如下图：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554681/796da1ae-b198-11e6-91ab-e90f485c594d.png">
-</p>
-
-如上图所示，Page_Index页面引入了ComA、ComB、ComC三个组件，同时ComA组件和ComB组件又有自己的子组件ComD、ComE、ComF、ComG、ComH。
-
-#### computed 计算属性
-
-* **类型**: `{ [key: string]: Function }`
-
-* **详细**：
-
-`computed`计算属性，是一个有返回值的函数，可直接被当作绑定数据来使用。因此类似于`data`属性，代码中可通过`this.计算属性名`来引用，模板中也可通过`{{ 计算属性名 }}`来绑定数据。
-
-需要注意的是，只要是组件中有任何数据发生了改变，那么所有计算属性就都会被重新计算。
-
-* **示例**：
-
-    ```javascript
-    data = {
-        a: 1
-    }
-
-    // 计算属性aPlus，在脚本中可通过this.aPlus来引用，在模板中可通过{{ aPlus }}来插值
-    computed = {
-        aPlus () {
-            return this.a + 1
-        }
-    }
-    ```
-
-#### watcher 监听器
-
-* **类型**: `{ [key: string]: Function }`
-
-* **详细**：
-
-通过监听器`watcher`能够监听到任何数值属性的数值更新。监听器在`watch`对象中声明，类型为函数，函数名与需要被监听的`data`对象中的数值属性同名，每当被监听的数值属性改变一次，监听器函数就会被自动调用执行一次。
-
-监听器适用于当数值属性改变时需要进行某些额外处理的情形。
-
-* **示例**：
-
-    ```javascript
-    data = {
-        num: 1
-    }
-
-    // 监听器函数名必须跟需要被监听的data对象中的数值属性num同名，
-    // 其参数中的newValue为数值属性改变后的新值，oldValue为改变前的旧值
-    watch = {
-        num (newValue, oldValue) {
-            console.log(`num value: ${oldValue} -> ${newValue}`)
-        }
-    }
-
-    // 每当被监听的数值属性num改变一次，对应的同名监听器函数num()就被自动调用执行一次
-    onLoad () {
-        setInterval(() => {
-            this.num++;
-            this.$apply();
-        }, 1000)
-    }
-    ```
-
-
-#### props 传值
-
-props传值在WePY中属于父子组件之间传值的一种机制，包括静态传值与动态传值。
-
-在props对象中声明需要传递的值，静态传值与动态传值的声明略有不同，具体可参看下面的示例代码。
-
-**静态传值**
-
-静态传值为父组件向子组件传递常量数据，因此只能传递String字符串类型。
-
-
-在子组件`template`模板部分的组件标签中，使用子组件props对象中所声明的属性名作为其属性名来接收父组件传递的值。
-
-```Javascript
-<child title="mytitle"></child>
-
-// child.wpy
-props = {
-    title: String
-};
-
-onLoad () {
-    console.log(this.title); // mytitle
-}
-```
-
-**动态传值**
-
-
-动态传值是指父组件向子组件传递动态数据内容，父子组件数据完全独立互不干扰。但可以通过使用`.sync`修饰符来达到父组件数据绑定至子组件的效果，也可以通过设置子组件props的`twoWay: true`来达到子组件数据绑定至父组件的效果。既使用`.sync`修饰符，同时又给子组件`props`中添加了`twoWay: true`时，即可实现数据的双向绑定。
-
-。
-
-*注意*：下文示例中的`twoWay`为`true`时，表示子组件向父组件单向动态传值，而`twoWay`为`false`(默认值，可不写)时，则表示子组件不向父组件传值。这是与Vue不一致的地方，而这里之所以仍然使用`twoWay`，只是为了尽可能保持与Vue在标识符命名上的一致性。
-
-在父组件`template`模板部分所插入的子组件标签中，使用`:prop`属性（等价于Vue中的`v-bind:prop`属性）来进行动态传值。
-
-```Javascript
-// parent.wpy
-
-<child :title="parentTitle" :syncTitle.sync="parentTitle" :twoWayTitle="parentTitle"></child>
-
-data = {
-    parentTitle: 'p-title'
-};
-
-
-// child.wpy
-
-props = {
-    // 静态传值
-    title: String,
-    
-    // 父向子单向动态传值
-    syncTitle: {
-        type: String,
-        default: 'null'
-    },
-    
-    twoWayTitle: {
-        type: Number,
-        default: 50,
-        twoWay: true
-    }
-};
-
-onLoad () {
-    console.log(this.title); // p-title
-    console.log(this.syncTitle); // p-title
-    console.log(this.twoWayTitle); // 50
-
-    this.title = 'c-title';
-    console.log(this.$parent.parentTitle); // p-title.
-    this.twoWayTitle = 60;
-    this.$apply();
-    console.log(this.$parent.parentTitle); // 60.  --- twoWay为true时，子组件props中的属性值改变时，会同时改变父组件对应的值
-    this.$parent.parentTitle = 'p-title-changed';
-    this.$parent.$apply();
-    console.log(this.title); // 'p-title';
-    console.log(this.syncTitle); // 'p-title-changed' --- 有.sync修饰符的props属性值，当在父组件中改变时，会同时改变子组件对应的值。
-}
-```
-
-#### 组件通信与交互
-
-`wepy.component`基类提供`$broadcast`、`$emit`、`$invoke`三个方法用于组件之间的通信和交互，如：
-
-```javascript
-this.$emit('some-event', 1, 2, 3, 4);
-```
-
-用于监听组件之间的通信与交互事件的事件处理函数需要写在组件和页面的`events`对象中，如：
-
-```javascript
-import wepy from 'wepy'
-
-export default class Com extends wepy.component {
-    components = {};
-
-    data = {};
-    
-    methods = {};
-
-    // events对象中所声明的函数为用于监听组件之间的通信与交互事件的事件处理函数
-    events = {
-        'some-event': (p1, p2, p3, $event) => {
-               console.log(`${this.name} receive ${$event.name} from ${$event.source.name}`);
-        }
-    };
-    // Other properties
-}
-```
-
-**$broadcast**
-
-`$broadcast`事件是由父组件发起，所有子组件都会收到此广播事件，除非事件被手动取消。事件广播的顺序为广度优先搜索顺序，如上图，如果页面`Page_Index`发起一个`$broadcast`事件，那么按先后顺序依次接收到该事件的组件为：ComA、ComB、ComC、ComD、ComE、ComF、ComG、ComH。如下图：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554688/800089e6-b198-11e6-84c5-352d2d0e2f7e.png">
-</p>
-
-**$emit**
-
-`$emit`与`$broadcast`正好相反，事件发起组件的所有祖先组件会依次接收到`$emit`事件。如果组件ComE发起一个`$emit`事件，那么接收到事件的先后顺序为：组件ComA、页面Page_Index。如下图：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554704/9997932c-b198-11e6-9840-3edae2194f47.png">
-</p>
-
-**$invoke**
-
-`$invoke`是一个页面或组件对另一个组件中的方法的直接调用，通过传入组件路径找到相应的组件，然后再调用其方法。
-
-比如，想在页面`Page_Index`中调用组件ComA的某个方法：
-
-```Javascript
-this.$invoke('ComA', 'someMethod', 'someArgs');
-```
-
-如果想在组件ComA中调用组件ComG的某个方法：
-
-```Javascript
-this.$invoke('./../ComB/ComG', 'someMethod', 'someArgs');
-```
-
-#### 组件自定义事件处理函数
-
-*1.4.8新增*
-
-可以通过使用`.user`修饰符为自定义组件绑定事件，如：`@customEvent.user="myFn"`
-
-其中，`@`表示事件修饰符，`customEvent` 表示事件名称，`.user`表示事件后缀。
-
-目前总共有三种事件后缀：
-
-- `.default`: 绑定小程序冒泡型事件，如`bindtap`，`.default`后缀可省略不写；
-
-- `.stop`: 绑定小程序捕获型事，如`catchtap`；
-
-- `.user`: 绑定用户自定义组件事件，通过`$emit`触发。
-
-示例如下：
-
-```Html
-// index.wpy
-
-<template>
-    <child @childFn.user="parentFn"></child>
-</template>
-
-<script>
-    import wepy from 'wepy'
-    import Child from './coms/child'
-   
-    export default class Index extends wepy.page {
-        components = {
-            child: Child
-        }
-
-        methods = {
-            parentFn (num, evt) {
-                console.log('parent received emit event, number is: ' + num)
-            }
-        }
-    }
-</script>
-
-
-// child.wpy
-
-<template>
-    <view @tap="tap">Click me</view>
-</template>
-
-<script>
-    import wepy from 'wepy'
-   
-    export default class Child extends wepy.component {
-        methods = {
-            tap () {
-                console.log('child is clicked')
-                this.$emit('childFn', 100)
-            }
-        }
-    }
-</script>
-```
-
-
-#### slot 组件内容分发插槽
-
-WePY中的`slot`插槽作为内容分发标签的空间占位标签，便于在父组件中通过对相当于扩展板卡的内容分发标签的“插拔”，更为灵活、方便地对子组件进行内容分发。
-
-具体使用方法是，首先在子组件`template`模板部分中声明`slot`标签作为内容插槽，同时必须在其`name`属性中指定插槽名称，还可设置默认的标签内容；然后在引入了该带有插槽的子组件的父组件`template`模板部分中声明用于“插拔”的内容分发标签。
-
-注意，这些父组件中的内容分发标签必须具有`slot`属性，并且其值为子组件中对应的插槽名称，这样父组件内容分发标签中的内容会覆盖掉子组件对应插槽中的默认内容。
-
-另外，要特别注意的是，父组件中一旦声明了对应于子组件插槽的内容分发标签，即便没有内容，子组件插槽中的默认内容也不会显示出来，只有删除了父组件中对应的内容分发标签，才能显示出来。
-
-
-示例：
-
-在`Panel`组件中有以下模板：
-
-```html
-<view class="panel">
-    <slot name="title">默认标题</slot>
-    <slot name="content">默认内容</slot>
-</view>
-```
-
-在父组件中使用`Pannel`子组件时，可以这样使用：
-
-```html
-<panel>
-    <view slot="title">新的标题</view>
-    <view slot="content">
-        <text>新的内容</text>
-    </view>
-</panel>
-```
-
-### 第三方组件
-
-WePY允许使用基于WePY开发的第三方组件，开发第三方组件规范请参考<a href="https://github.com/wepyjs/wepy-com-toast" target="_blank">wepy-com-toast</a>。
-
-
-### Mixin 混合
-
-混合可以将多个组件中的可复用的数据、事件处理函数以及其他方法等抽取出来，然后通过混合的方式，将这些数据、事件处理函数以及其他方法等注入到组件中。
-
-混合分分为两种：
-
-* 默认式混合
-
-* 兼容式混合
-
-#### 默认式混合
-
-对于组件中的`data`数据、`components`组件、`events`事件处理函数以及其它自定义方法采用**默认式混合**。
-
-所谓默认式混合，就是当组件未声明数据、组件、事件处理函数、自定义方法等属性时，会将混合对象mixins中的对应属性自动注入到组件之中。但对于组件已中声明的同名属性不受影响(相当于组件中已声明了的属性会覆盖混合对象所注入的对应同名属性)。
-
-```Javascript
-// mixins/test.js
-
-import wepy from 'wepy';
-
-export default class TestMixin extends wepy.mixin {
-    data = {
-        foo: 'foo defined by mixin',
-        bar: 'bar defined by mixin'
-    }
-}
-
-
-// pages/index.wpy
-
-import wepy from 'wepy';
-import TestMixin from './mixins/test';
-
-export default class Index extends wepy.page {
-    data = {
-        foo: 'foo defined by index'
-    }
-    
-    mixins = [ TestMixin ];
-    
-    onShow() {
-        console.log(this.foo);  // foo defined by index. 由于index.wpy中已经声明了this.foo，所以不是by mixin，而是by index
-        console.log(this.bar);  // foo defined by mixin. 由于index.wpy中没有声明this.bar，所以是by mixin
-    }
-}
-```
-
-
-#### 兼容式混合
-
-对于组件`methods`对象中的wxml标签事件处理函数，以及小程序页面事件处理函数(即页面生命周期函数)，将采用**兼容式混合**。
-
-所谓兼容式混合，就是当组件中的事件发生时，先是组件本身相应的事件处理函数被触发执行，然后是混合对象所注入的相应事件处理函数被触发执行。当组件中的事件发生时，组件本身相应的事件处理函数，以及混合对象所注入的相应事件处理函数，**都会**被触发执行，而且是**先后依次**被触发执行。
-
-```Javascript
-// mixins/test.js
-
-import wepy from 'wepy';
-
-export default class TestMixin extends wepy.mixin {
-    methods = {
-        tap () {
-            console.log('mixin tap');
-        }
-    }
-    
-    onShow () {
-        console.log('mixin onshow');
-    }
-}
-
-
-// pages/index.wpy
-
-import wepy from 'wepy';
-import TestMixin from './mixins/test';
-
-export default class Index extends wepy.page {
-    mixins = [ TestMixin ];
-    
-    methods = {
-        tap () {
-            console.log('index tap');
-        }
-    }
-    
-    onShow () {
-        console.log('index onshow');
-    }
-}
-
-// index onshow
-// mixin onshow
-// ----- when tap
-// index tap
-// mixin tap
-```
-
-### interceptor 拦截器
-
-可以使用WePY提供的全局拦截器对原生API的请求进行拦截。
-
-具体方法是配置API的config、fail、success、complete回调函数。参考示例：
-
-```javascript
-import wepy from 'wepy';
-
-export default class extends wepy.app {
-    constructor () {
-        //拦截request请求
-        this.intercept('request', {
-            // 发出请求时的回调函数
-            config (p) {
-                // 对所有request请求中的OBJECT参数对象统一附加时间戳属性
-                p.timestamp = +new Date();
-                console.log('config request: ', p);
-                // 必须返回OBJECT参数对象，否则无法发送请求到服务端
-                return p;
-            },
-            
-            // 请求成功后的回调函数
-            success (p) {
-                // 可以在这里对收到的响应数据对象进行加工处理
-                console.log('request success: ', p);
-                // 必须返回响应数据对象，否则后续无法对响应数据进行处理
-                return p;
-            },
-            
-            //请求失败后的回调函数
-            fail (p) {
-                console.log('request fail: ', p);
-                // 必须返回响应数据对象，否则后续无法对响应数据进行处理
-                return p;
-            },
-
-            // 请求完成时的回调函数(请求成功或失败都会被执行)
-            complete (p) {
-                console.log('request complete: ', p);
-            }
-        })
-    }
-}
-```
-
-
-### 数据绑定
-
-#### 原生小程序的数据绑定方式
-
-原生小程序通过`Page`提供的`setData`方法来绑定数据，如：
-
-```Javascript
-this.setData({title: 'this is title'});
-```
-
-由于原生小程序本身架构设计上的原因，页面渲染层和JS逻辑层是完全独立的，而setData操作实际上是JS逻辑层与页面渲染层之间的通信，通信成本较高。在同一个运行周期内多次执行`setData`操作时，也会进行多次通信的次数，[官方文档](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/performance/tips.html#setdata)中明确表示，基于性能考虑不提倡频繁进行`setData`操作。
-
-#### WePY的数据绑定方式
-
-在WePY中，使用脏数据检查来实现数据绑定。WePY的脏数据检查对setData进行了封装，只在函数运行周期结束时才执行脏数据检查，这样开发者可以不用关心页面多次setData是否会有性能上的问题，同时也可以更加简洁地去修改数据实现绑定，而不用重复地执行setData操作。代码如下：
-
-```javascript
-this.title = 'this is title';
-```
-
-需注意的是，在异步函数中更新数据的时，必须手动调用`$apply`方法，才会触发脏数据检查流程的运行。如：
-
-```javascript
-setTimeout(() => {
-    this.title = 'this is title';
-    this.$apply();
-}, 3000);
-```
-
-#### WePY脏数据检查的流程
-
-在执行脏数据检查时，会通过`this.$$phase`标识当前检查状态，并且会保证在脏数据检查发生并发时，只有一个脏数据检查流程在运行。以下是执行脏数据检查的流程图：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554709/a0d8b1e8-b198-11e6-9034-0997b33bdf95.png">
-</p>
-
-
-### 其它优化细节
-
-#### wx.request 接收参数修改
-
-点这里查看<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html?t=20161122" target="_blank">官方文档</a>
-
-```javascript
-// 原生代码:
-
-wx.request({
-    url: 'xxxx',
-    success: function (data) {
-        console.log(data);
-    }
-})；
-
-// 基于 WePY Promise 的代码:
-
-wepy.request('xxxx').then((data) => console.log(data))
-
-// 基于 WePY async/await 的代码
-
-async onLoad () {
-   let data = await wepy.request('xxxx');
-   console.log(data);
-}
-```
-
-#### 优化事件参数传递
-
-点这里查看<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/event.html?t=20161122" target="_blank">官方文档</a>
-
-```javascript
-// 原生的事件传参方式:
-
-<view data-id="{{index}}" data-title="wepy" data-other="otherparams" bindtap="tapName"> Click me! </view>
-
-Page({
-    tapName: function (event) {
-        console.log(event.currentTarget.dataset.id)// output: 1
-        console.log(event.currentTarget.dataset.title)// output: wepy
-        console.log(event.currentTarget.dataset.other)// output: otherparams
-    }
-});
-
-// WePY 1.1.8以后的版本，只允许传string：
-
-<view @tap="tapName({{index}}, 'wepy', 'otherparams')"> Click me! </view>
-
-methods: {
-    tapName (id, title, other, event) {
-        console.log(id, title, other)// output: 1, wepy, otherparams
-    }
-}
-```
-
-#### 改变数据绑定方式
-
-保留setData方法，但不建议使用setData执行绑定，并且修改入参支持：
-
-`this.setData(target, value)`
-`this.setData(object)`
-
-点这里查看<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/template.html?t=20161122" target="_blank">官方文档</a>
-
-```html
-// 原生代码:
-
-<view> {{ message }} </view>
-
-onLoad: function () {
-    this.setData({message: 'hello world'});
-}
-
-
-// 基于WePY的代码:
-
-<view> {{ message }} </view>
-
-onLoad () {
-    this.message = 'hello world';
-}
-```
-
-#### 组件代替模板和模块
-
-点这里查看<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/data.html?t=20161122" target="_blank">官方文档</a>
-
-```html
-// 原生代码:
-
-<!-- item.wxml -->
-<template name="item">
-  <text>{{text}}</text>
-</template>
-
-<!-- index.wxml -->
-<import src="item.wxml"/>
-<template is="item" data="{{text: 'forbar'}}"/>
-
-<!-- index.js -->
-var item = require('item.js')
-
-
-// 基于WePY的代码:
-
-<!-- /components/item.wpy -->
- <text>{{text}}</text>
-
-<!-- index.wpy -->
-<template>
-    <component id="item"></component>
-</template>
-<script>
-    import wepy from 'wepy';
-    import Item from '../components/item';
-    export default class Index extends wepy.page {
-        components = { Item }
-    }
-</script>
-```
-
-## 其他
-
-更多细节，还可参看[API文档](https://tencent.github.io/wepy/#/api)。
diff --git a/docs/css/donate.css b/docs/css/donate.css
deleted file mode 100644
index 98468ae3c..000000000
--- a/docs/css/donate.css
+++ /dev/null
@@ -1,1080 +0,0 @@
-html,
-body,
-div,
-span,
-applet,
-object,
-iframe,
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-p,
-blockquote,
-pre,
-a,
-abbr,
-acronym,
-address,
-big,
-cite,
-code,
-del,
-dfn,
-em,
-font,
-ins,
-kbd,
-q,
-s,
-samp,
-small,
-strike,
-strong,
-sub,
-sup,
-tt,
-var,
-dl,
-dt,
-dd,
-ol,
-ul,
-li,
-fieldset,
-form,
-label,
-legend,
-table,
-caption,
-tbody,
-tfoot,
-thead,
-tr,
-th,
-td {
-  border: 0;
-  font-family: inherit;
-  font-size: 100%;
-  font-style: inherit;
-  font-weight: inherit;
-  margin: 0;
-  outline: 0;
-  padding: 0;
-  vertical-align: baseline;
-}
-html {
-  font-size: 62.5%;
-  /* Corrects text resizing oddly in IE6/7 when body font-size is set using em units http://clagnut.com/blog/348/#c790 */
-  overflow-y: scroll;
-  /* Keeps page centred in all browsers regardless of content height */
-  -webkit-text-size-adjust: 100%;
-  /* Prevents iOS text size adjust after orientation change, without disabling user zoom */
-  -ms-text-size-adjust: 100%;
-  /* www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/ */
-}
-body {
-  background: #fff;
-}
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-nav,
-section {
-  display: block;
-}
-ol,
-ul {
-  list-style: none;
-}
-table {
-  /* tables still need 'cellspacing="0"' in the markup */
-  border-collapse: separate;
-  border-spacing: 0;
-}
-caption,
-th,
-td {
-  font-weight: normal;
-  text-align: left;
-}
-blockquote:before,
-blockquote:after,
-q:before,
-q:after {
-  content: "";
-}
-blockquote,
-q {
-  quotes: "" "";
-}
-a:focus {
-  outline: thin dotted;
-}
-a:hover,
-a:active {
-  /* Improves readability when focused and also mouse hovered in all browsers people.opera.com/patrickl/experiments/keyboard/test */
-  outline: 0;
-}
-a img {
-  border: 0;
-}
-input,
-textarea {
-  border-radius: 0;
-  appearance: none;
-}
-input[type="radio"],
-input[type="checkbox"] {
-  -webkit-appearance: none;
-}
-.button {
-  display: block;
-  height: 44px;
-  line-height: 43px;
-  padding: 0 20px;
-  font-family: Helvetica, Arial, "Hiragino Sans GB", "Source Han Sans CN", Roboto, "Microsoft Yahei", sans-serif;
-  font-size: 13px;
-  text-transform: uppercase;
-  text-align: center;
-  letter-spacing: 1px;
-  color: white;
-  background-color: #68c0f8;
-  box-shadow: 0 8px 14px 0 #DEE2E5;
-  border-radius: 8px;
-  transform: translate3d(0, 0, 0) scale(1);
-  transition: transform 0.1s ease, box-shadow 0.2s ease, background-color 0.2s ease;
-  -webkit-appearance: none;
-  cursor: pointer;
-}
-.button:active {
-  transform: translate3d(0, 0, 0) scale(0.99);
-}
-.button:hover {
-  background-color: #9ae8a3;
-}
-.button.button--disabled {
-  color: rgba(255, 255, 255, 0.5);
-  cursor: default;
-}
-.button.button--secondary {
-  box-shadow: none;
-}
-.button.button--secondary:hover {
-  color: white;
-  background-color: rgba(99, 112, 202, 0.1);
-}
-.button.button--more {
-  padding: 0 35px;
-  transform: translate3d(-50%, 0, 0);
-  position: absolute;
-  bottom: 30px;
-  left: 50%;
-  transition: transform 0.2s ease, background-color 0.2s ease;
-}
-.button.button--more:active {
-  transform: translate3d(-50%, 0, 0) scale(0.99);
-}
-table.table {
-  line-height: 26px;
-  width: 100%;
-  margin-bottom: 20px;
-}
-table.table.border {
-  border: 1px solid #E3E6E9;
-}
-table.table.stripe tbody tr:nth-child(2n + 1) td {
-  background: rgba(245, 246, 250, 0.6);
-}
-table.table.hover tbody tr:hover td,
-table.table.hover tbody tr:hover th {
-  background: #F5F6FA;
-}
-@media (max-width: 768px) {
-  table.table.responsive {
-    border-top: 0;
-  }
-}
-table.table.responsive tr th {
-  display: table-cell;
-}
-@media (max-width: 768px) {
-  table.table.responsive tr th {
-    display: none;
-  }
-}
-table.table.responsive tr td {
-  display: table-cell;
-}
-@media (max-width: 768px) {
-  table.table.responsive tr td {
-    display: block;
-    padding-left: 42%;
-    padding-bottom: 0;
-    padding-right: 15px;
-    position: relative;
-    border: 0;
-  }
-}
-table.table.responsive tr td:first-child {
-  border-top: 1px solid #E3E6E9;
-}
-table.table.responsive tr td:last-child {
-  padding-bottom: 10px;
-}
-table.table.responsive tr td:before {
-  content: attr(data-th) ": ";
-  color: #454954;
-  font-weight: normal;
-  display: none;
-  position: absolute;
-  left: 15px;
-  top: 10px;
-  width: 42%;
-}
-@media (max-width: 768px) {
-  table.table.responsive tr td:before {
-    display: block;
-  }
-}
-table.table tr th {
-  color: #454954;
-  padding: 10px 15px;
-  background: none;
-  font-weight: normal;
-}
-table.table tr td {
-  padding: 10px 15px;
-  border-top: 1px solid #E3E6E9;
-  background: none;
-}
-.footer {
-  position: fixed;
-  width: 100%;
-  bottom: 0;
-  left: 0;
-  z-index: -1;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-pack: center;
-  justify-content: center;
-  background-color: #353535;
-}
-.footer.footer--page {
-  position: static;
-  margin: -96px 0 0 0;
-  border-top: 56px solid #4A5C69;
-}
-.footer-inner {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-pack: justify;
-  justify-content: space-between;
-  width: 1080px;
-}
-.footer--copyright {
-  color: white;
-  opacity: .5;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-pack: justify;
-  justify-content: space-between;
-  padding: 65px 0 75px 0;
-}
-.footer-logo-wrap {
-  width: 280px;
-  display: -ms-flexbox;
-  display: flex;
-}
-.footer-logo-wrap__inner {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-pack: justify;
-  justify-content: space-between;
-  padding: 65px 0 75px 0;
-}
-.footer-logo {
-  width: 52px;
-  height: 52px;
-  background-size: 52px;
-  background-image: url(../img/wepylogo.png);
-}
-.footer-header {
-  color: white;
-  opacity: .5;
-  font-size: 18px;
-  margin: 0 0 40px 0;
-}
-.footer-link {
-  height: 32px;
-  line-height: 32px;
-  font-size: 16px;
-  margin: 0 0 15px 0;
-}
-.footer-link a {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-align: center;
-  align-items: center;
-  color: white;
-}
-.footer-link a:hover {
-  opacity: .8;
-}
-.footer-icon {
-  display: inline-block;
-  width: 32px;
-  height: 32px;
-  background-color: rgba(255, 255, 255, 0.1);
-  border-radius: 50%;
-  margin: 0 15px 0 0;
-  background-repeat: no-repeat;
-  background-size: 24px;
-  background-position: center;
-}
-@media (max-width: 1140px) {
-  .footer-inner {
-    width: 820px;
-    -ms-flex-pack: distribute;
-    justify-content: space-around;
-  }
-  .footer-logo-wrap {
-    width: 200px;
-  }
-}
-@media (max-width: 767px) {
-  .footer {
-    position: static;
-    border-top: 0px;
-  }
-  .footer.footer--page {
-    border-top: 100px solid #4A5C69;
-  }
-  .footer-inner {
-    padding: 30px 0 0 0;
-    -ms-flex-direction: column;
-    flex-direction: column;
-  }
-  .footer--copyright {
-    padding: 20px 30px;
-  }
-  .footer-logo-wrap {
-    width: auto;
-    -ms-flex-order: 2;
-    order: 2;
-  }
-  .footer-header {
-    margin: 0 0 10px 0;
-  }
-  .footer-logo-wrap__inner {
-    width: 100%;
-    padding: 0 0 40px 0;
-    -ms-flex-align: center;
-    align-items: center;
-    text-align: center;
-  }
-  .footer-link {
-    text-align: center;
-    height: 24px;
-    line-height: 24px;
-    margin: 0 0 10px 0;
-  }
-  .footer-link a {
-    -ms-flex-pack: center;
-    justify-content: center;
-    text-align: center;
-  }
-  .footer-icon {
-    display: none;
-  }
-  .footer-logo {
-    display: none;
-  }
-}
-.modal-container {
-  position: fixed;
-  width: 100%;
-  height: 100%;
-  top: 0;
-  left: 0;
-  opacity: 0;
-  visibility: hidden;
-  cursor: pointer;
-  overflow-y: auto;
-  z-index: 3;
-  font-family: 'Lato', 'Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif';
-  font-size: 14px;
-  -webkit-transition: all 0.25s linear;
-  -moz-transition: all 0.25s linear;
-  -o-transition: all 0.25s linear;
-  -ms-transition: all 0.25s linear;
-  transition: all 0.25s linear;
-}
-.modal-container.active {
-  opacity: 1;
-  visibility: visible;
-}
-.modal-container .qr-modal {
-  border-radius: 8px;
-  box-shadow: 0 24px 80px -2px #067a1f !important;
-  transition: box-shadow 1s;
-  position: relative;
-  margin: 50px auto;
-  width: 90%;
-  padding: 20px;
-  max-width: 380px;
-  text-align: center;
-  font-weight: bold;
-  background-color: #f6f6f6;
-  cursor: initial;
-}
-body {
-  background-color: #F4F4F4;
-  font-family: Helvetica, Arial, "Hiragino Sans GB", "Source Han Sans CN", Roboto, "Microsoft Yahei", sans-serif;
-  font-weight: 400;
-  font-size: 14px;
-  line-height: 25px;
-  color: #49555f;
-  text-rendering: optimizeLegibility;
-  -webkit-font-smoothing: antialiased;
-}
-a {
-  color: #1F9948;
-  text-decoration: none;
-  font-weight: bold;
-  transition: opacity .2s ease;
-  outline: 0px;
-}
-a.cases {
-  color: #000;
-  font-weight: normal;
-  cursor: default;
-}
-a.cases.islink {
-  color: #1F9948;
-  font-weight: bold;
-  cursor: pointer;
-}
-.container-wrap {
-  z-index: 2;
-  margin-bottom: 160px;
-  background-color: #F4F4F4;
-  box-shadow: 0 0 30px 0 rgba(54, 69, 79, 0.86);
-}
-.container {
-  max-width: 1280px;
-  margin: 0 auto;
-  overflow: hidden;
-  position: relative;
-}
-@media (max-width: 767px) {
-  .container-wrap {
-    margin-bottom: 0;
-  }
-}
-/*.slide.slide--one .slide__inner {
-    margin: 30px 0 0 0;
-    height: 780px;
-    background-color: #4957B8;
-    background-image: url(../img/dot.svg);
-    box-shadow: 0px 10px 14px 0px rgba(79, 90, 166, 0.35);
-    border-radius: 10px;
-    transform: translate3d(0, 0, 0);
-    transition: transform .6s ease, opacity .3s ease;
-}*/
-@-moz-keyframes pulsate {
-  0% {
-    transform: scale(1);
-    box-shadow: 0 2px 9px 0 rgba(57, 80, 164, 0.69);
-  }
-  50% {
-    transform: scale(1.14);
-    box-shadow: 0px 10px 14px 0 rgba(57, 80, 164, 0.69);
-  }
-  100% {
-    transform: scale(1);
-    box-shadow: 0 2px 9px 0 rgba(57, 80, 164, 0.69);
-  }
-}
-@-webkit-keyframes pulsate {
-  0% {
-    transform: scale(1);
-    box-shadow: 0 2px 9px 0 rgba(57, 80, 164, 0.69);
-  }
-  50% {
-    transform: scale(1.14);
-    box-shadow: 0px 10px 14px 0 rgba(57, 80, 164, 0.69);
-  }
-  100% {
-    transform: scale(1);
-    box-shadow: 0 2px 9px 0 rgba(57, 80, 164, 0.69);
-  }
-}
-@keyframes pulsate {
-  0% {
-    transform: scale(1);
-    box-shadow: 0 2px 9px 0 rgba(57, 80, 164, 0.69);
-  }
-  50% {
-    transform: scale(1.14);
-    box-shadow: 0px 10px 14px 0 rgba(57, 80, 164, 0.69);
-  }
-  100% {
-    transform: scale(1);
-    box-shadow: 0 2px 9px 0 rgba(57, 80, 164, 0.69);
-  }
-}
-@-moz-keyframes pulsateArea {
-  0% {
-    transform: scale(0.1);
-    opacity: .1;
-  }
-  100% {
-    transform: scale(1.4);
-    opacity: 0;
-  }
-}
-@-webkit-keyframes pulsateArea {
-  0% {
-    transform: scale(0.1);
-    opacity: .1;
-  }
-  100% {
-    transform: scale(1.4);
-    opacity: 0;
-  }
-}
-@keyframes pulsateArea {
-  0% {
-    transform: scale(0.1);
-    opacity: .1;
-  }
-  100% {
-    transform: scale(1.4);
-    opacity: 0;
-  }
-}
-.header {
-  background: linear-gradient(90deg, #1F9948 50%, #1F9548 50%);
-}
-.header-pattern {
-  background-image: url(../img/dot.svg);
-  background-size: 20px;
-  background-position: left top;
-  background-repeat: repeat;
-  padding-bottom: 134px;
-}
-.header-pattern img {
-  width: 160px;
-  height: 160px;
-}
-@media (min-width: 1230px) {
-  .header {
-    margin: 0 auto;
-    margin-top: 40px;
-    border-radius: 10px;
-    z-index: 900;
-    max-width: 1200px;
-  }
-}
-.header__inner {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-pack: justify;
-  justify-content: space-between;
-  padding: 16px 0 0 16px;
-}
-@media (min-width: 640px) {
-  .header__inner {
-    -ms-flex-direction: row;
-    flex-direction: row;
-    padding: 40px 0 38px 40px;
-  }
-}
-.header-section {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-align: center;
-  align-items: center;
-}
-.header-section--center {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-pack: center;
-  justify-content: center;
-}
-@media (min-width: 640px) {
-  .header-section--right {
-    -ms-flex-pack: end;
-    justify-content: flex-end;
-  }
-}
-.nav {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-align: center;
-  align-items: center;
-  opacity: 1;
-}
-.nav__item:first-child {
-  padding-left: 0;
-}
-a.logo {
-  display: -ms-flexbox;
-  display: flex;
-  width: 260px;
-  -ms-flex-wrap: nowrap;
-  flex-wrap: nowrap;
-  -ms-flex-pack: start;
-  justify-content: flex-start;
-  -ms-flex-align: start;
-  align-items: flex-start;
-}
-.logo__icon {
-  height: 52px;
-  width: 52px;
-  background-image: url(../img/wepylogo.png);
-  background-size: 52px;
-  background-position: left;
-}
-.logo_text {
-  margin: 2px 0 0 8px;
-}
-.logo__title {
-  display: block;
-  font-family: Helvetica, Arial, "Hiragino Sans GB", "Source Han Sans CN", Roboto, "Microsoft Yahei", sans-serif;
-  font-size: 22px;
-  line-height: 25px;
-  color: white;
-}
-.logo__description {
-  display: block;
-  font-size: 15px;
-  line-height: 25px;
-  color: white;
-  opacity: .8;
-}
-.nav a {
-  font-size: 15px;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-align: center;
-  align-items: center;
-  padding: 15px 15px;
-}
-.header .nav a {
-  color: #ffffff;
-  transition: opacity .2s ease;
-  position: relative;
-}
-.header .nav a:hover {
-  opacity: 0.5;
-}
-.nav a:hover {
-  opacity: .9;
-}
-.shares {
-  margin-right: 30px;
-  width: 260px;
-  height: 50px;
-}
-.shares .social-links {
-  -ms-flex-pack: end;
-  justify-content: flex-end;
-}
-.social-links {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-pack: center;
-  justify-content: center;
-}
-.social-links li.social-link {
-  margin: 0 5px;
-}
-li.social-link a {
-  display: block;
-  width: 40px;
-  height: 40px;
-  border-radius: 50%;
-  background: rgba(255, 255, 255, 0.2);
-  background-repeat: no-repeat;
-  background-size: 20px;
-  background-position: center;
-  transition: transform .2s ease;
-  cursor: pointer;
-}
-.social-link.social-link--wx a {
-  color: #1F9948;
-  background-image: url(../img/icon_wechat.svg);
-}
-.social-link.social-link--gh a {
-  color: #343332;
-  background-image: url(../img/icon_gh.svg);
-}
-.social-link:hover a {
-  -ms-transform: scale(1.06);
-  transform: scale(1.06);
-}
-@media (max-width: 1440px) {
-  .header {
-    top: 0;
-  }
-  .header__inner {
-    width: 100%;
-    margin: 40px;
-    -ms-flex-align: center;
-    align-items: center;
-  }
-  .header-wrap {
-    margin: 0 0 0 0;
-    width: 100%;
-  }
-}
-@media (max-width: 960px) {
-  a.logo {
-    width: auto;
-  }
-  .shares {
-    position: absolute;
-    top: 30px;
-    right: -10px;
-    width: auto;
-  }
-}
-@media (max-width: 767px) {
-  .header__inner {
-    margin: 0px;
-    -ms-flex-align: start;
-    align-items: flex-start;
-  }
-  .header-wrap {
-    height: 92px;
-    border-radius: 0;
-  }
-  .logo__icon {
-    height: 48px;
-    width: 48px;
-    background-size: 48px;
-    -ms-flex-negative: 0;
-    flex-shrink: 0;
-    flex-grow: 0;
-  }
-  .logo__title {
-    font-size: 18px;
-    line-height: 24px;
-  }
-  .logo__description {
-    font-size: 14px;
-    line-height: 15px;
-  }
-  .logo__description span {
-    display: none;
-  }
-  .logo_text {
-    margin: 0px 0 0 4px;
-  }
-  .nav {
-    display: none;
-  }
-  .shares {
-    display: none;
-  }
-}
-.actions {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-  text-align: center;
-  -ms-flex-pack: space-evenly;
-  justify-content: space-evenly;
-}
-@media (min-width: 640px) {
-  .actions {
-    -ms-flex-direction: row;
-    flex-direction: row;
-  }
-}
-.action {
-  -ms-flex-preferred-size: 0;
-  flex-basis: 0;
-  -ms-flex-positive: 1;
-  flex-grow: 1;
-  margin-top: 24px;
-}
-@media (min-width: 640px) {
-  .actions {
-    margin-top: 64px;
-  }
-}
-.action h1 {
-  font-size: 13px;
-  font-weight: 500;
-  margin-bottom: 7px;
-  line-height: 1.15;
-  letter-spacing: 1.1px;
-  text-align: center;
-  text-transform: uppercase;
-  color: #ffffff;
-}
-.action h2 {
-  font-size: 25px;
-  font-weight: 500;
-  margin-bottom: 6px;
-  line-height: 1.36;
-  text-align: center;
-  color: #ffffff;
-}
-.action p {
-  opacity: 0.6;
-  font-size: 18px;
-  line-height: 25px;
-  margin: 0 auto 26px;
-  max-width: 400px;
-  text-align: center;
-  color: #ffffff;
-}
-.container {
-  margin: 0 auto;
-  overflow: hidden;
-  position: relative;
-  background-color: #f2f5f8;
-}
-.container.container--page {
-  min-height: 500px;
-}
-.slides {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-  background: #f2f5f8;
-}
-.slide {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-align: center;
-  align-items: center;
-}
-.slide__text h2 {
-  font-size: 24px;
-  font-weight: 500;
-  line-height: 2;
-  text-align: center;
-  color: #42505c;
-}
-.slide__text .text {
-  max-width: 520px;
-  font-size: 16px;
-  font-weight: 500;
-  line-height: 1.65;
-  text-align: center;
-}
-.slide__text strong {
-  color: #1F9948;
-}
-.slide__text .button {
-  display: inline-block;
-  width: 180px;
-  height: 45px;
-  margin-top: 16px;
-  border-radius: 8px;
-  background-color: #57a7ed;
-  transition: opacity .2s ease;
-}
-.slide__text .button--pr {
-  background: #1F9948;
-  box-shadow: none;
-  transition: box-shadow 0.3s ease, transform 0.3s ease;
-}
-.slide__text .button--pr:hover {
-  box-shadow: 0 8px 30px 2px rgba(28, 216, 87, 0.5);
-}
-.slide--hidden {
-  display: none;
-}
-.slide__inner {
-  position: relative;
-}
-.slide.slide--one .slide__inner {
-  width: 1200px;
-  position: relative;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-pack: center;
-  justify-content: center;
-  -ms-flex-align: center;
-  align-items: center;
-  -ms-flex-direction: column;
-  flex-direction: column;
-}
-.slide.slide--three .slide__inner {
-  text-align: center;
-  margin: 0 0 60px 0;
-}
-.hero-image-wrap {
-  width: 300px;
-  height: 240px;
-}
-.tagline {
-  text-align: center;
-}
-.tagline .tagline__title {
-  color: #ffffff;
-  font-size: 34px;
-  line-height: 31px;
-  margin: 0 16px 10px 16px;
-  padding: 16px 0;
-  border-bottom: 1px rgba(255, 255, 255, 0.3) solid;
-}
-@media (min-width: 640px) {
-  .tagline {
-    padding: 0 16px;
-  }
-  .tagline .tagline__title {
-    border: none;
-    padding: 0 24px;
-    margin: 0;
-  }
-}
-.shown .tagline__title {
-  opacity: 1;
-  transform: translate3d(0, 0, 0);
-}
-.tagline .tagline__body {
-  color: #ffffff;
-  font-size: 17px;
-  line-height: 24px;
-  margin: 0 0 20px 0;
-  opacity: 0.5;
-}
-.shown .tagline__body {
-  opacity: .5;
-  transform: translate3d(0, 0, 0);
-}
-@media (max-width: 1200px) {
-  .slide.slide--one .slide__inner {
-    width: 100%;
-  }
-}
-@media (max-width: 740px) {
-  .tagline .tagline__title {
-    font-size: 22px;
-    line-height: 26px;
-  }
-  .tagline .tagline__body {
-    padding: 0 24px;
-  }
-}
-.slide.slide--two .slide__inner {
-  background: #FFFFFF;
-  margin: 0 0 0 0;
-}
-@media (min-width: 1200px) {
-  .slide.slide--two .slide__inner {
-    top: -72px;
-    width: 1150px;
-    background: #FFFFFF;
-    box-shadow: 0 5px 16px 0 rgba(230, 235, 238, 0.68);
-    border-radius: 8px;
-  }
-}
-@media (max-width: 1200px) {
-  .slide.slide--two .slide__inner {
-    width: 100%;
-    border-radius: 0;
-  }
-}
-.section {
-  display: -ms-flexbox;
-  display: flex;
-}
-.section--title {
-  font-family: Helvetica, Arial, "Hiragino Sans GB", "Source Han Sans CN", Roboto, "Microsoft Yahei", sans-serif;
-  font-weight: bold;
-  font-size: 24px;
-  font-weight: 500;
-  line-height: 1.42;
-  text-align: center;
-  margin-top: 20px;
-  margin-left: 40px;
-  margin-right: 40px;
-  color: #42505c;
-}
-@media (min-width: 640px) {
-  .section--title {
-    margin-top: 50px;
-    margin-bottom: 20px;
-  }
-}
-.section__content {
-  padding: 30px;
-  -ms-flex-positive: 1;
-  flex-grow: 1;
-  -ms-flex-preferred-size: 0;
-  flex-basis: 0;
-}
-.section__content h1 {
-  padding: 8px 16px;
-  margin: 16px auto;
-  width: -webkit-fit-content;
-  width: -moz-fit-content;
-  width: fit-content;
-  border-radius: 100px;
-  font-size: 13px;
-  font-weight: 500;
-  line-height: 1.15;
-  letter-spacing: 1.1px;
-  text-align: center;
-  text-transform: uppercase;
-}
-.section__content h2 {
-  font-size: 19px;
-  font-weight: 500;
-  line-height: 1.26;
-  text-align: left;
-  color: #42505c;
-  margin-bottom: 14px;
-}
-.section__content .text + h2 {
-  margin-top: 30px;
-}
-.section__content .text {
-  font-size: 18px;
-  color: #8D99A4;
-  line-height: 1.44;
-}
-.section__content .text strong {
-  font-weight: 500;
-  color: #42505c;
-}
-@media (max-width: 740px) {
-  .section {
-    height: auto;
-    -ms-flex-direction: column;
-    flex-direction: column;
-  }
-  .section__image {
-    height: 260px;
-  }
-  .section__content {
-    width: 90%;
-    padding: 24px 30px 24px 24px;
-  }
-}
diff --git a/docs/css/main.css b/docs/css/main.css
deleted file mode 100644
index 12e02af87..000000000
--- a/docs/css/main.css
+++ /dev/null
@@ -1,2134 +0,0 @@
-html,
-body,
-div,
-span,
-applet,
-object,
-iframe,
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-p,
-blockquote,
-pre,
-a,
-abbr,
-acronym,
-address,
-big,
-cite,
-code,
-del,
-dfn,
-em,
-font,
-ins,
-kbd,
-q,
-s,
-samp,
-small,
-strike,
-strong,
-sub,
-sup,
-tt,
-var,
-dl,
-dt,
-dd,
-ol,
-ul,
-li,
-fieldset,
-form,
-label,
-legend,
-table,
-caption,
-tbody,
-tfoot,
-thead,
-tr,
-th,
-td {
-  border: 0;
-  font-family: inherit;
-  font-size: 100%;
-  font-style: inherit;
-  font-weight: inherit;
-  margin: 0;
-  outline: 0;
-  padding: 0;
-  vertical-align: baseline;
-}
-html {
-  font-size: 62.5%;
-  /* Corrects text resizing oddly in IE6/7 when body font-size is set using em units http://clagnut.com/blog/348/#c790 */
-  overflow-y: scroll;
-  /* Keeps page centred in all browsers regardless of content height */
-  -webkit-text-size-adjust: 100%;
-  /* Prevents iOS text size adjust after orientation change, without disabling user zoom */
-  -ms-text-size-adjust: 100%;
-  /* www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/ */
-}
-body {
-  background: #fff;
-}
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-nav,
-section {
-  display: block;
-}
-ol,
-ul {
-  list-style: none;
-}
-table {
-  /* tables still need 'cellspacing="0"' in the markup */
-  border-collapse: separate;
-  border-spacing: 0;
-}
-caption,
-th,
-td {
-  font-weight: normal;
-  text-align: left;
-}
-blockquote:before,
-blockquote:after,
-q:before,
-q:after {
-  content: "";
-}
-blockquote,
-q {
-  quotes: "" "";
-}
-a:focus {
-  outline: thin dotted;
-}
-a:hover,
-a:active {
-  /* Improves readability when focused and also mouse hovered in all browsers people.opera.com/patrickl/experiments/keyboard/test */
-  outline: 0;
-}
-a img {
-  border: 0;
-}
-input,
-textarea {
-  border-radius: 0;
-  appearance: none;
-}
-input[type="radio"],
-input[type="checkbox"] {
-  -webkit-appearance: none;
-}
-body {
-  background-color: #F4F4F4;
-  font-family: Helvetica, Arial, "Hiragino Sans GB", "Source Han Sans CN", Roboto, "Microsoft Yahei", sans-serif;
-  font-weight: 400;
-  font-size: 14px;
-  line-height: 25px;
-  color: #49555f;
-  text-rendering: optimizeLegibility;
-  -webkit-font-smoothing: antialiased;
-}
-a {
-  color: #1F9948;
-  text-decoration: none;
-  font-weight: bold;
-  transition: opacity .2s ease;
-  outline: 0px;
-}
-a.cases {
-  color: #000;
-  font-weight: normal;
-  cursor: default;
-}
-a.cases.islink {
-  color: #1F9948;
-  font-weight: bold;
-  cursor: pointer;
-}
-.container-wrap {
-  z-index: 2;
-  margin-bottom: 160px;
-  background-color: #F4F4F4;
-  box-shadow: 0 0 30px 0 rgba(54, 69, 79, 0.86);
-}
-.container {
-  max-width: 1280px;
-  margin: 0 auto;
-  overflow: hidden;
-  position: relative;
-}
-@media (max-width: 767px) {
-  .container-wrap {
-    margin-bottom: 0;
-  }
-}
-/*.slide.slide--one .slide__inner {
-    margin: 30px 0 0 0;
-    height: 780px;
-    background-color: #4957B8;
-    background-image: url(../img/dot.svg);
-    box-shadow: 0px 10px 14px 0px rgba(79, 90, 166, 0.35);
-    border-radius: 10px;
-    transform: translate3d(0, 0, 0);
-    transition: transform .6s ease, opacity .3s ease;
-}*/
-@-moz-keyframes pulsate {
-  0% {
-    transform: scale(1);
-    box-shadow: 0 2px 9px 0 rgba(57, 80, 164, 0.69);
-  }
-  50% {
-    transform: scale(1.14);
-    box-shadow: 0px 10px 14px 0 rgba(57, 80, 164, 0.69);
-  }
-  100% {
-    transform: scale(1);
-    box-shadow: 0 2px 9px 0 rgba(57, 80, 164, 0.69);
-  }
-}
-@-webkit-keyframes pulsate {
-  0% {
-    transform: scale(1);
-    box-shadow: 0 2px 9px 0 rgba(57, 80, 164, 0.69);
-  }
-  50% {
-    transform: scale(1.14);
-    box-shadow: 0px 10px 14px 0 rgba(57, 80, 164, 0.69);
-  }
-  100% {
-    transform: scale(1);
-    box-shadow: 0 2px 9px 0 rgba(57, 80, 164, 0.69);
-  }
-}
-@keyframes pulsate {
-  0% {
-    transform: scale(1);
-    box-shadow: 0 2px 9px 0 rgba(57, 80, 164, 0.69);
-  }
-  50% {
-    transform: scale(1.14);
-    box-shadow: 0px 10px 14px 0 rgba(57, 80, 164, 0.69);
-  }
-  100% {
-    transform: scale(1);
-    box-shadow: 0 2px 9px 0 rgba(57, 80, 164, 0.69);
-  }
-}
-@-moz-keyframes pulsateArea {
-  0% {
-    transform: scale(0.1);
-    opacity: .1;
-  }
-  100% {
-    transform: scale(1.4);
-    opacity: 0;
-  }
-}
-@-webkit-keyframes pulsateArea {
-  0% {
-    transform: scale(0.1);
-    opacity: .1;
-  }
-  100% {
-    transform: scale(1.4);
-    opacity: 0;
-  }
-}
-@keyframes pulsateArea {
-  0% {
-    transform: scale(0.1);
-    opacity: .1;
-  }
-  100% {
-    transform: scale(1.4);
-    opacity: 0;
-  }
-}
-.button {
-  display: block;
-  height: 44px;
-  line-height: 43px;
-  padding: 0 20px;
-  font-family: Helvetica, Arial, "Hiragino Sans GB", "Source Han Sans CN", Roboto, "Microsoft Yahei", sans-serif;
-  font-size: 13px;
-  text-transform: uppercase;
-  text-align: center;
-  letter-spacing: 1px;
-  color: white;
-  background-color: #68c0f8;
-  box-shadow: 0 8px 14px 0 #DEE2E5;
-  border-radius: 8px;
-  transform: translate3d(0, 0, 0) scale(1);
-  transition: transform 0.1s ease, box-shadow 0.2s ease, background-color 0.2s ease;
-  -webkit-appearance: none;
-  cursor: pointer;
-}
-.button:active {
-  transform: translate3d(0, 0, 0) scale(0.99);
-}
-.button:hover {
-  background-color: #9ae8a3;
-}
-.button.button--disabled {
-  color: rgba(255, 255, 255, 0.5);
-  cursor: default;
-}
-.button.button--secondary {
-  box-shadow: none;
-}
-.button.button--secondary:hover {
-  color: white;
-  background-color: rgba(99, 112, 202, 0.1);
-}
-.button.button--more {
-  padding: 0 35px;
-  transform: translate3d(-50%, 0, 0);
-  position: absolute;
-  bottom: 30px;
-  left: 50%;
-  transition: transform 0.2s ease, background-color 0.2s ease;
-}
-.button.button--more:active {
-  transform: translate3d(-50%, 0, 0) scale(0.99);
-}
-.header-wrap {
-  margin: 30px 0 0 0;
-  width: 1080px;
-  height: 130px;
-  background-color: #4957b8;
-  background-image: url(../img/dot.svg);
-  box-shadow: 0px 10px 14px 0px rgba(79, 90, 166, 0.35);
-  border-top-left-radius: 10px;
-  border-top-right-radius: 10px;
-  transform: translate3d(0, 0, 0);
-  transition: transform .6s ease, opacity .3s ease;
-}
-.header {
-  position: absolute;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-pack: center;
-  justify-content: center;
-  width: 100%;
-  z-index: 900;
-  top: 40px;
-  left: 0;
-}
-.header .nav a {
-  color: white;
-  outline: 0px;
-}
-.header__inner {
-  width: 1012px;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-pack: justify;
-  justify-content: space-between;
-}
-.nav {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-align: start;
-  align-items: flex-start;
-}
-.nav a {
-  font-family: Helvetica, Arial, "Hiragino Sans GB", "Source Han Sans CN", Roboto, "Microsoft Yahei", sans-serif;
-  font-size: 15px;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-align: center;
-  align-items: center;
-  padding: 10px 15px 15px;
-}
-.nav a:hover {
-  opacity: .9;
-}
-a.logo {
-  display: -ms-flexbox;
-  display: flex;
-  width: 260px;
-  -ms-flex-wrap: nowrap;
-  flex-wrap: nowrap;
-  -ms-flex-pack: start;
-  justify-content: flex-start;
-  -ms-flex-align: start;
-  align-items: flex-start;
-}
-.logo__icon {
-  height: 52px;
-  width: 52px;
-  background-image: url(../img/wepylogo.png);
-  background-size: 52px;
-  background-position: left;
-}
-.logo_text {
-  margin: 2px 0 0 8px;
-}
-.logo__title {
-  display: block;
-  font-family: Helvetica, Arial, "Hiragino Sans GB", "Source Han Sans CN", Roboto, "Microsoft Yahei", sans-serif;
-  font-size: 22px;
-  line-height: 25px;
-  color: white;
-}
-.logo__description {
-  display: block;
-  font-size: 15px;
-  line-height: 25px;
-  color: white;
-  opacity: .8;
-}
-.shares {
-  width: 260px;
-  height: 50px;
-}
-.shares .social-links {
-  -ms-flex-pack: end;
-  justify-content: flex-end;
-}
-.social-links {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-pack: center;
-  justify-content: center;
-}
-.social-links li.social-link {
-  margin: 0 5px;
-}
-li.social-link a {
-  display: block;
-  width: 40px;
-  height: 40px;
-  border-radius: 50%;
-  background: rgba(255, 255, 255, 0.2);
-  background-repeat: no-repeat;
-  background-size: 20px;
-  background-position: center;
-  transition: transform .2s ease;
-  cursor: pointer;
-}
-.social-link.social-link--wx a {
-  color: #1F9948;
-  background-image: url(../img/icon_wechat.svg);
-}
-.social-link.social-link--gh a {
-  background-image: url(../img/icon_gh.svg);
-}
-.social-link:hover a {
-  -ms-transform: scale(1.06);
-  transform: scale(1.06);
-}
-@media (max-width: 1440px) {
-  .header {
-    top: 0;
-  }
-  .header__inner {
-    width: 100%;
-    margin: 40px;
-    -ms-flex-align: center;
-    align-items: center;
-  }
-  .header-wrap {
-    margin: 0 0 0 0;
-    width: 100%;
-  }
-}
-@media (max-width: 960px) {
-  a.logo {
-    width: auto;
-  }
-  .shares {
-    width: auto;
-  }
-}
-@media (max-width: 840px) {
-  .header__inner {
-    margin: 30px;
-  }
-}
-@media (max-width: 767px) {
-  .header__inner {
-    margin: 20px 20px 20px 17px;
-    -ms-flex-align: start;
-    align-items: flex-start;
-    display: inline-block;
-  }
-  .header-wrap {
-    height: 92px;
-    border-radius: 0;
-  }
-  .logo__icon {
-    height: 48px;
-    width: 48px;
-    background-size: 48px;
-    -ms-flex-negative: 0;
-    flex-shrink: 0;
-    flex-grow: 0;
-  }
-  .logo__title {
-    font-size: 18px;
-    line-height: 24px;
-  }
-  .logo__description {
-    font-size: 14px;
-    line-height: 15px;
-  }
-  .logo__description span {
-    display: none;
-  }
-  .logo_text {
-    margin: 0px 0 0 4px;
-  }
-  .nav a {
-    padding: 5px;
-    font-size: .82em;
-  }
-  .tagline__title {
-    display: none;
-  }
-  .tagline__body {
-    display: none;
-  }
-  .shares {
-    justify-content: center;
-    display: flex;
-    margin-bottom: 50px;
-  }
-  .shares .social-links li.social-link {
-    margin: 0 0 0 7px;
-  }
-}
-.tagline {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-pack: center;
-  justify-content: center;
-  position: absolute;
-  z-index: 200;
-  text-align: center;
-  width: 100%;
-  display: inline-block;
-  top: 200px;
-}
-.tagline .tagline__title {
-  font-family: font_family_1;
-  color: white;
-  font-size: 25px;
-  line-height: 35px;
-  letter-spacing: 1px;
-  font-weight: 500;
-  margin: 0 0 5px 0;
-  opacity: 0;
-  transform: translate3d(0, 20px, 0);
-  transition: transform .6s ease, opacity .6s ease;
-  transition-delay: .1s;
-}
-.tagline .tagline__body {
-  color: white;
-  font-size: 18px;
-  line-height: 25px;
-  letter-spacing: 1px;
-  margin: 0 0 20px 0;
-  opacity: 0;
-  transform: translate3d(0, 20px, 0);
-  transition: transform .6s ease, opacity .6s ease;
-  transition-delay: .2s;
-}
-.shown .tagline__title {
-  opacity: 1;
-  transform: translate3d(0, 0, 0);
-}
-.shown .tagline__body {
-  opacity: .8;
-  transform: translate3d(0, 0, 0);
-}
-.shown .tagline__shieds {
-  opacity: 1;
-  transform: translate3d(0, 0, 0);
-}
-.shown .tagline__footer {
-  opacity: 1;
-  transform: translate3d(0, 0, 0);
-}
-.tagline__button {
-  display: -ms-flexbox;
-  display: flex;
-  justify-content: center;
-  transform: translate3d(0, 20px, 0);
-  transition: transform .6s ease, opacity .6s ease;
-  transition-delay: .3s;
-}
-.tagline__button .button.button--secondary {
-  font-size: 16px;
-  border: #fff 2px solid;
-  color: #353535;
-  background-color: white;
-  box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.1), 0 2px 2px 0 rgba(0, 0, 0, 0.1);
-  border-radisu: 8px;
-  width: 180px;
-}
-.tagline__shieds {
-  margin-top: 60px;
-  transform: translate3d(0, 20px, 0);
-  transition: transform .6s ease, opacity .6s ease;
-  transition-delay: .3s;
-}
-.tagline__shieds--social {
-  display: block;
-  margin-bottom: 20px;
-}
-.tagline__footer {
-  text-align: center;
-  color: white;
-  margin: 0 auto;
-  padding: 25px;
-  width: 200px;
-  font-size: 16px;
-  line-height: 24px;
-  opacity: 0;
-  transform: translate3d(0, 20px, 0);
-  transition: transform .6s ease, opacity .6s ease;
-  transition-delay: .3s;
-  display: none;
-}
-.tagline__footer-inner {
-  transition: opacity .2s ease;
-}
-.tagline__footer.tagline__footer--hidden .tagline__footer-inner {
-  opacity: 0;
-}
-.button.button--secondary {
-  box-shadow: none;
-}
-.button.button--secondary:hover {
-  color: white;
-  background-color: rgba(99, 112, 202, 0.1);
-}
-.button.button--more {
-  padding: 0 35px;
-  transform: translate3d(-50%, 0, 0);
-  position: absolute;
-  bottom: 30px;
-  left: 50%;
-  transition: transform 0.2s ease, background-color 0.2s ease;
-}
-.button.button--more:active {
-  transform: translate3d(-50%, 0, 0) scale(0.99);
-}
-@media (max-width: 1220px) {
-  .tagline {
-    left: 65px;
-  }
-}
-@media (max-width: 1030px) {
-  .tagline {
-    width: 300px;
-    top: 230px;
-  }
-}
-@media (max-width: 1140px) {
-  .tagline {
-    -ms-flex-pack: start;
-    justify-content: flex-start;
-    text-align: left;
-    left: 40px;
-  }
-}
-@media (max-width: 960px) {
-  .tagline {
-    width: 280px;
-  }
-}
-@media (max-width: 922px) {
-  .tagline {
-    width: 260px;
-    top: 180px;
-  }
-}
-@media (max-width: 840px) {
-  .tagline {
-    left: 30px;
-    width: 246px;
-  }
-  .tagline .tagline__title {
-    font-size: 21px;
-    line-height: 35px;
-    margin: 0 0 0 0;
-  }
-  .tagline .tagline__body {
-    font-size: 16px;
-    line-height: 24px;
-    margin: 0 0 10px 0;
-  }
-}
-@media (max-width: 767px) {
-  .tagline {
-    position: static;
-    -ms-flex-direction: column;
-    flex-direction: column;
-    left: 0;
-    top: 0;
-    margin: 180px 0 0px 0;
-    padding: 0 20px;
-    width: auto;
-  }
-  .tagline .tagline__body {
-    margin: 0 0 10px 0;
-  }
-  .tagline__footer {
-    display: block;
-    margin-top: 24px;
-  }
-}
-.footer {
-  position: fixed;
-  width: 100%;
-  bottom: 0;
-  left: 0;
-  z-index: -1;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-pack: center;
-  justify-content: center;
-  background-color: #353535;
-}
-.footer.footer--page {
-  position: static;
-  margin: -96px 0 0 0;
-  border-top: 56px solid #4A5C69;
-}
-.footer-inner {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-pack: justify;
-  justify-content: space-between;
-  width: 1080px;
-}
-.footer--copyright {
-  color: white;
-  opacity: .5;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-pack: justify;
-  justify-content: space-between;
-  padding: 65px 0 75px 0;
-}
-.footer-logo-wrap {
-  width: 280px;
-  display: -ms-flexbox;
-  display: flex;
-}
-.footer-logo-wrap__inner {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-pack: justify;
-  justify-content: space-between;
-  padding: 65px 0 75px 0;
-}
-.footer-logo {
-  width: 52px;
-  height: 52px;
-  background-size: 52px;
-  background-image: url(../img/wepylogo.png);
-}
-.footer-header {
-  color: white;
-  opacity: .5;
-  font-size: 18px;
-  margin: 0 0 40px 0;
-}
-.footer-link {
-  height: 32px;
-  line-height: 32px;
-  font-size: 16px;
-  margin: 0 0 15px 0;
-}
-.footer-link a {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-align: center;
-  align-items: center;
-  color: white;
-}
-.footer-link a:hover {
-  opacity: .8;
-}
-.footer-icon {
-  display: inline-block;
-  width: 32px;
-  height: 32px;
-  background-color: rgba(255, 255, 255, 0.1);
-  border-radius: 50%;
-  margin: 0 15px 0 0;
-  background-repeat: no-repeat;
-  background-size: 24px;
-  background-position: center;
-}
-@media (max-width: 1140px) {
-  .footer-inner {
-    width: 820px;
-    -ms-flex-pack: distribute;
-    justify-content: space-around;
-  }
-  .footer-logo-wrap {
-    width: 200px;
-  }
-}
-@media (max-width: 767px) {
-  .footer {
-    position: static;
-    border-top: 0px;
-  }
-  .footer.footer--page {
-    border-top: 100px solid #4A5C69;
-  }
-  .footer-inner {
-    padding: 30px 0 0 0;
-    -ms-flex-direction: column;
-    flex-direction: column;
-  }
-  .footer--copyright {
-    padding: 20px 30px;
-  }
-  .footer-logo-wrap {
-    width: auto;
-    -ms-flex-order: 2;
-    order: 2;
-  }
-  .footer-header {
-    margin: 0 0 10px 0;
-  }
-  .footer-logo-wrap__inner {
-    width: 100%;
-    padding: 0 0 40px 0;
-    -ms-flex-align: center;
-    align-items: center;
-    text-align: center;
-  }
-  .footer-link {
-    text-align: center;
-    height: 24px;
-    line-height: 24px;
-    margin: 0 0 10px 0;
-  }
-  .footer-link a {
-    -ms-flex-pack: center;
-    justify-content: center;
-    text-align: center;
-  }
-  .footer-icon {
-    display: none;
-  }
-  .footer-logo {
-    display: none;
-  }
-}
-.examples {
-  margin: 50px auto 30px;
-}
-.example {
-  display: block;
-  text-decoration: none;
-  width: 19%;
-  opacity: 0;
-  transition: transform .6s ease, opacity .4s ease;
-  transition-delay: .1s;
-}
-.example:hover .example__inner {
-  transform: translate3d(0, -2px, 0);
-  box-shadow: 0px 4px 20px 0px rgba(0, 0, 0, 0.1);
-}
-.slide--shown {
-  -ms-transform: scale(1);
-  transform: scale(1);
-  opacity: 1;
-}
-.slide--shown .example {
-  opacity: 1;
-  transform: translate3d(0, 0, 0);
-}
-.slide--shown .example__icon-inner {
-  -ms-transform: scale(1);
-  transform: scale(1);
-  opacity: 1;
-}
-.example.example--plus {
-  display: -ms-flexbox;
-  display: flex;
-}
-.example.example--plus a.example--plus__link {
-  text-align: center;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-align: center;
-  align-items: center;
-  -ms-flex-pack: center;
-  justify-content: center;
-}
-.example__inner {
-  background-color: white;
-  height: 200px;
-  margin: 10px;
-  box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.1);
-  border-radius: 8px;
-  padding: 20px;
-  position: relative;
-  transition: box-shadow 0.3s ease, transform 0.3s ease;
-}
-.example__title {
-  font-size: 15px;
-  line-height: 15px;
-  font-family: font_family;
-  margin: 0 0 10px 0;
-}
-.example__description {
-  font-size: 14px;
-  line-height: 20px;
-  color: #353535;
-  opacity: .8;
-}
-.example__wximage {
-  display: block;
-  width: 160px;
-  height: 160px;
-  -ms-transform: scale(1);
-  transform: scale(1);
-  transition: transform 0.4s cubic-bezier(0.175, 0.885, 0.135, 1.425);
-}
-.example__icon {
-  display: block;
-  width: 72px;
-  height: 72px;
-  margin: 0 0 10px 0;
-  -ms-transform: scale(1);
-  transform: scale(1);
-  transition: transform 0.4s cubic-bezier(0.175, 0.885, 0.135, 1.425);
-}
-.example--plus:hover .example__icon {
-  -ms-transform: scale(1.12);
-  transform: scale(1.12);
-}
-.example--plus .example__description {
-  text-align: center;
-  display: inline-block;
-  width: 80%;
-}
-.example__icon-inner {
-  width: 72px;
-  height: 72px;
-  background-image: url(../img/plus.svg);
-  background-repeat: no-repeat;
-  background-size: cover;
-  opacity: 0;
-  -ms-transform: scale(0.6);
-  transform: scale(0.6);
-  transition: transform 0.4s cubic-bezier(0.175, 0.885, 0.135, 1.425), opacity 0.2s ease;
-  transition-delay: 1.2s;
-}
-.example__image {
-  width: 160px;
-  height: 160px;
-  border-radius: 50%;
-  display: block;
-  text-align: center;
-  bottom: 20px;
-  background-color: white;
-  background-size: cover;
-}
-.modal-container {
-  position: fixed;
-  width: 100%;
-  height: 100%;
-  top: 0;
-  left: 0;
-  opacity: 0;
-  visibility: hidden;
-  cursor: pointer;
-  overflow-y: auto;
-  z-index: 3;
-  font-family: 'Lato', 'Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif';
-  font-size: 14px;
-  -webkit-transition: all 0.25s linear;
-  -moz-transition: all 0.25s linear;
-  -o-transition: all 0.25s linear;
-  -ms-transition: all 0.25s linear;
-  transition: all 0.25s linear;
-}
-.modal-container.active {
-  opacity: 1;
-  visibility: visible;
-}
-.modal-container .qr-modal {
-  border-radius: 8px;
-  box-shadow: 0 24px 80px -2px #067a1f !important;
-  transition: box-shadow 1s;
-  position: relative;
-  margin: 50px auto;
-  width: 90%;
-  padding: 20px;
-  max-width: 380px;
-  text-align: center;
-  font-weight: bold;
-  background-color: #f6f6f6;
-  cursor: initial;
-}
-.slides {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-}
-.slide {
-  position: relative;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-align: center;
-  align-items: center;
-}
-.slide__inner {
-  width: 1180px;
-  position: relative;
-}
-.slide__header {
-  margin: 0 auto;
-  width: 600px;
-  text-align: center;
-}
-.slide__title {
-  color: #1F9948;
-  font-size: 24px;
-  line-height: 30px;
-  margin: 0 0 15px 0;
-  font-weight: bold;
-}
-.slide__description {
-  color: #353535;
-  font-size: 14px;
-  line-height: 25px;
-}
-.slide__footer {
-  text-align: center;
-  width: 250px;
-  margin: 0 auto;
-  color: #70808D;
-  opacity: .6;
-  font-size: 15px;
-  line-height: 25px;
-}
-.slide__header--inversed .slide__title {
-  color: white;
-}
-.slide__header--inversed .slide__description {
-  color: white;
-  opacity: .6;
-}
-.slide--shown {
-  -ms-transform: scale(1);
-  transform: scale(1);
-  opacity: 1;
-}
-.slide--shown .example {
-  opacity: 1;
-  transform: translate3d(0, 0, 0);
-}
-.slide--shown .example__icon-inner {
-  -ms-transform: scale(1);
-  transform: scale(1);
-  opacity: 1;
-}
-@media (max-width: 1140px) {
-  .slide__inner {
-    width: 100%;
-    margin: 0;
-  }
-}
-@media (max-width: 767px) {
-  .slide__header {
-    padding: 0 20px;
-    margin: 0 auto;
-    width: auto;
-    max-width: 300px;
-  }
-  .slide__title {
-    font-size: 19px;
-    line-height: 26px;
-    margin: 0 0 6px 0;
-  }
-  .slide__description {
-    font-size: 15px;
-    line-height: 21px;
-  }
-  .slide__footer {
-    font-size: 14px;
-    line-height: 20px;
-  }
-  .slide.slide--one {
-    margin: 0;
-  }
-  .slide.slide--one .slide__inner {
-    height: auto;
-    border-radius: 0;
-  }
-}
-.slide.slide--one .slide__inner {
-  position: relative;
-  margin: 40px 0 0 0;
-  height: 720px;
-  background-color: #1F9948;
-  border-radius: 10px;
-  transform: translate3d(0, 0, 0);
-  transition: transform .6s ease, opacity .3s ease;
-  background: #1F9948;
-  background: linear-gradient(180deg, #1F9948, #2CDA9C);
-  box-shadow: 0 10px 18px 0 rgba(122, 135, 142, 0.33);
-}
-.slide.slide--one .slide__bg-image {
-  width: 814px;
-  height: 519px;
-  background-image: url(../img/lines@2x.png);
-  background-size: 814px;
-  position: absolute;
-  left: 12.5%;
-  top: 0;
-  margin: 0 0 0 -408px;
-}
-.slide__bg-area {
-  position: absolute;
-  background-color: white;
-  opacity: 0;
-  left: 50%;
-  top: -88px;
-  margin: 0 0 0 -200px;
-  width: 400px;
-  height: 400px;
-  border-radius: 50%;
-  -ms-transform: scale(0.1);
-  transform: scale(0.1);
-  animation-timing-function: ease;
-  animation-name: pulsateArea;
-  animation-duration: 3.4s;
-  animation-delay: 2.3s;
-  animation-iteration-count: infinite;
-}
-@media (max-width: 1140px) {
-  .slide__inner {
-    width: 100%;
-    margin: 0;
-  }
-  .slide.slide--one {
-    margin: 20px 20px 0 20px;
-  }
-  .slide.slide--one .slide__inner {
-    margin: 0 0 0 0;
-    width: 100%;
-  }
-}
-@media (max-width: 922px) {
-  .slide.slide--one .slide__inner {
-    height: 693px;
-  }
-}
-@media (max-width: 767px) {
-  .slide.slide--one .slide__bg-image {
-    background-image: none;
-  }
-  .slide__bg-area {
-    display: none;
-  }
-}
-.slide.slide--features {
-  position: relative;
-  top: -220px;
-  padding: 0 0 100px 0;
-}
-.slide.slide--features .slide__inner {
-  width: 1080px;
-  margin: 0 auto;
-  background: #fff;
-  box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.1);
-  border-radius: 10px;
-}
-.section {
-  padding: 80px 100px;
-}
-.section:first-child {
-  padding-top: 100px;
-}
-.section h2 {
-  display: block;
-  font-size: 1.2em;
-  -webkit-margin-before: 0.5em;
-  -webkit-margin-after: 0.5em;
-  -webkit-margin-start: 0px;
-  -webkit-margin-end: 0px;
-  font-weight: bold;
-}
-.section .title {
-  font-size: 24px;
-  padding: 16px 0 24px 0;
-  position: relative;
-  color: #1F9948;
-}
-.section .title::before {
-  content: "";
-  position: absolute;
-  width: 32px;
-  height: 4px;
-  background-color: #1F9948;
-  top: -4px;
-  left: 0;
-}
-.section .text {
-  font-size: 18px;
-  line-height: 26px;
-  color: #353535;
-}
-.section .text p {
-  padding: 0;
-}
-.features {
-  margin: 50px auto 30px;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-line-pack: start;
-  align-content: flex-start;
-  -ms-flex-pack: justify;
-  justify-content: space-between;
-}
-.features__icon {
-  display: inline-block;
-  width: 40px;
-  height: 40px;
-  background-size: 40px;
-  background-repeat: no-repeat;
-}
-.feature-item {
-  display: block;
-  text-decoration: none;
-  width: 33.3%;
-  background-color: white;
-  border-radius: 8px;
-  position: relative;
-  transition: box-shadow 0.3s ease, transform 0.3s ease;
-  margin-bottom: 20px;
-}
-.feature-title {
-  font-size: 16px;
-  font-weight: 500;
-  color: #000;
-}
-.feature-text {
-  font-size: 14px;
-  line-height: 26px;
-  color: #353535;
-  padding: 0 32px 0 0;
-  min-height: 78px;
-}
-.button.feature-button {
-  width: 160px;
-  line-height: 44px;
-  box-shadow: none;
-  background-color: #1F9948;
-  color: white;
-  margin: 24px 0 0 0;
-}
-.button.feature-button:hover {
-  background-color: #3F4A97;
-}
-.feature-icon-wrap {
-  height: 46px;
-}
-.feature-icon {
-  background-repeat: no-repeat;
-}
-.features-icon--style {
-  background-image: url(../img/fatures/icon_feature_style.svg);
-}
-.features-icon--component {
-  background-image: url(../img/fatures/icon_feature_component.svg);
-}
-.features-icon--npm {
-  background-size: 40px 40px;
-  background-image: url(../img/fatures/icon_feature_npm.svg);
-}
-.features-icon--es {
-  background-image: url(../img/fatures/icon_feature_es.svg);
-}
-.features-icon--promise {
-  background-size: 40px 40px;
-  background-image: url(../img/fatures/icon_feature_promise.svg);
-}
-.features-icon--optimize {
-  background-image: url(../img/fatures/icon_feature_optimize.svg);
-}
-.features-icon--compile {
-  background-size: 40px 40px;
-  background-image: url(../img/fatures/icon_feature_compile.svg);
-}
-.features-icon--plugin {
-  background-size: 40px 40px;
-  background-image: url(../img/fatures/icon_feature_plugin.svg);
-}
-.features-icon--size {
-  background-image: url(../img/fatures/icon_feature_size.svg);
-}
-@media (max-width: 1220px) {
-  .slide.slide--features .slide__inner {
-    width: 1100px;
-  }
-}
-@media (max-width: 1140px) {
-  .slide.slide--features {
-    width: 100%;
-  }
-  .slide.slide--features .slide__inner {
-    width: auto;
-    margin: 0 20px;
-  }
-}
-@media (max-width: 922px) {
-  .section:first-child {
-    padding-top: 60px;
-  }
-  .slide.slide--features {
-    width: 100%;
-  }
-  .slide.slide--features .slide__inner {
-    width: auto;
-    margin: 0 20px;
-  }
-}
-@media (max-width: 767px) {
-  .features-wrap {
-    margin: 0;
-    top: 0;
-    height: auto;
-  }
-  .features {
-    margin: 0;
-    border-radius: 0;
-    height: auto;
-    -ms-flex-direction: column;
-    flex-direction: column;
-  }
-  .features-text {
-    margin: 0 0 0 10px;
-    padding: 25px 0;
-    border-bottom: 1px solid #EEF2F5;
-  }
-  .features-text h2 {
-    display: block;
-    font-size: 1.2em;
-    -webkit-margin-before: 0.5em;
-    -webkit-margin-after: 0.5em;
-    -webkit-margin-start: 0px;
-    -webkit-margin-end: 0px;
-    font-weight: bold;
-  }
-  .feature-title {
-    font-size: 16px;
-    line-height: 20px;
-  }
-  .feature-text {
-    min-height: auto;
-  }
-  .feature-item {
-    width: auto;
-    text-align: left;
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-align: center;
-    align-items: center;
-    margin: 0;
-  }
-  .section--enter {
-    padding: 60px 40px 12px 40px;
-  }
-  .slide.slide--features {
-    width: 100%;
-    position: relative;
-    margin: 0;
-    padding: 0;
-    top: -240px;
-  }
-  .slide.slide--features .slide__inner {
-    margin: 0;
-    display: -ms-flexbox;
-    display: flex;
-    width: 100%;
-    height: 100%;
-    -ms-flex-align: start;
-    align-items: flex-start;
-    -ms-flex-pack: justify;
-    justify-content: space-between;
-    background: white;
-    box-shadow: 0px -2px 18px 0px rgba(0, 0, 0, 0.1);
-  }
-  .features__icon {
-    width: 40px;
-    margin-right: 20px;
-    -ms-flex-negative: 0;
-    flex-shrink: 0;
-    -ms-flex-positive: 0;
-    flex-grow: 0;
-  }
-  .features__icon .features-icon--npm {
-    background-size: 40px 40px;
-    width: 40px;
-    height: 40px;
-    background-image: url(../img/fatures/icon_feature_npm.svg);
-  }
-  .features-text {
-    margin: 0 0 0 10px;
-    padding: 25px 0;
-    border-bottom: 1px solid #EEF2F5;
-  }
-}
-.slide.slide--gist {
-  padding: 40px 0 40px 0;
-  margin: -280px 0 0 0;
-  z-index: 1;
-}
-.slide.slide--gist .slide__inner {
-  display: flex;
-  flex-direction: column;
-  z-index: -2;
-}
-.slide.slide--gist .slide__inner .slide__body {
-  position: relative;
-  margin: 0 auto;
-}
-@media (max-width: 767px) {
-  .slide.slide--gist {
-    padding: 40px 0 40px;
-  }
-  .slide.slide--gist .slide__inner {
-    padding: 30px 0;
-    width: 100%;
-    border-radius: 0;
-  }
-  article.gallery {
-    width: 350px;
-  }
-}
-.slide.slide--examples {
-  padding: 40px 0 40px 0;
-  margin-bottom: 80px;
-}
-.slide.slide--examples h2 {
-  display: block;
-  font-size: 1.5em;
-  -webkit-margin-before: 0.5em;
-  -webkit-margin-after: 0.5em;
-  -webkit-margin-start: 0px;
-  -webkit-margin-end: 0px;
-  font-weight: bold;
-}
-.examples__pr {
-  margin-top: 30px;
-  display: -ms-flexbox;
-  display: flex;
-  flex-direction: column;
-  -ms-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-pack: center;
-  align-self: center;
-  align-items: center;
-  position: relative;
-  text-align: center;
-  width: 100%;
-}
-.examples__pr .button.button--pr {
-  background: #1F9948;
-  box-shadow: none;
-  width: 80px;
-  transition: box-shadow 0.3s ease, transform 0.3s ease;
-}
-.examples__pr .button.button--pr:hover {
-  box-shadow: 0 8px 30px 2px rgba(28, 216, 87, 0.5);
-}
-@media (max-width: 767px) {
-  .carousel-cell {
-    width: 66%;
-    height: 210px;
-    margin-right: 10px;
-    margin-bottom: 10px;
-  }
-  .slide.slide--examples {
-    padding: 0;
-  }
-  .examples {
-    margin: 20px auto 10px;
-    width: auto;
-    padding: 0 10px;
-  }
-  .example__inner {
-    margin: 5px;
-    height: 180px;
-    padding: 15px;
-  }
-  .example {
-    width: auto;
-    opacity: 1;
-    transform: translate3d(0, 0, 0);
-  }
-  .example__image {
-    width: 160px;
-    height: 160px;
-  }
-}
-@media (max-width: 1140px) {
-  .slide.slide--three .slide__inner {
-    width: 860px;
-  }
-}
-@media (max-width: 922px) {
-  .slide.slide--three .slide__inner {
-    width: 728px;
-  }
-}
-@media (max-width: 767px) {
-  .slide.slide--three {
-    padding: 40px 0 40px;
-  }
-  .slide.slide--three .slide__inner {
-    padding: 30px 0;
-    width: 100%;
-    border-radius: 0;
-    height: 570px;
-  }
-}
-.slide.slide--three {
-  display: -ms-flexbox;
-  display: flex;
-  padding: 40px 0 60px;
-}
-.slide.slide--three .slide__inner {
-  background-image: linear-gradient(-180deg, #5A6F7E 0%, #445561 100%);
-  box-shadow: 0px 12px 23px 0px rgba(74, 92, 105, 0.33);
-  border-radius: 8px;
-  padding: 50px 0;
-  height: 740px;
-  width: 1080px;
-}
-@media (max-width: 767px) {
-  .slide.slide--four {
-    padding: 0px 0px 60px 0px;
-  }
-}
-.slide.slide--four {
-  display: -ms-flexbox;
-  display: flex;
-  padding: 40px 0 100px;
-}
-.slide.slide--four .slide__inner {
-  border-radius: 8px;
-  padding: 20px 0 0 0;
-  height: auto;
-  width: auto;
-}
-.slide.slide--four .button {
-  margin: 20px auto 0;
-  width: 170px;
-}
-@media (max-width: 767px) {
-  .slide.slide--five {
-    padding: 40px 0 40px;
-  }
-  .slide.slide--five .slide__inner {
-    padding: 30px 0;
-    width: 100%;
-    border-radius: 0;
-  }
-}
-.slide.slide--five {
-  display: -ms-flexbox;
-  display: flex;
-  padding: 40px 0 60px;
-}
-.slide.slide--five .slide__inner {
-  background-image: linear-gradient(-138deg, #5070D5 14%, #4957B8 100%);
-  box-shadow: 0px 12px 23px 0px rgba(74, 92, 105, 0.33);
-  border-radius: 8px;
-  padding: 50px 0;
-  height: 600px;
-  width: 1080px;
-}
-.slide.slide--five .slide__header {
-  padding: 150px 0 0 0;
-}
-.slide.slide--five .slide__bg-image {
-  width: 814px;
-  height: 519px;
-  background-image: url(../img/lines@2x.png);
-  background-size: 814px;
-  position: absolute;
-  left: 50%;
-  top: 0;
-  margin: 0 0 0 -407px;
-}
-.slide.slide--five .slide__bg-icon {
-  position: absolute;
-  top: 35px;
-  left: 50%;
-  margin: 0 0 0 -75px;
-  height: 150px;
-  width: 150px;
-}
-.slide.slide--six {
-  padding: 40px 0 40px 0;
-  margin: 0 0 0 0;
-}
-.slide.slide--six .slide__footer {
-  width: 450px;
-}
-/*! Flickity v2.0.10
-http://flickity.metafizzy.co
----------------------------------------------- */
-.flickity-enabled {
-  position: relative;
-}
-.flickity-enabled:focus {
-  outline: none;
-}
-.flickity-viewport {
-  overflow: hidden;
-  position: relative;
-  height: 100%;
-}
-.flickity-slider {
-  position: absolute;
-  width: 100%;
-  height: 100%;
-}
-/* draggable */
-.flickity-enabled.is-draggable {
-  -webkit-tap-highlight-color: transparent;
-  tap-highlight-color: transparent;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.flickity-enabled.is-draggable .flickity-viewport {
-  cursor: move;
-  cursor: -webkit-grab;
-  cursor: grab;
-}
-.flickity-enabled.is-draggable .flickity-viewport.is-pointer-down {
-  cursor: -webkit-grabbing;
-  cursor: grabbing;
-}
-/* ---- previous/next buttons ---- */
-.flickity-prev-next-button {
-  position: absolute;
-  top: 50%;
-  width: 44px;
-  height: 44px;
-  border: none;
-  border-radius: 50%;
-  background: white;
-  background: rgba(255, 255, 255, 0.75);
-  cursor: pointer;
-  /* vertically center */
-  -webkit-transform: translateY(-50%);
-  transform: translateY(-50%);
-}
-.flickity-prev-next-button:hover {
-  background: white;
-}
-.flickity-prev-next-button:focus {
-  outline: none;
-  box-shadow: 0 0 0 5px #09F;
-}
-.flickity-prev-next-button:active {
-  opacity: 0.6;
-}
-.flickity-prev-next-button.previous {
-  left: 10px;
-}
-.flickity-prev-next-button.next {
-  right: 10px;
-}
-/* right to left */
-.flickity-rtl .flickity-prev-next-button.previous {
-  left: auto;
-  right: 10px;
-}
-.flickity-rtl .flickity-prev-next-button.next {
-  right: auto;
-  left: 10px;
-}
-.flickity-prev-next-button:disabled {
-  opacity: 0.3;
-  cursor: auto;
-}
-.flickity-prev-next-button svg {
-  position: absolute;
-  left: 20%;
-  top: 20%;
-  width: 60%;
-  height: 60%;
-}
-.flickity-prev-next-button .arrow {
-  fill: #333;
-}
-/* ---- page dots ---- */
-.flickity-page-dots {
-  position: absolute;
-  width: 100%;
-  bottom: -25px;
-  padding: 0;
-  margin: 0;
-  list-style: none;
-  text-align: center;
-  line-height: 1;
-}
-.flickity-rtl .flickity-page-dots {
-  direction: rtl;
-}
-.flickity-page-dots .dot {
-  display: inline-block;
-  width: 10px;
-  height: 10px;
-  margin: 0 8px;
-  background: #333;
-  border-radius: 50%;
-  opacity: 0.25;
-  cursor: pointer;
-}
-.flickity-page-dots .dot.is-selected {
-  opacity: 1;
-}
-/* ------------------------------------------------------------------------------
- *
- *  # Prism
- *
- *  Lightweight, extensible syntax highlighter
- *
- *  Version: 1.0
- *  Latest update: May 10, 2015
- *
- * ---------------------------------------------------------------------------- */
-code[class*="language-"],
-pre[class*="language-"] {
-  text-shadow: 0 1px #fff;
-  word-break: normal;
-  line-height: 1.5;
-  direction: ltr;
-}
-@media print {
-  code[class*="language-"],
-  pre[class*="language-"] {
-    text-shadow: none;
-  }
-}
-.token.comment,
-.token.prolog,
-.token.doctype,
-.token.cdata,
-.token.punctuation {
-  color: #999;
-}
-.token.property,
-.token.tag,
-.token.boolean,
-.token.number,
-.token.constant,
-.token.symbol {
-  color: #905;
-}
-.token.selector,
-.token.attr-name,
-.token.string,
-.token.builtin {
-  color: #690;
-}
-.token.operator,
-.token.entity,
-.token.url,
-.language-css .token.string,
-.style .token.string,
-.token.variable {
-  color: #a67f59;
-  background: rgba(255, 255, 255, 0.5);
-}
-.token.atrule,
-.token.attr-value,
-.token.keyword {
-  color: #07a;
-}
-.token.function {
-  color: #DD4A68;
-}
-.token.regex,
-.token.important {
-  color: #e90;
-}
-.token.important {
-  font-weight: bold;
-}
-.token.entity {
-  cursor: help;
-}
-.namespace {
-  opacity: 0.7;
-  filter: alpha(opacity=70);
-}
-.line-highlight {
-  position: absolute;
-  left: 0;
-  right: 0;
-  margin-top: 20px;
-  background: rgba(133, 238, 149, 0.12);
-  pointer-events: none;
-  white-space: pre;
-  line-height: inherit;
-}
-.line-highlight:before,
-.line-highlight:after {
-  content: attr(data-start);
-  position: absolute;
-  top: 0px;
-  left: 10px;
-  padding: 2px;
-  text-align: center;
-  font-size: 10px;
-  color: #777777;
-}
-.line-highlight[data-end]:after {
-  content: attr(data-end);
-  top: auto;
-  bottom: 0;
-}
-pre.line-numbers {
-  position: relative;
-  padding-left: 50px;
-  counter-reset: linenumber;
-}
-pre.line-numbers > code {
-  position: relative;
-}
-.line-numbers .line-numbers-rows {
-  position: absolute;
-  pointer-events: none;
-  top: 0;
-  font-size: 100%;
-  left: 0px;
-  width: 36px;
-  letter-spacing: -1px;
-  border-right: 1px solid #999;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  -o-user-select: none;
-  user-select: none;
-}
-.line-numbers .line-numbers-rows > span {
-  pointer-events: none;
-  display: block;
-  counter-increment: linenumber;
-}
-.line-numbers .line-numbers-rows > span:before {
-  content: counter(linenumber);
-  color: #777777;
-  display: block;
-  padding-right: 10px;
-  text-align: right;
-}
-pre[class*="language-"] {
-  overflow: auto;
-  position: relative;
-  border-left-width: 3px;
-  border-left-color: #31639C;
-  background-color: #fdfdfd;
-  background-image: -webkit-linear-gradient(transparent 50%, rgba(25, 118, 210, 0.025) 50%);
-  background-image: -moz-linear-gradient(transparent 50%, rgba(25, 118, 210, 0.025) 50%);
-  background-image: -ms-linear-gradient(transparent 50%, rgba(25, 118, 210, 0.025) 50%);
-  background-image: -o-linear-gradient(transparent 50%, rgba(25, 118, 210, 0.025) 50%);
-  background-image: linear-gradient(transparent 50%, rgba(25, 118, 210, 0.025) 50%);
-  background-size: 3em 3em;
-  background-origin: content-box;
-  border-bottom-left-radius: 0;
-  border-top-left-radius: 0;
-}
-pre[class*="language-"] > code[data-language] {
-  display: block;
-}
-pre[class*="language-"] > code[data-language]:before {
-  content: attr(data-language);
-  background-color: #f8f8f8;
-  display: inline-block;
-  position: absolute;
-  top: 0px;
-  right: 0px;
-  font-size: 11px;
-  border-radius: 0 0 0 2px;
-  padding: 4px 8px;
-  text-shadow: none;
-  color: #333333;
-  border-left: 1px solid #ddd;
-  border-bottom: 1px solid #ddd;
-}
-pre[class*="language-"].line-numbers > code[data-language]:before {
-  top: -15px;
-  right: -15px;
-}
-pre[data-line] {
-  position: relative;
-  padding-left: 36px;
-}
-.enter {
-  animation: move 1s;
-}
-@keyframes move {
-  0% {
-    opacity: 0;
-    transform: translate(0, 50px);
-  }
-  100% {
-    opacity: 1;
-    transform: translate(0, 0);
-  }
-}
-strong {
-  font-weight: bolder;
-}
-pre,
-code {
-  font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
-  font-size: small;
-}
-.window {
-  margin: 2em auto;
-  border: 1px solid;
-  border-radius: 4px;
-  font-size: 14px;
-  box-shadow: 0 2px 4px 0px rgba(0, 0, 0, 0.1);
-  transition: box-shadow 0.3s ease, transform 0.3s ease;
-}
-.window figcaption {
-  display: -webkit-flex;
-  display: flex;
-  letter-spacing: 1px;
-  border-bottom: 1px solid;
-  padding-right: 66px;
-  padding-left: 12px;
-}
-.window pre {
-  padding: 7px 12px;
-  margin: 0;
-  line-height: 1.6;
-  overflow: scroll;
-}
-.chrome.btn {
-  display: inline-block;
-  border-radius: 50%;
-  min-width: 12px;
-  height: 12px;
-  margin: 12px 6px;
-  margin-left: 0;
-}
-.chrome.close {
-  background-color: #ff5f56;
-  cursor: pointer;
-}
-.chrome.minimize {
-  background-color: #ffbd2e;
-}
-.chrome.fullscreen {
-  background-color: #27c93f;
-}
-.chrome.title {
-  -webkit-flex: 1;
-  flex: 1;
-  text-align: center;
-  line-height: 36px;
-  white-space: nowrap;
-  overflow: hidden;
-}
-.gist,
-.browser {
-  text-align: left;
-  border-color: #ddd;
-  color: #777;
-  background-color: #fdfdfc;
-}
-.gist figcaption,
-.browser figcaption {
-  background: #fafafa;
-  border-bottom-color: inherit;
-  border-top-left-radius: inherit;
-  border-top-right-radius: inherit;
-}
-.gist pre {
-  color: #777;
-}
-.gist .chrome.btn {
-  background-color: #ccc;
-}
-.browser div {
-  color: initial;
-  padding: 6px;
-  font-size: 14px;
-  line-height: 1.5;
-}
-.browser .chrome.btn {
-  opacity: 0.5;
-}
-.browser .chrome.title {
-  font-size: 12px;
-}
-.browser .chrome.title a,
-.browser .chrome.title .link {
-  background-color: rgba(0, 0, 0, 0.05);
-  color: #777;
-  border-radius: 4px;
-  padding: 0.25em 2em;
-  margin: 0.5em auto;
-  display: block;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  position: relative;
-  max-width: 20em;
-}
-.browser .chrome.title a::before {
-  content: '+';
-  position: absolute;
-  left: 0.5em;
-  top: 0.35em;
-  display: block;
-  border-radius: 100%;
-  border: 1px solid currentcolor;
-  width: 1em;
-  height: 1em;
-  line-height: 1;
-  padding-left: 0.05em;
-  padding-bottom: 0.05em;
-  opacity: 0;
-  transition: opacity 200ms;
-}
-.browser .chrome.title a:hover::before,
-.browser .chrome.title a:focus::before {
-  opacity: 1;
-}
-.terminal {
-  color: #93a1a1;
-  background-color: #002b36;
-  border-width: 0;
-}
-.terminal figcaption {
-  border-bottom-color: #073642;
-  color: #657b83;
-}
-.terminal .command::before,
-.terminal .input::before {
-  content: '$ ';
-  font-weight: bold;
-}
-.terminal .input {
-  font-weight: bold;
-}
-.terminal .hl {
-  color: #b58900;
-}
-.terminal .nok {
-  color: #dc322f;
-}
-.terminal .ll {
-  color: #586e75;
-}
-.terminal .chrome.close {
-  background-color: #dc322f;
-}
-.terminal .chrome.minimize {
-  background-color: #b58900;
-}
-.terminal .chrome.fullscreen {
-  background-color: #859900;
-}
-.caret {
-  font-weight: bold;
-}
-.caret.blink {
-  animation: blink 1s linear infinite;
-  opacity: 1;
-}
-@keyframes blink {
-  0%,
-  49% {
-    opacity: 0;
-  }
-  50%,
-  100% {
-    opacity: 1;
-  }
-}
-.gallery {
-  width: 450px;
-  position: relative;
-}
-.gallery .window pre {
-  min-height: 400px;
-}
-.gallery .window:first-child {
-  transform: scale(0.7) translate(-98%, 5%);
-  transform-origin: 0 0;
-}
-.gallery .window:first-child,
-.gallery .window:last-child {
-  z-index: -1;
-  position: absolute;
-  top: 0;
-  width: 80%;
-}
-@media (max-width: 78em) {
-  .gallery .window:first-child,
-  .gallery .window:last-child {
-    display: none;
-  }
-}
-.gallery .window:first-child pre,
-.gallery .window:last-child pre {
-  height: 420px;
-  opacity: 0.8;
-  overflow: hidden;
-}
-.gallery .window:first-child {
-  transform: scale(0.7) translate(-98%, 5%);
-  transform-origin: 0% 0%;
-}
-.gallery .window:last-child {
-  transform: scale(0.7) translate(130%, 5%);
-  transform-origin: 100% 0%;
-}
diff --git a/docs/data/cases.json b/docs/data/cases.json
deleted file mode 100644
index 8ac7d8599..000000000
--- a/docs/data/cases.json
+++ /dev/null
@@ -1,204 +0,0 @@
-{
-    "text_cases": [{
-        "name": "手机充值+",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "手机流量充值优惠",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "手机余额查询",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "众安保险福利",
-        "email": "447587073@qq.com",
-        "link": ""
-    }, {
-        "name": "阅邻二手书",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "深大的树洞",
-        "email": "",
-        "opensource": 1,
-        "link": "https://github.com/jas0ncn/szushudong"
-    }, {
-        "name": "爱羽客羽毛球",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "小小羽球",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "七弦琴大数据",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "七弦琴小助手",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "培恩医学",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "公务员朝夕刷题",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "独角兽公司",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "逛人备忘",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "英语助手君",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "农资优选",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "花花百科",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "斑马小店",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "鲜花说小店",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "趣店招聘",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "满熊阅读",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "平行进口报价内参",
-        "email": "",
-        "link": ""
-    }, {
-        "name": "求知微阅读",
-        "email": "",
-        "opensource": 1,
-        "link": "https://github.com/KingJeason/wepy-books"
-    }, {
-        "name": "育儿柚道",
-        "email": ""
-    }, {
-        "name": "坚橙",
-        "email": "",
-        "link": "https://zhanart.com/wepy.html"
-    },{
-       "name": "天天跟我买",
-        "email": "",
-        "link": "http://www.xiaohongchun.com.cn/index" 
-    },{
-       "name": "GitHub掘金版",
-        "email": "",
-        "link": "" 
-    }, {
-       "name": "帮助圈",
-        "email": "191100479@qq.com",
-        "link": ""
-    }, {
-        "name": "友福图书馆",
-        "email": "glore@ufutx.com",
-        "opensource": 1,
-        "link": "https://github.com/glore/library"
-    }, {
-        "name": "西安找拼车",
-        "email": "chenqing_19@163.com",
-        "link": "https://github.com/chenqingspring",
-        "opensource": 1
-    }],
-    "roll_cases": [{
-        "name": "手机充值+",
-        "email": "",
-        "qr_code": "https://user-images.githubusercontent.com/2182004/33113445-5512185c-cf93-11e7-9c07-b8bc25db448f.jpg"
-    }, {
-        "name": "手机流量充值优惠",
-        "email": "",
-        "qr_code": "https://user-images.githubusercontent.com/2182004/33113446-5543e062-cf93-11e7-85d7-166c9f36e31d.jpg"
-    }, {
-        "name": "手机余额查询",
-        "email": "",
-        "qr_code": "https://user-images.githubusercontent.com/2182004/33113447-5573e460-cf93-11e7-80cf-a53583644589.jpg"
-    }, {
-        "name": "趣店招聘",
-        "email": "",
-        "qr_code": "http://7xrhcw.com1.z0.glb.clouddn.com/wechat_default_300.jpg"
-    }, {
-        "name": "满熊阅读",
-        "email": "",
-        "qr_code": "http://7xrhcw.com1.z0.glb.clouddn.com/wechat_default_344.jpg"
-    }, {
-        "name": "平行进口报价内参",
-        "email": "",
-        "qr_code": "https://miniapp.ourauto.club/qrcode.jpg"
-    }, {
-        "name": "育儿柚道",
-        "email": "",
-        "qr_code": "https://github.com/baisheng/podcast/raw/master/doc/wechat.jpg?raw=true"
-    }, {
-        "name": "坚橙",
-        "email": "",
-        "qr_code": "https://static.crandom.com/code/wepy.jpeg"
-    }, {
-        "name": "天天跟我买",
-        "email": "",
-        "qr_code": "https://wicdn.xiaohongchun.com/xhc-plat/1511402768167_THtbpaMaA3.jpeg"
-    }, {
-        "name": "众安保险福利",
-        "email": "447587073@qq.com",
-        "qr_code": "https://cdn-qcloud.zhongan.com/a00000/InsuWelfare_Prod/imgs/logo.jpg"
-    }, {
-        "name": "素洁商城",
-        "email": "490844594@qq.com",
-        "opensource": 1,
-        "link": "https://github.com/dyq086/wxYuHanStore",
-        "qr_code": "https://github.com/dyq086/wxYuHanStore/raw/master/screenshots/qr.jpg"
-    }, {
-        "name": "给你的 iPhone X 换个发型",
-        "email": "",
-        "link": "https://bangs.baran.wang/",
-        "qr_code": "https://img.bangs.baran.wang/img/qrcode_wechat_app.jpg"
-    },{
-        "name": "群脱单",
-        "email": "davylaker@163.com",
-        "qr_code": "https://raw.githubusercontent.com/davylaker/wepy-wechat-demo/697292c4767dd08e5f50ada95e295d2c37ac05c2/quntuodan.jpg"
-    },{
-        "name": "GitHub 掘金版",
-        "email": "",
-        "link": "",
-        "qr_code": "https://raw.githubusercontent.com/1003865572/static/master/public/img/gh_3687b5344359_258.jpg"
-    },{
-        "name": "米淘联盟",
-        "email": "hello_undefined@icloud.com",
-        "qr_code": "http://xiaoma.aldwx.com/public/image/code/1513146352_1.png"
-    },{
-        "name": "帮助圈",
-        "email": "191100479@qq.com",
-        "qr_code": "https://user-images.githubusercontent.com/6293249/33993933-97a39268-e113-11e7-85b9-dd762c19c0e1.jpg"
-    },{
-        "name": "友福图书馆",
-        "email": "glore@ufutx.com",
-        "qr_code": "https://library.ufutx.com/imgs/mp_library.jpg"
-    },{
-        "name": "西安找拼车",
-        "email": "chenqing_19@163.com",
-        "link": "https://github.com/chenqingspring",
-        "qr_code": "http://ac-ao4nzbtt.clouddn.com/a682ccd4e95e42049745.jpg"
-    }]
-}
diff --git a/docs/data/donate.json b/docs/data/donate.json
deleted file mode 100644
index a90895a7f..000000000
--- a/docs/data/donate.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-    "donates": [{
-        "date": "2017/12/25",
-        "name": "李乾坤",
-        "amount": "2.00",
-        "desc": "支持开源"
-    }, {
-        "date": "2017/12/11",
-        "name": "白俊遥",
-        "amount": "8.88",
-        "desc": "支持开源项目"
-    }, {
-        "date": "2017/11/30",
-        "name": "热情用户",
-        "amount": "6.66",
-        "desc": "加油"
-    }, {
-        "date": "2017/11/30",
-        "name": "热情用户",
-        "amount": "66.00",
-        "desc": "感谢大大贡献"
-    }, {
-        "date": "2017/11/29",
-        "name": "热情用户",
-        "amount": "88.00",
-        "desc": ""
-    }]
-}
diff --git a/docs/document.html b/docs/document.html
deleted file mode 100644
index 5485dc393..000000000
--- a/docs/document.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>wepyjs - 小程序组件化开发框架</title>
-    <link rel="icon" href="favicon.ico">
-    <meta name="description" content="小程序组件化开发框架">
-    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
-    <link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css">
-</head>
-<body>
-    <div style="position: absolute;z-index: 999;padding: 5px 0 0 350px;">如发现文档中的错误，请<a href="https://github.com/wepyjs/wepy/edit/master/docs/md/doc.md" target="_blank">点击这里</a>修改本文档，修改完成后请 pull request，我们会尽快合并、更新。</div>
-    <header>
-        <div class="container">
-            <nav class="a123">
-                <a href="./index.html">首页</a>
-                <a href="#api">API文档</a>
-                <!-- <a href="#/getstart">快速入门</a>
-                <a href="#/document">文档</a>
-                <a href="#/api">API</a> -->
-                <a href="#changelog">CHANGELOG</a>
-            </nav>
-        </div>
-    </header>
-    <div id="app">Please wait...</div>
-
-</body>
-<script>
-    window.$docsify = {
-      el: '#app',
-      auto2top: true,
-      basePath: '../md/',
-      homepage: 'doc.md'
-    }
-</script>
-<script src="//unpkg.com/docsify/lib/docsify.js"></script>
-<script>
-var _hmt = _hmt || [];
-(function() {
-  var hm = document.createElement("script");
-  hm.src = "https://hm.baidu.com/hm.js?14c98a4c2ac48bfa7a4c6e9bf797d125";
-  var s = document.getElementsByTagName("script")[0]; 
-  s.parentNode.insertBefore(hm, s);
-})();
-</script>
-
-</html>
diff --git a/docs/document.md b/docs/document.md
deleted file mode 100644
index 7635ba4bf..000000000
--- a/docs/document.md
+++ /dev/null
@@ -1,680 +0,0 @@
-
-## 文档
-
-### wepy.config.js 配置文件说明
-执行`wepy new demo`后，会生成类似配置文件。
-
-```javascript
-let prod = process.env.NODE_ENV === 'production';
-
-module.exports = {
-    'output': 'dist',
-    'source': 'src',
-    'wpyExt': '.wpy',
-    'compilers': {
-        less: {
-            'compress': true
-        },
-        /*sass: {
-            'outputStyle': 'compressed'
-        },*/
-        babel: {
-            'presets': [
-                'es2015',
-                'stage-1'
-            ],
-            'plugins': [
-                'transform-export-extensions',
-                'syntax-export-extensions',
-                'transform-runtime'
-            ]
-        }
-    },
-    'plugins': {
-    }
-};
-
-if (prod) {
-    // 压缩sass
-    module.exports.compilers['sass'] = {'outputStyle': 'compressed'};
-    
-    // 压缩less
-    module.exports.compilers['less'] = {'compress': true};
-
-    // 压缩js
-    module.exports.plugins = {
-        'uglifyjs': {
-            filter: /\.js$/,
-            config: {
-            }
-        },
-        'imagemin': {
-            filter: /\.(jpg|png|jpeg)$/,
-            config: {
-                'jpg': {
-                    quality: 80
-                },
-                'png': {
-                    quality: 80
-                }
-            }
-        }
-    };
-}
-```
-
-**wpyExt：**缺省值为'.wpy'，IDE默认情况下不会对此文件类型高亮，此时可以修改所有文件为`.vue`后缀(因为与vue高亮规则一样)，然后将此选项修改为`.vue`，就能解决部分IDE代码高亮问题。
-
-**compilers：** compilers为`1.3.1`版本之后的功能，如果需要使用其它语法，请先配置`compilers`，然后再安装相应的compilers。目前支持`wepy-compiler-less`，`wepy-compiler-sass`，`wepy-compiler-babel`，`wepy-compiler-pug`。持续开发...
-对应compiler请参考各自文档
->**sass：**sass编译配置，参见<a href="https://github.com/sass/node-sass" target="_blank">这里</a>。
->**less：**less编译配置，参见<a href="http://lesscss.org/#using-less-usage-in-code" target="_blank">这里</a>。
->**stylus：**stylus编译配置，参见<a href="http://www.zhangxinxu.com/jq/stylus/js.php" target="_blank">这里</a>。
->**babel：**babel编译配置，参见<a href="http://babeljs.io/docs/usage/options/" target="_blank">这里</a>。
->**typescript：**typescript编译配置，参见<a href="https://www.tslang.cn/docs/home.html" target="_blank">这里</a>。
-
-**plugins：** plugins为`1.1.6`版本之后功能，目前支持js压缩与图片压缩，`wepy-plugin-ugliyjs`，`wepy-plugin-imagemin`。持续开发...
-
-### 关于compilers和plugins
-
-1.3.1版本新功能，文档建设中...
-
-### wpy文件说明
-
-`wpy`文件的编译过程过下：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/22774706/422375b0-eee3-11e6-9046-04d9cd3aa429.png" alt="5 small">
-</p>
-
-一个`.wpy`文件分为三个部分：
-
-1. 样式`<style></style>`对应原有`wxss`。
-2. 模板`<template></template>`对应原有`wxml`。
-3. 代码`<script></script>`对应原有`js`。
-
-其中入口文件`app.wpy`不需要`template`，所以编译时会被忽略。这三个标签都支持`lang`和`src`属性，`lang`决定了其代码编译过程，`src`决定是否外联代码，存在`src`属性且有效时，忽略内联代码，示例如下：
-
-```html
-<style lang="less" src="page1.less"></style>
-<template lang="wxml" src="page1.wxml"></template>
-<script>
-    // some code
-</script>
-```
-
-标签对应 `lang` 值如下表所示：
-
-| 标签 | lang默认值 | lang支持值 |
-| ---- | ---- | ---- |
-|style|`css`|`css`，`less`，`sass`，`stylus`|
-|template|`wxml`|`wxml`，`xml`，`pug(原jade)`|
-|script|`babel`|`babel`，`TypeScript`|
-
-### script说明
-
-#### 程序入口app.wpy
-
-```html
-<style lang="less">
-/** less **/
-</style>
-<script>
-import wepy from 'wepy';
-export default class extends wepy.app {
-    config = {
-            "pages":[
-            "pages/index/index"
-        ],
-        "window":{
-            "backgroundTextStyle": "light",
-            "navigationBarBackgroundColor": "#fff",
-            "navigationBarTitleText": "WeChat",
-            "navigationBarTextStyle": "black"
-        }
-    };
-    onLaunch() {
-        console.log(this);
-    }
-}
-</script>
-```
-
-入口`app.wpy`继承自`wepy.app`，包含一个`config`属性和其全局属性、方法、事件。其中`config`属性对应原有的`app.json`，编译时会根据`config`生成`app.json`文件，如果需要修改`config`中的内容，请使用系统提供API。
-
-#### 页面index.wpy
-
-```html
-<style lang="less">
-/** less **/
-</style>
-<template lang="wxml">
-    <view>
-    </view>
-    <counter1></counter1>
-</template>
-<script>
-import wepy from 'wepy';
-import Counter from '../components/counter';
-export default class Index extends wepy.page {
-
-    config = {};
-    components = {counter1: Counter};
-
-    data = {};
-    methods = {};
-
-    events = {};
-    onLoad() {};
-    // Other properties
-}
-</script>
-```
-
-页面入口继承自`wepy.page`，主要属性说明如下：
-
-| 属性 | 说明 |
-| ---- | ---- |
-|config|页面config，相当于原来的index.json，同`app.wpy`中的config|
-|components|页面引入的组件列表|
-|data|页面需要渲染的数据|
-|methods|wmxl的事件捕捉，如`bindtap`，`bindchange`|
-|events|组件之间通过`broadcast`，`emit`传递的事件|
-|其它|如`onLoad`，`onReady`等小程序事件以及其它自定义方法与属性|
-
-#### 组件com.wpy
-
-```html
-<style lang="less">
-/** less **/
-</style>
-<template lang="wxml">
-    <view>  </view>
-</template>
-<script>
-import wepy from 'wepy';
-export default class Com extends wepy.component {
-
-    components = {};
-
-    data = {};
-    methods = {};
-
-    events = {};
-    // Other properties
-}
-</script>
-```
-
-页面入口继承自`wepy.component`，属性与页面属性一样，除了不需要`config`以及页面特有的一些小程序事件等等。
-
-### 组件
-小程序支持js<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/framework/app-service/module.html?t=20161107" target="_blank">模块化</a>，但彼此独立，业务代码与交互事件仍需在页面处理。无法实现组件化的松耦合与复用的效果。
-例如模板A中绑定一个`bindtap="myclick"`，模板B中同样绑定一样`bindtap="myclick"`，那么就会影响同一个页面事件。对于数据同样如此。因此只有通过改变变量或者事件方法，或者给其加不同前缀才能实现绑定不同事件或者不同数据。当页面复杂之后就十分不利于开发维护。
-因此wepy让小程序支持组件化开发，组件的所有业务与功能在组件本身实现，组件与组件之间彼此隔离，上述例子在wepy的组件化开发过程中，A组件只会影响到A绑定的`myclick`，B也如此。
-
-wepy编译组件的过程如下：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/22774767/8f090dd6-eee3-11e6-942b-1591a6379ad3.png">
-</p>
-
-#### 组件引用
-当页面或者组件需要引入子组件时，需要在页面或者`script`中的`components`给组件分配唯一id，并且在`template`中添加`<component>`标签，如[index.wpy](#)。
-
-需要注意的是，组件ID必须是唯一的，如果需要多次引入同一组件，那么需要声明该组件多次。如下：
-
-```html
-<template>
-    <view>
-        <child1 />
-        <child2 />
-    </view>
-</template>
-<script>
-    import wepy from 'wepy';
-    import Child from './child';
-
-    export Parent from wepy.page {
-        components = {
-            child1: Child,
-            child2: Child
-        }
-    }
-</script>
-```
-
-页面和组件都可以引入子组件，引入若干组件后，如下图：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554681/796da1ae-b198-11e6-91ab-e90f485c594d.png">
-</p>
-
-Index页面引入A，B，C三个组件，同时组件A和B又有自己的子组件D，E，F，G，H。
-
-#### computed 计算属性
-
-* **类型**: `{ [key: string]: Function }`
-
-* **详细**：
-计算属性可以直接当作绑定数据，在每次脏检查周期中。在每次脏检查流程中，只要有脏数据，那么`computed` 属性就会重新计算。
-
-* **示例**：
-
-    ```javascript
-    data = {
-        a: 1
-    };
-
-    computed = {
-        aPlus () {
-            return this.a + 1;
-        }
-    }
-    ```
-
-#### Props 传值
-
-**静态传值**
-
-使用静态传值时，子组件会接收到字符串的值。
-
-```javascript
-<child title="mytitle"></child>
-
-// child.wpy
-props = {
-    title: String
-};
-
-onLoad () {
-    console.log(this.title); // mytitle
-}
-```
-
-**动态传值**
-
-使用`:prop`（等价于`v-bind:prop`），代表动态传值，子组件会接收父组件的数据。
-
-```javascript
-// parent.wpy
-<child :title="parentTitle" :syncTitle.sync="parentTitle" :twoWayTitle="parentTitle"></child>
-
-data = {
-    parentTitle: 'p-title'
-};
-
-
-// child.wpy
-props = {
-    title: String,
-    syncTitle: {
-        type: String,
-        default: 'null'
-    },
-    twoWayTitle: {
-        type: Number,
-        default: 50,
-        twoWay: true
-    }
-};
-
-onLoad () {
-    console.log(this.title); // p-title
-    console.log(this.syncTitle); // p-title
-    console.log(this.twoWayTitle); // 50
-
-    this.title = 'c-title';
-    console.log(this.$parent.parentTitle); // p-title.
-    this.twoWayTitle = 60;
-    console.log(this.$parent.parentTitle); // 60.  --- twoWay为true时，子组件props修改会改变父组件对应的值
-    this.$parent.parentTitle = 'p-title-changed';
-    console.log(this.title); // 'p-title';
-    console.log(this.syncTitle); // 'p-title-changed' --- 有sync属性的props，当父组件改变时，会影响子组件的值。
-}
-```
-
-#### 组件通信与交互
-`wepy.component`基类提供三个方法`$broadcast`，`$emit`，`$invoke`，因此任一页面或任一组件都可以调用上述三种方法实现通信与交互，如：
-
-```javascript
-$this.$emit('some-event', 1, 2, 3, 4);
-```
-
-组件的事件监听需要写在`events`属性下，如：
-
-```javascript
-import wepy from 'wepy';
-export default class Com extends wepy.component {
-
-    components = {};
-
-    data = {};
-    methods = {};
-
-    events = {
-        'some-event': ($event, ...args) => {
-               console.log(`${this.name} receive ${$event.name} from ${$event.source.name}`);
-        }
-    };
-    // Other properties
-}
-```
-
-**$broadcast**
-
-`$broadcast`事件是由父组件发起，所有子组件都会收到此广播事件，除非事件被手动取消。事件广播的顺序为广度优先搜索顺序，如上图，如果`Page_Index`发起一个`$broadcast`事件，那么接收到事件的先后顺序为：A, B, C, D, E, F, G, H。如下图：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554688/800089e6-b198-11e6-84c5-352d2d0e2f7e.png">
-</p>
-
-**$emit**
-
-`$emit`与`$broadcast`正好相反，事件发起组件的父组件会依次接收到`$emit`事件，如上图，如果E发起一个`$emit`事件，那么接收到事件的先后顺序为：A, Page_Index。如下图：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554704/9997932c-b198-11e6-9840-3edae2194f47.png">
-</p>
-
-**$invoke**
-
-`$invoke`是一个组件对另一个组件的直接调用，通过传入的组件路径找到相应组件，然后再调用其方法。
-如果想在`Page_Index`中调用组件A的某个方法：
-
-```javascript
-this.$invoke('ComA', 'someMethod', 'someArgs');
-```
-
-如果想在组件A中调用组件G的某个方法：
-
-```javascript
-this.$invoke('./../ComB/ComG', 'someMethod', 'someArgs');
-```
-
-#### 组件内容分发slot
-
-可以使用`<slot>`元素作为组件内容插槽，在使用组件时，可以随意进行组件内容分发，参看以下示例：
-
-在`Panel`组件中有以下模板：
-
-```html
-<view class="panel">
-    <slot name="title">默认标题</slot>
-    <slot>
-        默认内容
-    </slot>
-</view>
-```
-
-在父组件使用`Pannel`组件时，可以这样使用：
-
-```html
-<panel>
-    <view>
-        <text>这是我放到的内容</text>
-    </view>
-    <view slot="title">Panel的Title</view>
-</panel>
-```
-
-### 第三方组件
-
-wepyjs 允许使用基于wepyjs开发的第三方组件，开发第三方组件规范请参考<a href="https://github.com/wepyjs/wepy-com-toast" target="_blank">wepy-com-toast</a>。
-
-
-### 混合
-
-混合可以将组之间的可复用部分抽离，从而在组件中使用混合时，可以将混合的数据，事件以及方法注入到组件之中。混合分为两种：
-
-* 默认式混合
-* 兼容式混合
-
-#### 默认式混合
-
-对于组件`data`数据，`components`组件，`events`事件以及其它自定义方法采用**默认式混合**，即如果组件未声明该数据，组件，事件，自定义方法等，那么将混合对象中的选项将注入组件这中。对于组件已声明的选项将不受影响。
-
-```javascript
-// mixins/test.js
-import wepy from 'wepy';
-
-export default class TestMixin extends wepy.mixin {
-    data = {
-        foo: 'foo defined by page',
-        bar: 'bar defined by testMix'
-    };
-    methods = {
-    tap () {
-      console.log('mix tap');
-    }
-  }
-}
-
-// pages/index.wpy
-import wepy from 'wepy';
-import TestMixin from './mixins/test';
-
-export default class Index extends wepy.page {
-    data = {
-        foo: 'foo defined by index'
-    };
-    mixins = [TestMixin];
-    onShow() {
-        console.log(this.foo); // foo defined by index.
-        console.log(this.bar); // foo defined by testMix.
-    }
-}
-```
-
-
-#### 兼容式混合
-
-对于组件`methods`响应事件，以及小程序页面事件将采用**兼容式混合**，即先响应组件本身响应事件，然后再响应混合对象中响应事件。
-
-```javascript
-// mixins/test.js
-import wepy from 'wepy';
-
-export default class TestMixin extends wepy.mixin {
-    methods = {
-        tap () {
-            console.log('mix tap');
-        }
-    };
-    onShow() {
-        console.log('mix onshow');
-    }
-}
-
-// pages/index.wpy
-import wepy from 'wepy';
-import TestMixin from './mixins/test';
-
-export default class Index extends wepy.page {
-
-    mixins = [TestMixin];
-    methods = {
-        tap () {
-            console.log('index tap');
-        }
-    };
-    onShow() {
-        console.log('index onshow');
-    }
-}
-
-
-// index onshow
-// mix onshow
-// ----- when tap
-// index tap
-// mix tap
-```
-
-### 拦截器
-
-可以使用全域拦截器配置API的config、fail、success、complete方法，参考示例：
-
-```javascript
-import wepy from 'wepy';
-
-export default class extends wepy.app {
-
-    constructor () {
-        super();
-        this.intercept('request', {
-            config (p) {
-                p.timestamp = +new Date();
-                return p;
-            },
-            success (p) {
-                console.log('request success');
-                return p;
-            },
-            fail (p) {
-                console.log('request error');
-                return p;
-            }
-        });
-    }
-}
-```
-
-
-### 数据绑定
-
-#### 小程序数据绑定方式
-小程序通过`Page`提供的`setData`方法去绑定数据，如：
-
-```javascript
-this.setData({title: 'this is title'});
-```
-
-因为小程序架构本身原因，页面渲染层和JS逻辑层分开的，setData操作实际就是JS逻辑层与页面渲染层之间的通信，那么如果在同一次运行周期内多次执行`setData`操作时，那么通信的次数是一次还是多次呢？这个取决于API本身的设计。
-
-#### wepy数据绑定方式
-wepy使用脏数据检查对setData进行封装，在函数运行周期结束时执行脏数据检查，一来可以不用关心页面多次setData是否会有性能上的问题，二来可以更加简洁去修改数据实现绑定，不用重复去写setData方法。代码如下：
-
-```javascript
-this.title = 'this is title';
-```
-
-但需注意，在函数运行周期之外的函数里去修改数据需要手动调用`$apply`方法。如：
-
-```javascript
-setTimeout(() => {
-    this.title = 'this is title';
-    this.$apply();
-}, 3000);
-```
-
-#### wepy脏数据检查流程
-在执行脏数据检查是，会通过`this.$$phase`标识当前检查状态，并且会保证在并发的流程当中，只会有一个脏数据检查流程在运行，以下是执行脏数据检查的流程图：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554709/a0d8b1e8-b198-11e6-9034-0997b33bdf95.png">
-</p>
-
-### 其它优化细节
-
-#### 1. wx.request 接收参数修改
-点这里查看<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html?t=20161122" target="_blank">官方文档</a>
-
-```javascript
-// 官方
-wx.request({
-    url: 'xxx',
-    success: function (data) {
-        console.log(data);
-    }
-});
-
-// wepy 使用方式
-wepy.request('xxxx').then((d) => console.log(d));
-```
-
-#### 2. 优化事件参数传递
-点这里查看<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/event.html?t=20161122" target="_blank">官方文档</a>
-
-```javascript
-// 官方
-<view data-id="{{index}}" data-title="wepy" data-other="otherparams" bindtap="tapName"> Click me! </view>
-Page({
-  tapName: function(event) {
-    console.log(event.currentTarget.dataset.id)// output: 1
-    console.log(event.currentTarget.dataset.title)// output: wepy
-    console.log(event.currentTarget.dataset.other)// output: otherparams
-  }
-});
-
-// wepy 建议传参方式
-<view @tap="tapName({{index}}, 'wepy', 'otherparams')"> Click me! </view>
-
-events: {
-    tapName (id, title, other, event) {
-        console.log(id, title, other)// output: 1, wepy, otherparams
-    }
-}
-```
-
-#### 3. 改变数据绑定方式
-保留setData方法，但不建议使用setData执行绑定，修复传入`undefined`的bug，并且修改入参支持：
-`this.setData(target, value)`
-`this.setData(object)`
-
-点这里查看<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/template.html?t=20161122" target="_blank">官方文档</a>
-
-```html
-// 官方
-<view> {{ message }} </view>
-
-onLoad: function () {
-    this.setData({message: 'hello world'});
-}
-
-
-// wepy
-<view> {{ message }} </view>
-
-onLoad () {
-    this.message = 'hello world';
-}
-```
-
-#### 4. 组件代替模板和模块
-
-点这里查看<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/data.html?t=20161122" target="_blank">官方文档</a>
-
-```html
-// 官方
-<!-- item.wxml -->
-<template name="item">
-  <text>{{text}}</text>
-</template>
-
-<!-- index.wxml -->
-<import src="item.wxml"/>
-<template is="item" data="{{text: 'forbar'}}"/>
-
-<!-- index.js -->
-var item = require('item.js')
-
-
-
-
-// wepy
-<!-- /components/item.wpy -->
- <text>{{text}}</text>
-
-<!-- index.wpy -->
-<template>
-    <component id="item"></component>
-</template>
-<script>
-    import wepy from 'wepy';
-    import Item from '../components/item';
-    export default class Index extends wepy.page {
-        components = { Item }
-    }
-</script>
-```
diff --git a/docs/donate.html b/docs/donate.html
deleted file mode 100644
index 9e712cc03..000000000
--- a/docs/donate.html
+++ /dev/null
@@ -1,185 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-
-    <meta http-equiv="x-ua-compatible" content="ie=edge">
-
-    <title>WePY | 小程序组件化开发框架</title>
-    <meta name=keywords content="WePY, 小程序, 组件化, ES6, ES7, Promise">
-    <meta name="description" content="小程序组件化开发框架">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-
-    <!-- favicon.ico in the root directory -->
-    <link rel="stylesheet" href="./css/donate.css">
-    <meta property="og:title" content="WePy 小程序组件化开发框架">
-</head>
-
-<body class="shown">
-    <div class="container-wrap" id="app">
-        <div class="container">
-            <div class="header">
-                <div class="header-pattern">
-                    <div class="header">
-                        <div class="header__inner">
-                            <a class="logo" href="/">
-                                <span class="logo__icon"></span>
-                                <div class="logo_text">
-                                    <span class="logo__title">WePY</span>
-                                    <span class="logo__description">
-                                        <span> </span>帮你快速开发小程序</span>
-                                </div>
-                            </a>
-
-                            <div class="nav">
-                                <a class="nav__item nav__item--home" href="./index.html">首页</a>
-                                <a class="nav__item nav__item--document" target="_blank" href="./document.html">使用手册</a>
-                                <a class="nav__item nav__item--api" target="_blank" href="./document.html#/api">API 说明</a>
-                                <a class="nav__item nav__item--logs" target="_blank" href="./document.html#/changelog">版本日志</a>
-                                <a class="nav__item nav__item--donate" href="./donate.html">Donate</a>
-                            </div>
-
-                            <div class="shares">
-                                <ul class="social-links">
-                                    <li class="social-link social-link--wx tooltip tooltip--indis">
-                                        <a href="#" @mouseenter="wxEnter"></a>
-                                    </li>
-                                    <li class="social-link social-link--gh">
-                                        <a href="https://github.com/wepyjs/wepy" target="_blank"></a>
-                                    </li>
-                                </ul>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="tagline">
-                        <h2 class="tagline__title">欢迎捐赠 WePY</h2>
-                    </div>
-
-                    <div class="actions">
-
-                        <div class="action">
-                            <img src="https://raw.githubusercontent.com/wepyjs/wepy/master/docs/img/donate/wechat.png" />
-                            <h2>微信捐赠WePY</h2>
-                        </div>
-
-                        <div class="action">
-                            <img src="https://raw.githubusercontent.com/wepyjs/wepy/master/docs/img/donate/alipay.png" />
-                            <h2>支付宝捐赠WePY</h2>
-
-                        </div>
-
-                    </div>
-
-                </div>
-            </div>
-
-
-            <div class="slides">
-
-                <div class="slide slide--two">
-                    <div class="slide__inner">
-                        <div class="sections">
-
-                            <h2 class="section--title">捐赠名单</h2>
-
-                            <div class="section ">
-                                <div class="section__content">
-                                    <table class="table border stripe responsive">
-                                        <thead>
-                                            <tr>
-                                                <th style="width: 130px;">时间</th>
-                                                <th style="width: 200px;">姓名</th>
-                                                <th style="width: 150px;">金额</th>
-                                                <th>备注</th>
-                                            </tr>
-                                        </thead>
-                                        <tbody>
-                                            <tr v-for="item in donates">
-                                                <td data-th="时间">{{item.date}}</td>
-                                                <td data-th="姓名">{{item.name}}</td>
-                                                <td data-th="金额">￥ {{item.amount}}</td>
-                                                <td data-th="备注">{{item.desc}}</td>
-                                            </tr>
-                                        </tbody>
-                                    </table>
-                                </div>
-
-                            </div>
-
-                        </div>
-                    </div>
-                </div>
-                <div class="slide slide--three">
-                    <div class="slide__inner">
-                      <div class="slide__text">
-                        <h2>已经捐赠?</h2>
-                        <div class="text">
-                          <p>
-                             非常感谢您的关注与支持! <br />捐赠名单默认不会在网站上显示，
-                             如您希望显示可点击现方按钮, 进入 PR 页面完善信息，并发布 pull request，网站会不定期更新。
-                           </p>
-                        </div>
-                        <a href="https://github.com/wepyjs/wepy/edit/master/docs/data/donate.json" class="button button--pr">+ 添加捐赠信息</a>
-                      </div>
-                    </div>
-                  </div>
-            </div>
-        </div>
-        <div class="modal-container" :class="isQrShow ? 'active' : ''" @click="modalClick">
-            <div class="qr-modal">
-                <div style="padding: 10px;">
-                    我们是完全开源的，任何人都可以免费投稿。WePY 交流群已满500人，请加 gcaufy_helper 好友或者扫码加好友，验证回复 wepy 按照指引进群。
-                </div>
-                <img style="width: 200px;" src="img/qrcode.png">
-            </div>
-        </div>
-    </div>
-    <div class="footer">
-        <div class="footer-inner">
-            <div class="footer--copyright">
-                Copyright © 2017 THL A29 Limited a Tencent company All rights reserved
-            </div>
-        </div>
-    </div>
-
-    <script src="https://unpkg.com/vue"></script>
-    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
-    <script>
-        var app = new Vue({
-            el: '#app',
-            data: {
-                isQrShow: false,
-                donates: []
-            },
-            methods: {
-                wxEnter: function () {
-                    this.isQrShow = true
-                },
-                modalClick: function () {
-                    this.isQrShow = false
-                }
-            },
-            created: function () {
-                var self = this;
-                axios.get('./data/donate.json').then(function (res) {
-                    if (res && res.data) {
-                      self.donates = res.data.donates;
-                    }
-                });
-            }
-        })
-    </script>
-    <script>
-        var _hmt = _hmt || [];
-        (function () {
-            var hm = document.createElement("script");
-            hm.src = "https://hm.baidu.com/hm.js?14c98a4c2ac48bfa7a4c6e9bf797d125";
-            var s = document.getElementsByTagName("script")[0];
-            s.parentNode.insertBefore(hm, s);
-        })();
-    </script>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/docs/getstart.md b/docs/getstart.md
deleted file mode 100644
index 629180fa0..000000000
--- a/docs/getstart.md
+++ /dev/null
@@ -1,65 +0,0 @@
-## 快速入门
-
-### 项目创建与使用
-
-以下安装都通过`npm`安装
-
-**安装（更新） wepy 命令行工具。**
- 
-```bash
-npm install wepy-cli -g
-```
-
-**在开发目录生成开发DEMO。**
- 
-```bash
-wepy new myproject
-```
-
-**切换至项目目录。**
-
-```bash
-cd myproject
-```
-
-**开发实时编译。**
-
-```bash
-wepy build --watch
-```
-#### 项目目录结构
-```
-├── dist                   微信开发者工具指定的目录
-├── node_modules           
-├── src                    代码编写的目录
-|   ├── components         组件文件夹（非完整页面）
-|   |   ├── com_a.wpy      可复用组件 a
-|   |   └── com_b.wpy      可复用组件 b
-|   ├── pages              页面文件夹（完整页面）
-|   |   ├── index.wpy      页面 index
-|   |   └── page.wpy       页面 page
-|   └── app.wpy            小程序配置项（全局样式配置、声明钩子等）
-└── package.json           package 配置
-```
-
-#### 开发使用说明
-1. 使用`微信开发者工具`新建项目，本地开发选择`dist`目录。
-2. `微信开发者工具` --> 项目 --> 关闭ES6转ES5。
-3. 本地项目根目录运行`wepy build --watch`，开启实时编译。
-
-#### Sublime下代码高亮
-文件后缀为`.wpy`，可共用`vue`高亮，但需要手动安装。
-
-1. 打开`Sublime->Preferences->Browse Packages..`进入用户包文件夹。
-2. 在此文件夹下打开cmd，运行`git clone git@github.com:vuejs/vue-syntax-highlight.git`，无GIT用户可以直接下载[zip包](https://github.com/vuejs/vue-syntax-highlight/archive/master.zip)解压至当前文件夹。
-3. 关闭`.wpy`文件重新打开即可高亮。
-
-### 代码规范：
-1. 变量与方法使用尽量使用驼峰式命名，避免使用`$`开头。
-以`$`开头的方法或者属性为框架内建方法或者属性，可以被使用，使用前请[参考API文档](#api)。
-2. 入口，页面，组件的命名后缀为`.wpy`。外链的文件可以是其它后缀。
-请参考[wpy文件说明](#wpy文件说明)
-3. 使用ES6语法开发。
-框架在ES6下开发，因此也需要使用ES6开发小程序，ES6中有大量的语法糖可以让我们的代码更加简洁高效。
-4. 使用Promise
-框架默认对小程序提供的API全都进行了 Promise 处理，甚至可以直接使用`async/await`等新特性进行开发。
diff --git a/docs/img/compile_icon.png b/docs/img/compile_icon.png
deleted file mode 100644
index f0fe4b12e..000000000
Binary files a/docs/img/compile_icon.png and /dev/null differ
diff --git a/docs/img/component_icon.png b/docs/img/component_icon.png
deleted file mode 100644
index 11a4e2d89..000000000
Binary files a/docs/img/component_icon.png and /dev/null differ
diff --git a/docs/img/contributors/bruce.png b/docs/img/contributors/bruce.png
deleted file mode 100644
index 5aeb50fa6..000000000
Binary files a/docs/img/contributors/bruce.png and /dev/null differ
diff --git a/docs/img/contributors/gcaufy.png b/docs/img/contributors/gcaufy.png
deleted file mode 100644
index 07127c51c..000000000
Binary files a/docs/img/contributors/gcaufy.png and /dev/null differ
diff --git a/docs/img/contributors/sail.png b/docs/img/contributors/sail.png
deleted file mode 100644
index 55649b183..000000000
Binary files a/docs/img/contributors/sail.png and /dev/null differ
diff --git a/docs/img/donate/alipay.png b/docs/img/donate/alipay.png
deleted file mode 100644
index 1ad08d3f9..000000000
Binary files a/docs/img/donate/alipay.png and /dev/null differ
diff --git a/docs/img/donate/wechat.png b/docs/img/donate/wechat.png
deleted file mode 100644
index 131309620..000000000
Binary files a/docs/img/donate/wechat.png and /dev/null differ
diff --git a/docs/img/dot.svg b/docs/img/dot.svg
deleted file mode 100644
index 45df23c04..000000000
--- a/docs/img/dot.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><title>Artboard</title><circle cx="10" cy="10" r="1" fill="#FFF" fill-rule="evenodd" opacity=".11"/></svg>
\ No newline at end of file
diff --git a/docs/img/fatures/icon_feature_compile.svg b/docs/img/fatures/icon_feature_compile.svg
deleted file mode 100644
index bf4597de5..000000000
--- a/docs/img/fatures/icon_feature_compile.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="30" height="33" viewBox="0 0 30 33">
-  <defs>
-    <linearGradient id="icon_feature_compile-a" x1="50%" x2="0%" y1="100%" y2="0%">
-      <stop offset="0%" stop-color="#2CDA9C"/>
-      <stop offset="100%" stop-color="#1F9948"/>
-    </linearGradient>
-  </defs>
-  <path fill="url(#icon_feature_compile-a)" d="M273.394286,115.266436 L287.68,122.720982 C287.781429,122.773164 287.89,122.8 288,122.8 C288.11,122.8 288.218571,122.773164 288.32,122.720982 L302.605714,115.266436 C302.847143,115.139709 303,114.883273 303,114.6 L303,96.7090909 C303,96.5689455 302.955714,96.4407273 302.887143,96.3259273 C302.865714,96.2886545 302.834286,96.2648 302.805714,96.232 C302.765714,96.1842909 302.737143,96.1291273 302.685714,96.0918545 C302.66,96.0739636 302.628571,96.0739636 302.601429,96.0605455 C302.581429,96.0501091 302.571429,96.0262545 302.55,96.0173091 L288.264286,90.0536727 C288.094286,89.9821091 287.904286,89.9821091 287.734286,90.0536727 L273.448571,96.0173091 C273.427143,96.0262545 273.418571,96.0486182 273.397143,96.0605455 C273.371429,96.0739636 273.338571,96.0739636 273.314286,96.0918545 C273.262857,96.1276364 273.232857,96.1842909 273.192857,96.232 C273.165714,96.2648 273.134286,96.2886545 273.112857,96.3259273 C273.044286,96.4407273 273,96.5689455 273,96.7090909 L273,114.6 C273,114.883273 273.152857,115.139709 273.394286,115.266436 Z M274.428571,97.8108727 L287.285714,103.178145 L287.285714,120.8484 L274.428571,114.139309 L274.428571,97.8108727 Z M288.714286,120.8484 L288.714286,103.178145 L301.571429,97.8108727 L301.571429,114.139309 L288.714286,120.8484 Z M288,91.5490545 L300.362857,96.7090909 L288,101.869127 L275.637143,96.7090909 L288,91.5490545 Z" transform="translate(-273 -90)"/>
-</svg>
diff --git a/docs/img/fatures/icon_feature_component.svg b/docs/img/fatures/icon_feature_component.svg
deleted file mode 100644
index 7342db977..000000000
--- a/docs/img/fatures/icon_feature_component.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="32" height="33" viewBox="0 0 32 33">
-  <defs>
-    <linearGradient id="icon_feature_component-a" x1="50%" x2="0%" y1="100%" y2="0%">
-      <stop offset="0%" stop-color="#2CDA9C"/>
-      <stop offset="100%" stop-color="#1F9948"/>
-    </linearGradient>
-  </defs>
-  <g fill="url(#icon_feature_component-a)">
-    <path d="M.650717703 14.554386L13.6650718 14.554386C14.0242679 14.554386 14.3157895 14.2580057 14.3157895 13.892823L14.3157895.661562998C14.3157895.296380223 14.0242679 0 13.6650718 0L.650717703 0C.291521531 0 0 .296380223 0 .661562998L0 13.892823C0 14.2580057.291521531 14.554386.650717703 14.554386zM1.30143541 1.323126L13.0143541 1.323126 13.0143541 13.23126 1.30143541 13.23126 1.30143541 1.323126zM31.3492823 0L18.3349282 0C17.9757321 0 17.6842105.296380223 17.6842105.661562998L17.6842105 13.892823C17.6842105 14.2580057 17.9757321 14.554386 18.3349282 14.554386L31.3492823 14.554386C31.7084785 14.554386 32 14.2580057 32 13.892823L32 .661562998C32 .296380223 31.7084785 0 31.3492823 0zM30.6985646 13.23126L18.9856459 13.23126 18.9856459 1.323126 30.6985646 1.323126 30.6985646 13.23126zM.650717703 32.5333333L13.6650718 32.5333333C14.0242679 32.5333333 14.3157895 32.2369531 14.3157895 31.8717703L14.3157895 18.6405104C14.3157895 18.2753276 14.0242679 17.9789474 13.6650718 17.9789474L.650717703 17.9789474C.291521531 17.9789474 0 18.2753276 0 18.6405104L0 31.8717703C0 32.2369531.291521531 32.5333333.650717703 32.5333333zM1.30143541 19.3020734L13.0143541 19.3020734 13.0143541 31.2102073 1.30143541 31.2102073 1.30143541 19.3020734zM31.3492823 17.9789474L18.3349282 17.9789474C17.9757321 17.9789474 17.6842105 18.2753276 17.6842105 18.6405104L17.6842105 31.8717703C17.6842105 32.2369531 17.9757321 32.5333333 18.3349282 32.5333333L31.3492823 32.5333333C31.7084785 32.5333333 32 32.2369531 32 31.8717703L32 18.6405104C32 18.2753276 31.7084785 17.9789474 31.3492823 17.9789474zM30.6985646 31.2102073L18.9856459 31.2102073 18.9856459 19.3020734 30.6985646 19.3020734 30.6985646 31.2102073z"/>
-  </g>
-</svg>
diff --git a/docs/img/fatures/icon_feature_es.svg b/docs/img/fatures/icon_feature_es.svg
deleted file mode 100644
index 22109b382..000000000
--- a/docs/img/fatures/icon_feature_es.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="38" height="24" viewBox="0 0 38 24">
-  <defs>
-    <linearGradient id="icon_feature_es-a" x1="50%" x2="0%" y1="100%" y2="0%">
-      <stop offset="0%" stop-color="#2CDA9C"/>
-      <stop offset="100%" stop-color="#1F9948"/>
-    </linearGradient>
-  </defs>
-  <path fill="url(#icon_feature_es-a)" fill-rule="evenodd" d="M425,90.4528302 L425,113.54717 L441.663704,113.54717 L441.663704,111.800539 L426.962328,111.800539 L426.962328,102.485175 L440.344762,102.485175 L440.344762,100.706199 L426.962328,100.706199 L426.962328,92.1994609 L441.116825,92.1994609 L441.116825,90.4528302 L425,90.4528302 Z M453.896085,90 C451.579894,90 449.649735,90.4851752 448.169947,91.4878706 C446.497143,92.5552561 445.69291,94.0754717 445.69291,96.0808625 C445.69291,97.9568733 446.561481,99.4123989 448.330794,100.415094 C449.102857,100.867925 450.872169,101.48248 453.606561,102.25876 C456.212275,102.97035 457.885079,103.584906 458.657143,104.037736 C460.20127,104.911051 461.005503,106.140162 461.005503,107.725067 C461.005503,109.083558 460.362116,110.183288 459.139683,110.991914 C457.885079,111.768194 456.244444,112.188679 454.217778,112.188679 C452.094603,112.188679 450.453968,111.703504 449.295873,110.765499 C448.0091,109.698113 447.269206,108.080863 447.044021,105.913747 L445.113862,105.913747 C445.306878,108.695418 446.271958,110.797844 448.0091,112.188679 C449.521058,113.385445 451.612063,114 454.249947,114 C456.855661,114 458.946667,113.450135 460.522963,112.350404 C462.163598,111.185984 463,109.601078 463,107.628032 C463,105.525606 462.034921,103.908356 460.136931,102.77628 C459.107513,102.12938 457.145185,101.41779 454.217778,100.576819 C451.965926,99.9299191 450.486137,99.4123989 449.810582,99.0889488 C448.362963,98.3126685 447.655238,97.309973 447.655238,96.0161725 C447.655238,94.5606469 448.234286,93.4609164 449.45672,92.7493261 C450.518307,92.1024259 451.965926,91.7789757 453.831746,91.7789757 C455.826243,91.7789757 457.37037,92.2318059 458.464127,93.1698113 C459.557884,94.1078167 460.233439,95.4663073 460.490794,97.277628 L462.453122,97.277628 C462.260106,94.884097 461.391534,93.0727763 459.879577,91.8436658 C458.399788,90.6145553 456.405291,90 453.896085,90 Z" transform="translate(-425 -90)"/>
-</svg>
diff --git a/docs/img/fatures/icon_feature_npm.svg b/docs/img/fatures/icon_feature_npm.svg
deleted file mode 100644
index b53723e38..000000000
--- a/docs/img/fatures/icon_feature_npm.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="22" height="28" viewBox="0 0 22 28">
-  <defs>
-    <linearGradient id="icon_feature_npm-a" x1="50%" x2="0%" y1="100%" y2="0%">
-      <stop offset="0%" stop-color="#2CDA9C"/>
-      <stop offset="100%" stop-color="#1F9948"/>
-    </linearGradient>
-  </defs>
-  <polygon fill="url(#icon_feature_npm-a)" fill-rule="evenodd" points="508 90 508 118 509.546 118 509.546 91.922 509.625 91.922 528.097 118 530 118 530 90 528.454 90 528.454 115.922 528.375 115.922 509.982 90" transform="translate(-508 -90)"/>
-</svg>
diff --git a/docs/img/fatures/icon_feature_optimize.svg b/docs/img/fatures/icon_feature_optimize.svg
deleted file mode 100644
index 20bd1af13..000000000
--- a/docs/img/fatures/icon_feature_optimize.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
-  <defs>
-    <linearGradient id="icon_feature_optimize-a" x1="50%" x2="0%" y1="100%" y2="0%">
-      <stop offset="0%" stop-color="#2CDA9C"/>
-      <stop offset="100%" stop-color="#1F9948"/>
-    </linearGradient>
-  </defs>
-  <path fill="url(#icon_feature_optimize-a)" d="M606.18,94.1106667 C605.956,94.0586667 605.718667,94.1253333 605.556,94.288 L602.12,97.724 L599.276,94.88 L602.712,91.444 C602.876,91.28 602.942667,91.044 602.889333,90.82 C602.836,90.5946667 602.669333,90.4133333 602.450667,90.34 C601.772,90.1146667 601.058667,90 600.333333,90 C596.657333,90 593.666667,92.9906667 593.666667,96.6666667 C593.666667,97.36 593.802667,98.016 594,98.6453333 C591.113333,102.285333 587.284,106.113333 583.645333,109 C583.016,108.802667 582.36,108.666667 581.666667,108.666667 C577.990667,108.666667 575,111.657333 575,115.333333 C575,116.058667 575.114667,116.772 575.34,117.450667 C575.413333,117.669333 575.594667,117.836 575.82,117.889333 C576.045333,117.942667 576.281333,117.874667 576.444,117.712 L579.88,114.276 L582.724,117.12 L579.288,120.556 C579.125333,120.72 579.057333,120.956 579.110667,121.18 C579.164,121.405333 579.330667,121.586667 579.549333,121.66 C580.228,121.885333 580.941333,122 581.666667,122 C585.342667,122 588.333333,119.009333 588.333333,115.333333 C588.333333,114.64 588.197333,113.984 588,113.354667 C590.886667,109.714667 594.716,105.886667 598.354667,103 C598.984,103.197333 599.64,103.333333 600.333333,103.333333 C604.009333,103.333333 607,100.342667 607,96.6666667 C607,95.9413333 606.885333,95.228 606.66,94.5493333 C606.585333,94.3306667 606.405333,94.164 606.18,94.1106667 Z M581.666667,120.666667 C581.473333,120.666667 581.282667,120.657333 581.092,120.637333 L584.137333,117.592 C584.397333,117.332 584.397333,116.909333 584.137333,116.649333 L580.350667,112.862667 C580.090667,112.602667 579.668,112.602667 579.408,112.862667 L576.362667,115.908 C576.342667,115.717333 576.333333,115.526667 576.333333,115.333333 C576.333333,112.392 578.725333,110 581.666667,110 C584.608,110 587,112.392 587,115.333333 C587,118.274667 584.608,120.666667 581.666667,120.666667 Z M587.396,111.981333 C586.817333,110.997333 586.002667,110.181333 585.017333,109.602667 C588.424,106.833333 591.834667,103.424 594.602667,100.017333 C595.181333,101.001333 595.996,101.817333 596.981333,102.396 C593.574667,105.165333 590.165333,108.574667 587.396,111.981333 Z M600.333333,102 C597.392,102 595,99.608 595,96.6666667 C595,93.7253333 597.392,91.3333333 600.333333,91.3333333 C600.525333,91.3333333 600.717333,91.3426667 600.908,91.364 L597.862667,94.4093333 C597.602667,94.6693333 597.602667,95.092 597.862667,95.352 L601.649333,99.1386667 C601.909333,99.3986667 602.332,99.3986667 602.592,99.1386667 L605.637333,96.0933333 C605.657333,96.2826667 605.666667,96.4746667 605.666667,96.6666667 C605.666667,99.608 603.274667,102 600.333333,102 Z" transform="translate(-575 -90)"/>
-</svg>
diff --git a/docs/img/fatures/icon_feature_plugin.svg b/docs/img/fatures/icon_feature_plugin.svg
deleted file mode 100644
index 18d080c03..000000000
--- a/docs/img/fatures/icon_feature_plugin.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="21" height="32" viewBox="0 0 21 32">
-  <defs>
-    <linearGradient id="icon_feature_plugin-a" x1="50%" x2="0%" y1="100%" y2="0%">
-      <stop offset="0%" stop-color="#2CDA9C"/>
-      <stop offset="100%" stop-color="#1F9948"/>
-    </linearGradient>
-  </defs>
-  <path fill="url(#icon_feature_plugin-a)" d="M659.21875,120.666667 L652.65625,120.666667 C652.294,120.666667 652,120.965333 652,121.333333 C652,121.701333 652.294,122 652.65625,122 L659.21875,122 C662.475063,122 665.125,119.308 665.125,116 L665.125,112.666667 L667.09375,112.666667 C667.456,112.666667 667.75,112.368 667.75,112 L667.75,110 L671.03125,110 C672.116688,110 673,109.102667 673,108 L673,98.6666667 C673,97.564 672.116688,96.6666667 671.03125,96.6666667 L669.0625,96.6666667 L669.0625,90.6666667 C669.0625,90.2986667 668.7685,90 668.40625,90 C668.044,90 667.75,90.2986667 667.75,90.6666667 L667.75,96.6666667 L661.1875,96.6666667 L661.1875,90.6666667 C661.1875,90.2986667 660.8935,90 660.53125,90 C660.169,90 659.875,90.2986667 659.875,90.6666667 L659.875,96.6666667 L657.90625,96.6666667 C656.820812,96.6666667 655.9375,97.564 655.9375,98.6666667 L655.9375,108 C655.9375,109.102667 656.820812,110 657.90625,110 L661.1875,110 L661.1875,112 C661.1875,112.368 661.4815,112.666667 661.84375,112.666667 L663.8125,112.666667 L663.8125,116 C663.8125,118.573333 661.751875,120.666667 659.21875,120.666667 Z M657.25,108 L657.25,98.6666667 C657.25,98.2986667 657.544,98 657.90625,98 L671.03125,98 C671.3935,98 671.6875,98.2986667 671.6875,98.6666667 L671.6875,108 C671.6875,108.368 671.3935,108.666667 671.03125,108.666667 L657.90625,108.666667 C657.544,108.666667 657.25,108.368 657.25,108 Z M662.5,110 L666.4375,110 L666.4375,111.333333 L662.5,111.333333 L662.5,110 Z" transform="translate(-652 -90)"/>
-</svg>
diff --git a/docs/img/fatures/icon_feature_promise.svg b/docs/img/fatures/icon_feature_promise.svg
deleted file mode 100644
index 4cf4e4793..000000000
--- a/docs/img/fatures/icon_feature_promise.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="22" height="30" viewBox="0 0 22 30">
-  <defs>
-    <linearGradient id="icon_feature_promise-a" x1="50%" x2="0%" y1="100%" y2="0%">
-      <stop offset="0%" stop-color="#2CDA9C"/>
-      <stop offset="100%" stop-color="#1F9948"/>
-    </linearGradient>
-  </defs>
-  <path fill="url(#icon_feature_promise-a)" fill-rule="evenodd" d="M129,90 L141.255319,90 C147.723404,90 151,92.7731092 151,98.3613445 C151,103.991597 147.723404,106.806723 141.212766,106.806723 L130.659574,106.806723 L130.659574,120 L129,120 L129,90 Z M130.659574,91.512605 L130.659574,105.294118 L141.170213,105.294118 C143.978723,105.294118 146.021277,104.663866 147.382979,103.487395 C148.659574,102.352941 149.340426,100.630252 149.340426,98.3613445 C149.340426,96.092437 148.659574,94.3697479 147.382979,93.2773109 C146.021277,92.1008403 143.93617,91.512605 141.170213,91.512605 L130.659574,91.512605 Z" transform="translate(-129 -90)"/>
-</svg>
diff --git a/docs/img/fatures/icon_feature_size.svg b/docs/img/fatures/icon_feature_size.svg
deleted file mode 100644
index bcad35a1a..000000000
--- a/docs/img/fatures/icon_feature_size.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
-  <defs>
-    <linearGradient id="icon_feature_size-a" x1="50%" x2="0%" y1="100%" y2="0%">
-      <stop offset="0%" stop-color="#2CDA9C"/>
-      <stop offset="100%" stop-color="#1F9948"/>
-    </linearGradient>
-  </defs>
-  <g fill="url(#icon_feature_size-a)">
-    <path d="M31.98,7.49466667 C32.0293333,7.296 31.984,7.084 31.8586667,6.92266667 C31.732,6.76133333 31.5386667,6.66666667 31.3333333,6.66666667 L29.3333333,6.66666667 L29.3333333,3.33333333 C29.3333333,2.96533333 29.0346667,2.66666667 28.6666667,2.66666667 L11.1333333,2.66666667 L8.09066667,0.153333333 C7.972,0.0546666667 7.82133333,0 7.66666667,0 L0.666666667,0 C0.298666667,0 0,0.298666667 0,0.666666667 L0,22 C0,22.028 0.012,22.052 0.016,22.0786667 C0.02,22.1173333 0.0266666667,22.152 0.0386666667,22.1893333 C0.056,22.248 0.0826666667,22.3 0.114666667,22.3506667 C0.126666667,22.3693333 0.129333333,22.392 0.142666667,22.4106667 C0.150666667,22.42 0.161333333,22.424 0.169333333,22.432 C0.213333333,22.484 0.266666667,22.5226667 0.325333333,22.5586667 C0.348,22.572 0.366666667,22.5906667 0.389333333,22.6026667 C0.474666667,22.6413333 0.566666667,22.6666667 0.666666667,22.6666667 L12.0333333,22.6666667 C12.3786667,27.8693333 16.7106667,32 22,32 C27.5146667,32 32,27.5146667 32,22 C32,19.6973333 31.2106667,17.5813333 29.8973333,15.888 L31.98,7.49466667 Z M7.42666667,1.33333333 L10.468,3.84666667 C10.588,3.94666667 10.7386667,4 10.8933333,4 L28,4 L28,6.66666667 L4.29333333,6.66666667 C3.98666667,6.66666667 3.72,6.876 3.64666667,7.17333333 L1.33333333,16.5266667 L1.33333333,1.33333333 L7.42666667,1.33333333 Z M4.816,8 L30.4813333,8 L28.8173333,14.704 C27.0293333,13.032 24.636,12 22,12 C16.7106667,12 12.3786667,16.1306667 12.0333333,21.3333333 L1.51866667,21.3333333 L4.816,8 Z M22,30.6666667 C17.2213333,30.6666667 13.3333333,26.7786667 13.3333333,22 C13.3333333,17.2213333 17.2213333,13.3333333 22,13.3333333 C26.7786667,13.3333333 30.6666667,17.2213333 30.6666667,22 C30.6666667,26.7786667 26.7786667,30.6666667 22,30.6666667 Z"/>
-    <path d="M22 17.3333333C22.368 17.3333333 22.6666667 17.0346667 22.6666667 16.6666667L22.6666667 15.3333333C22.6666667 14.9653333 22.368 14.6666667 22 14.6666667 21.632 14.6666667 21.3333333 14.9653333 21.3333333 15.3333333L21.3333333 16.6666667C21.3333333 17.0346667 21.632 17.3333333 22 17.3333333zM22 21.3333333C22.368 21.3333333 22.6666667 21.0346667 22.6666667 20.6666667L22.6666667 19.3333333C22.6666667 18.9653333 22.368 18.6666667 22 18.6666667 21.632 18.6666667 21.3333333 18.9653333 21.3333333 19.3333333L21.3333333 20.6666667C21.3333333 21.0346667 21.632 21.3333333 22 21.3333333zM22.6666667 24.1226667L22.6666667 23.3333333C22.6666667 22.9653333 22.368 22.6666667 22 22.6666667 21.632 22.6666667 21.3333333 22.9653333 21.3333333 23.3333333L21.3333333 24.1226667C20.5586667 24.3986667 20 25.132 20 26L20 28.6666667C20 29.0346667 20.2986667 29.3333333 20.6666667 29.3333333L23.3333333 29.3333333C23.7013333 29.3333333 24 29.0346667 24 28.6666667L24 26C24 25.132 23.4413333 24.3986667 22.6666667 24.1226667zM22.6666667 28L21.3333333 28 21.3333333 26C21.3333333 25.632 21.632 25.3333333 22 25.3333333 22.368 25.3333333 22.6666667 25.632 22.6666667 26L22.6666667 28z"/>
-  </g>
-</svg>
diff --git a/docs/img/fatures/icon_feature_style.svg b/docs/img/fatures/icon_feature_style.svg
deleted file mode 100644
index 605aa6d69..000000000
--- a/docs/img/fatures/icon_feature_style.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="37" height="33" viewBox="0 0 37 33">
-  <defs>
-    <linearGradient id="icon_feature_style-a" x1="50%" x2="0%" y1="100%" y2="0%">
-      <stop offset="0%" stop-color="#2CDA9C"/>
-      <stop offset="100%" stop-color="#1F9948"/>
-    </linearGradient>
-  </defs>
-  <path fill="url(#icon_feature_style-a)" d="M65.5,122.673684 L47,90 L60.4895833,90 L61.0677083,90.9724311 L61.0869792,90.9724311 L65.5,98.7129825 L69.9130208,90.9724311 L69.9322917,90.9724311 L70.5104167,90 L84,90 L65.5,122.673684 Z M70.703125,90.9724311 L65.5,100.113283 L60.296875,90.9724311 L54.8817708,90.9724311 L65.5,109.604211 L76.1182292,90.9724311 L70.703125,90.9724311 Z M76.9083333,90.9724311 L65.5,111.004511 L54.0916667,90.9724311 L48.5416667,90.9724311 L65.5,120.923308 L82.4583333,90.9724311 L76.9083333,90.9724311 Z" transform="translate(-47 -90)"/>
-</svg>
diff --git a/docs/img/footer.png b/docs/img/footer.png
deleted file mode 100644
index 725355ead..000000000
Binary files a/docs/img/footer.png and /dev/null differ
diff --git a/docs/img/head.png b/docs/img/head.png
deleted file mode 100644
index 5d73c4a18..000000000
Binary files a/docs/img/head.png and /dev/null differ
diff --git a/docs/img/icon-com-60.png b/docs/img/icon-com-60.png
deleted file mode 100644
index 7e3415ae4..000000000
Binary files a/docs/img/icon-com-60.png and /dev/null differ
diff --git a/docs/img/icon-compiler-60.png b/docs/img/icon-compiler-60.png
deleted file mode 100644
index d78ff5617..000000000
Binary files a/docs/img/icon-compiler-60.png and /dev/null differ
diff --git a/docs/img/icon-es-60.png b/docs/img/icon-es-60.png
deleted file mode 100644
index e61f774d1..000000000
Binary files a/docs/img/icon-es-60.png and /dev/null differ
diff --git a/docs/img/icon-footer.png b/docs/img/icon-footer.png
deleted file mode 100644
index 05c0cddf9..000000000
Binary files a/docs/img/icon-footer.png and /dev/null differ
diff --git a/docs/img/icon-framework-60.png b/docs/img/icon-framework-60.png
deleted file mode 100644
index 9796806ad..000000000
Binary files a/docs/img/icon-framework-60.png and /dev/null differ
diff --git a/docs/img/icon-npm-60.png b/docs/img/icon-npm-60.png
deleted file mode 100644
index bda57cd71..000000000
Binary files a/docs/img/icon-npm-60.png and /dev/null differ
diff --git a/docs/img/icon-optimze-60.png b/docs/img/icon-optimze-60.png
deleted file mode 100644
index ec9443eca..000000000
Binary files a/docs/img/icon-optimze-60.png and /dev/null differ
diff --git a/docs/img/icon-plugin-60.png b/docs/img/icon-plugin-60.png
deleted file mode 100644
index 2a581da06..000000000
Binary files a/docs/img/icon-plugin-60.png and /dev/null differ
diff --git a/docs/img/icon-promise-60.png b/docs/img/icon-promise-60.png
deleted file mode 100644
index 197008b2c..000000000
Binary files a/docs/img/icon-promise-60.png and /dev/null differ
diff --git a/docs/img/icon-style-30.png b/docs/img/icon-style-30.png
deleted file mode 100644
index 2db04617a..000000000
Binary files a/docs/img/icon-style-30.png and /dev/null differ
diff --git a/docs/img/icon-style-60.png b/docs/img/icon-style-60.png
deleted file mode 100644
index 7c599df8a..000000000
Binary files a/docs/img/icon-style-60.png and /dev/null differ
diff --git a/docs/img/icon_external.png b/docs/img/icon_external.png
deleted file mode 100644
index c8e97710f..000000000
Binary files a/docs/img/icon_external.png and /dev/null differ
diff --git a/docs/img/icon_gh.svg b/docs/img/icon_gh.svg
deleted file mode 100644
index 5c567e571..000000000
--- a/docs/img/icon_gh.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><title>icon_github</title><path d="M1.667 10.041a8.334 8.334 0 0 0 5.699 7.907c.417.077.569-.18.569-.401 0-.198-.008-.722-.012-1.417-2.318.503-2.807-1.118-2.807-1.118-.379-.962-.925-1.219-.925-1.219-.757-.516.057-.506.057-.506.837.059 1.276.859 1.276.859.744 1.273 1.951.905 2.426.692.076-.538.29-.906.529-1.114-1.85-.21-3.796-.925-3.796-4.118 0-.91.325-1.654.858-2.237-.086-.21-.372-1.058.082-2.205 0 0 .699-.224 2.291.854A7.982 7.982 0 0 1 10 5.738a7.99 7.99 0 0 1 2.086.28c1.591-1.078 2.29-.854 2.29-.854.455 1.147.169 1.995.083 2.205.534.583.857 1.327.857 2.237 0 3.201-1.95 3.905-3.805 4.112.299.257.565.765.565 1.543 0 1.114-.01 2.013-.01 2.286 0 .223.15.482.573.4a8.334 8.334 0 1 0-10.972-7.906z" fill="#FFF" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/docs/img/icon_wechat.svg b/docs/img/icon_wechat.svg
deleted file mode 100644
index ece95a1c8..000000000
--- a/docs/img/icon_wechat.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="22" viewBox="0 0 24 22">
-  <g fill="#FFF">
-    <path d="M16.6079018,7.50839286 C14.4117411,7.62316964 12.5020089,8.28888393 10.9515179,9.79303571 C9.385,11.3127232 8.66991071,13.1747768 8.86535714,15.4832589 C8.00696429,15.376875 7.22508929,15.2598661 6.43879464,15.1936161 C6.16723214,15.1707589 5.84495536,15.2032589 5.61495536,15.3330357 C4.85142857,15.7638839 4.11946429,16.2503571 3.251875,16.7925893 C3.41107143,16.0726339 3.51410714,15.4421429 3.69651786,14.8357589 C3.83066964,14.3900446 3.76852679,14.1420089 3.35794643,13.8516518 C0.7215625,11.9904018 -0.389732143,9.20482143 0.441919643,6.33696429 C1.21138393,3.68392857 3.10089286,2.07495536 5.66830357,1.23620536 C9.17263393,0.0915178571 13.1108482,1.25915179 15.2417411,4.04133929 C16.01125,5.04633929 16.4832143,6.17433036 16.6079018,7.50839286 L16.6079018,7.50839286 Z M6.5003125,6.61477679 C6.52049107,6.09026786 6.06602679,5.61772321 5.52616071,5.60191964 C4.9734375,5.58571429 4.51879464,6.00808036 4.50263393,6.5528125 C4.48633929,7.10482143 4.90852679,7.5471875 5.46526786,7.56129464 C6.01723214,7.57526786 6.47991071,7.15232143 6.5003125,6.61477679 L6.5003125,6.61477679 Z M11.7738393,5.6015625 C11.2320089,5.61151786 10.7741071,6.07303571 10.7837054,6.59964286 C10.7936161,7.14549107 11.2427679,7.57254464 11.7999554,7.56584821 C12.3586161,7.55910714 12.7822768,7.12758929 12.7769643,6.57022321 C12.7723661,6.02303571 12.3252232,5.59151786 11.7738393,5.6015625 L11.7738393,5.6015625 Z"/>
-    <path d="M21.5420089,21.2 C20.8466071,20.8903571 20.2086607,20.4257589 19.5295536,20.3548214 C18.8529911,20.2841518 18.1417411,20.6745089 17.4339286,20.746875 C15.2778571,20.9674554 13.3462054,20.3665179 11.7534821,18.8936607 C8.72424107,16.0917857 9.15709821,11.7958036 12.6617411,9.49973214 C15.7765625,7.45910714 20.3446429,8.139375 22.5407143,10.9708482 C24.4571429,13.4415625 24.2319196,16.7213839 21.8924107,18.7970089 C21.2153125,19.3977232 20.9717411,19.8920982 21.4061161,20.6839732 C21.4862946,20.8301786 21.4954018,21.0153125 21.5420089,21.2 L21.5420089,21.2 Z M13.6259821,13.5357143 C14.0687946,13.5361607 14.4332589,13.1896429 14.45,12.7524107 C14.4677232,12.2894196 14.0953571,11.9011607 13.6318304,11.8992411 C13.1729018,11.8970982 12.7883036,12.2909375 12.8043304,12.7469196 C12.819375,13.1827232 13.1864732,13.5351786 13.6259821,13.5357143 L13.6259821,13.5357143 Z M18.7289732,11.9010268 C18.2994643,11.8980357 17.9344196,12.2496875 17.9169196,12.6837054 C17.8983036,13.1478571 18.2591071,13.5289732 18.7183482,13.5301339 C19.1626339,13.5316518 19.5137054,13.1956696 19.5299107,12.7535714 C19.5470982,12.2883482 19.1862054,11.9041964 18.7289732,11.9010268 L18.7289732,11.9010268 Z"/>
-  </g>
-</svg>
diff --git a/docs/img/lines@2x.png b/docs/img/lines@2x.png
deleted file mode 100644
index 8569bf57a..000000000
Binary files a/docs/img/lines@2x.png and /dev/null differ
diff --git a/docs/img/logo.png b/docs/img/logo.png
deleted file mode 100644
index 1bfe863b6..000000000
Binary files a/docs/img/logo.png and /dev/null differ
diff --git a/docs/img/pattern.png b/docs/img/pattern.png
deleted file mode 100644
index 812841ad3..000000000
Binary files a/docs/img/pattern.png and /dev/null differ
diff --git a/docs/img/plus.svg b/docs/img/plus.svg
deleted file mode 100644
index aca72ffd1..000000000
--- a/docs/img/plus.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="73" height="73" viewBox="0 0 73 73" xmlns="http://www.w3.org/2000/svg"><title>plus</title><g fill="none" fill-rule="evenodd"><circle fill="#58E498" cx="36.5" cy="36.5" r="36.5"/><path d="M37.472 36.042v-15.06a.971.971 0 1 0-1.944 0v15.06h-15.06a.971.971 0 1 0 0 1.944h15.06v15.06a.971.971 0 1 0 1.944 0v-15.06h15.06a.971.971 0 1 0 0-1.944h-15.06z" fill="#FFF" opacity=".6"/></g></svg>
\ No newline at end of file
diff --git a/docs/img/qrcode.png b/docs/img/qrcode.png
deleted file mode 100644
index 47eeddf76..000000000
Binary files a/docs/img/qrcode.png and /dev/null differ
diff --git a/docs/img/vuestyle_icon.png b/docs/img/vuestyle_icon.png
deleted file mode 100644
index 587bd6aac..000000000
Binary files a/docs/img/vuestyle_icon.png and /dev/null differ
diff --git a/docs/img/wepylogo.png b/docs/img/wepylogo.png
deleted file mode 100644
index 0fcd704e6..000000000
Binary files a/docs/img/wepylogo.png and /dev/null differ
diff --git a/docs/index.html b/docs/index.html
deleted file mode 100644
index 5e8a1085d..000000000
--- a/docs/index.html
+++ /dev/null
@@ -1,393 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-
-    <meta http-equiv="x-ua-compatible" content="ie=edge">
-
-    <title>WePY | 小程序组件化开发框架</title>
-    <meta name=keywords content="WePY, 小程序, 组件化, ES6, ES7, Promise">
-    <meta name="description"
-          content="小程序组件化开发框架">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-
-    <!-- favicon.ico in the root directory -->
-    <link rel="stylesheet" href="./css/main.css">
-    <meta property="og:title" content="WePy 小程序组件化开发框架">
-</head>
-<body class="shown">
-<div class="container-wrap" id="app">
-
-    <div class="container">
-        <div class="slides">
-            <div class="slide slide--one">
-                <div class="slide__inner">
-                    <div class="header">
-                        <div class="header__inner">
-                            <a class="logo" href="/">
-                                <span class="logo__icon"></span>
-                                <div class="logo_text">
-                                    <span class="logo__title">WePY</span>
-                                    <span class="logo__description"><span> </span>帮你快速开发小程序</span>
-                                </div>
-                            </a>
-
-                            <div class="nav">
-                                <a class="nav__item nav__item--home" href="#/">首页</a>
-                                <a class="nav__item nav__item--document" target="_blank" href="./document.html">使用手册</a>
-                                <a class="nav__item nav__item--api" target="_blank"
-                                   href="./document.html#/api">API 说明</a>
-                                <a class="nav__item nav__item--logs" target="_blank" href="./document.html#/changelog">版本日志</a>
-                                <a class="nav__item nav__item--donate" href="./donate.html">Donate</a>
-                            </div>
-
-                            <div class="shares">
-                                <ul class="social-links">
-                                    <li class="social-link social-link--wx tooltip tooltip--indis" >
-                                        <a href="#" @mouseenter="wxEnter"></a>
-                                    </li>
-                                    <li class="social-link social-link--gh">
-                                        <a href="https://github.com/wepyjs/wepy" target="_blank"></a>
-                                    </li>
-                                </ul>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="tagline">
-                        <h2 class="tagline__title">让小程序支持组件化开发的框架</h2>
-                        <div class="tagline__body">一个最受欢迎的小程序框架.</div>
-                        <div class="tagline__button">
-                            <a class="button button--secondary" href="./document.html">从这里开始</a>
-                        </div>
-                        <div class="tagline__shieds">
-                            <div class="tagline__shieds--social">
-                                <a><img src="https://img.shields.io/github/forks/wepyjs/wepy.svg?style=social&label=Fork"></a>
-                                <a><img src="https://img.shields.io/github/stars/wepyjs/wepy.svg?style=social&label=Star"></a>
-                                <a><img src="https://img.shields.io/github/watchers/wepyjs/wepy.svg?style=social&label=Watch"></a>
-                            </div>
-                            <a href="https://badge.fury.io/js/wepy"><img
-                                    data-src="https://camo.githubusercontent.com/fdb99ae00102d3376f9c500a0505411d7037333b/68747470733a2f2f62616467652e667572792e696f2f6a732f776570792e737667"
-                                    alt="npm version" src="https://badge.fury.io/js/wepy.svg"
-                                    style="max-width:100%;"></a>
-                            <a href="https://travis-ci.org/wepyjs/wepy"><img
-                                    data-src="https://camo.githubusercontent.com/e32bbc2f8619b7408d917253244d0c119af5bdba/68747470733a2f2f7472617669732d63692e6f72672f776570796a732f776570792e7376673f6272616e63683d6d6173746572"
-                                    alt="travis-ci" src="https://travis-ci.org/wepyjs/wepy.svg?branch=master"
-                                    style="max-width:100%;"></a>
-                            <a href="https://coveralls.io/github/wepyjs/wepy?branch=master"><img
-                                    data-src="https://camo.githubusercontent.com/b9c60c722e692ddf5e85dd91cbbcc841633bed9f/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f776570796a732f776570792f62616467652e7376673f6272616e63683d6d6173746572"
-                                    alt="Coverage Status"
-                                    src="https://coveralls.io/repos/github/wepyjs/wepy/badge.svg?branch=master"
-                                    style="max-width:100%;"></a>
-                            <a href="https://david-dm.org/wepyjs/wepy"><img
-                                    data-src="https://camo.githubusercontent.com/d3197e1930cec8f270b89fcff34d093d918b33b0/68747470733a2f2f64617669642d646d2e6f72672f776570796a732f776570792e737667"
-                                    alt="Dependency Status" src="https://david-dm.org/wepyjs/wepy.svg"
-                                    style="max-width:100%;"></a>
-                        </div>
-                        <div class="tagline__footer">
-                            <div class="tagline__footer-inner">
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-
-            <div class="slide slide--features">
-                <div class="slide__inner">
-                    <div class="section section--enter">
-                        <h2 class="title">为什么要选择WePY？</h2>
-                        <div class="text">
-                            <p>
-                                目前已有超过 1500 位开发者使用或了解本框架, 拥有众多的开发特性和优化方案.
-                            </p>
-                        </div>
-
-                        <div class="features">
-                            <div class="feature-item">
-                                <span class="features__icon features-icon--style"></span>
-                                <div class="features-text">
-                                    <h2 class="features__title">开发风格</h2>
-                                    <p class="features__description">接近于 Vue.js，支持组件 Props
-                                        传值，自定义事件、组件分布式复用Mixin、计算属性函数computed、模板内容分发slot等等</p>
-                                </div>
-                            </div>
-
-                            <div class="feature-item">
-                                <span class="features__icon features-icon--component"></span>
-                                <div class="features-text">
-                                    <h2 class="features__title">组件化</h2>
-                                    <p class="features__description">组件化开发，完美解决组件隔离，组件嵌套，组件通信等问题</p>
-                                </div>
-                            </div>
-
-                            <div class="feature-item">
-                                <span class="features__icon features-icon--npm"></span>
-                                <div class="features-text">
-                                    <h2 class="features__title">NPM</h2>
-                                    <p class="features__description">支持使用第三方 npm 资源，自动处理 npm 资源之间的依赖关系，完美兼容所有无平台依赖的 npm 资源包</p>
-                                </div>
-                            </div>
-                            <div class="feature-item">
-                                <span class="features__icon features-icon--promise"></span>
-                                <div class="features-text">
-                                    <h2 class="feature__title">Promise</h2>
-                                    <p class="features__description">通过 polyfill 让小程序完美支持 Promise，解决回调烦恼</p>
-                                </div>
-                            </div>
-                            <div class="feature-item">
-                                <span class="features__icon features-icon--es"></span>
-                                <div class="features-text">
-                                    <h2 class="feature__title">ES2015</h2>
-                                    <p class="features__description">可使用 Generator Fu-nction / Class / Async Function 等特性，大大提升开发效率</p>
-                                </div>
-                            </div>
-                            <div class="feature-item">
-                                <span class="features__icon features-icon--optimize"></span>
-                                <div class="features-text">
-                                    <h2 class="feature__title">优化</h2>
-                                    <p class="features__description">对小程序本身的优化，如请求列对处理，优雅的事件处理，生命周期的补充，性能的优化等等</p>
-                                </div>
-                            </div>
-                            <div class="feature-item">
-                                <span class="features__icon features-icon--compile"></span>
-                                <div class="features-text">
-                                    <h2 class="feature__title">编译器</h2>
-                                    <p class="features__description">支持样式编译器：Less/Sass/Styus，模板编译器：wx-ml/Pug，代码编译器：Babel/Typescript。
-                                    </p>
-                                </div>
-                            </div>
-                            <div class="feature-item">
-                                <span class="features__icon features-icon--plugin"></span>
-                                <div class="features-text">
-                                    <h2 class="feature__title">插件</h2>
-                                    <p class="features__description">支持多种插件处理，如文件压缩，图片压缩，内容替换等，扩展简单,使用方便
-                                    </p>
-                                </div>
-                            </div>
-
-                            <div class="feature-item">
-                                <span class="features__icon features-icon--size"></span>
-                                <div class="features-text">
-                                    <h2 class="feature__title">框架大小</h2>
-                                    <p class="features__description">
-                                        压缩后 24.3KB 即可拥有所有框架功能，额外增加 8.9
-                                        KB后即可使用 Promise 和 Async Function
-                                    </p>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="slide slide--gist">
-                <div class="slide__inner">
-                    <div class="slide__header">
-                        <h2 class="slide__title">主要功能特性</h2>
-                        <p class="slide__description">
-                            WePY 框架在开发过程中参考了 Vue 等现有框架的一些语法风格和功能特性，对原生小程序的开发模式进行了再次封装，更贴近于 MVVM 架构模式, 并支持ES6/7的一些新特性。以下是使用 WePY 前后的代码对比与组件化示例。</p>
-                    </div>
-                    <div class="slide__body">
-                        <article class="gallery ">
-                            <figure class="gist window" :style="item.style" v-for="(item, index) in gists" :key="index" @mouseenter="codeEnter(item)" @mouseleave="codeLeave(item)">
-                                <figcaption><span class="chrome btn close"></span><span
-                                        class="chrome btn minimize"></span><span
-                                        class="chrome btn fullscreen"></span><span
-                                        class="chrome title">{{item.title}}</span></figcaption>
-                                <pre class="language-js" data-start="100"><code>
-                                    {{item.code}}
-                                </code></pre>
-                            </figure>
-                        </article>
-
-                    </div>
-                </div>
-            </div>
-            <div class="slide slide--examples slide--shown">
-                <div class="slide__inner">
-                    <div class="slide__header">
-                        <h2 class="slide__title">应用案例</h2>
-                        <p class="slide__description">
-                            <span v-for="item in textCases" style="display: none" v-show="textCases.length">
-                                <a class="cases" :href="item.link ? item.link : 'javascript:;'" :class="{'islink': item.link}">{{item.name}}{{item.opensource == 1 ? '(开源)' : ''}}</a>、
-                            </span>
-                            ...
-                        </p>
-                        <div class="examples__pr">
-                            <a class="button button--pr" href="https://github.com/wepyjs/wepy/edit/master/docs/data/cases.json" target="_blank"> 
-                                <strong style="font-size: 20px;">+</strong> 案例</a>
-                        </div> 
-                    </div>
-
-                    <!-- 应用案例 -->
-                    <div class="examples carousel">
-                        <a href="" target="_blank" class="example carousel-cell" v-for="item in rollCases" style="display: none" v-show="rollCases.length">
-                            <div class="example__inner">
-                                <h3 class="example__title" v-text="item.name"></h3>
-                                <div class="example__image" :style="{ backgroundImage: 'url(\'' + item.qr_code + '\')'}" ></div>
-                            </div>
-                        </a>
-                    </div>
-                    <div class="slide__footer"></div>
-                </div>
-            </div>
-        </div>
-    </div>
-    <div class="modal-container" :class="isQrShow ? 'active' : ''" @click="modalClick"> 
-            <div class="qr-modal">
-                <div style="padding: 10px;">
-                    我们是完全开源的，任何人都可以免费投稿。WePY 交流群已满500人，请加 gcaufy_helper 好友或者扫码加好友，验证回复 wepy 按照指引进群。
-                </div> 
-                <img style="width: 200px;" src="img/qrcode.png">
-            </div>
-    </div>
-</div>
-
-<div class="footer">
-    <div class="footer-inner">
-        <div class="footer--copyright">
-            Copyright © 2017 THL A29 Limited a Tencent company All rights reserved
-        </div>
-    </div>
-</div>
-<script src="js/flickity.pkgd.min.js"></script>
-<script src="js/prism.js"></script>
-<script src="https://unpkg.com/vue"></script>
-<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
-<script>
-  var app = new Vue({
-    el: '#app',
-    data: {
-      textCases: [],
-      rollCases: [],
-      isQrShow: false,
-      gists: [{
-        id: 1,
-        title: '原生代码 index.js',
-        lang: 'language-js',
-        style: '',
-        code: `
-import wepy from 'wepy';
-        
-export default class Index extends wepy.page {
-    getData() {
-      return new Promise((resolve, reject) => {
-        setTimeout(() => {
-          resolve({data: 123});
-        }, 3000);
-      });
-    };
-        
-    async onLoad () {
-      let data = await this.getData();
-      console.log(data.data);
-    };
-}`
-    }, {
-        id: 2,
-        title: `index.wpy 中的 <script> 部分`,
-        lang: 'language-js',
-        style: '',
-        code: `
-import wepy from 'wepy';
-        
-// 通过继承自wepy.page的类创建页面逻辑
-export default class Index extends wepy.page {
-    //可用于页面模板绑定的数据
-    data = {
-      motto: 'Hello World',
-      userInfo: {}
-    };
-     
-    //事件处理函数(集中保存在methods对象中)
-    methods = {
-      bindViewTap () {
-        console.log('button clicked');
-      }
-    };
-        
-    //页面的生命周期函数
-    onLoad () {
-      console.log('onLoad');
-    };
-}`
-    }, {
-        id: 3,
-        title: `支持ES6/7的一些新特性`,
-        lang: 'language-js',
-        style: '',
-        code: `
-import wepy from 'wepy';
-        
-export default class Index extends wepy.page {
-    getData() {
-      return new Promise((resolve, reject) => {
-        setTimeout(() => {
-          resolve({data: 123});
-        }, 3000);
-      });
-    };
-        
-    async onLoad () {
-      let data = await this.getData();
-      console.log(data.data);
-    };
-}`
-    }]
-    },
-    created: function () {
-      var self = this;
-      axios.get('./data/cases.json').then(function (res) {
-        if (res && res.data) {
-          self.rollCases = res.data.roll_cases;
-          self.textCases = res.data.text_cases;
-          Vue.nextTick(function () {
-            var flkty = new Flickity( '.carousel', {
-              initialIndex: 0,
-              cellAlign: 'left',
-              autoPlay: true,
-              pauseAutoPlayOnHover: true,
-              autoPlay: 1500,
-              pageDots: false,
-              wrapAround: true
-            });
-          });
-        }
-      });
-    },
-    methods: {
-        wxEnter: function () {
-            this.isQrShow = true
-        },
-        modalClick: function () {
-            this.isQrShow = false
-        },
-        codeEnter: function (item, $evt) {
-            switch (item.id) {
-                case 1: {
-                  item.style = 'z-index: 3; transform: scale(1) translate(-95%, 0%); transform-origin: 0% 0%; font-weight: 500;'
-                  break;
-                }
-                case 3: {
-                  item.style = 'z-index: 3; transform: scale(1) translate(120%, 0%); transform-origin: 100% 0%; font-weight: 500;'
-                  break;
-                }
-            }
-        },
-        codeLeave: function (item) {
-          item.style = 'z-index: -1;'
-        }
-    }
-  });
-
-</script>
-<script>
-var _hmt = _hmt || [];
-(function() {
-  var hm = document.createElement("script");
-  hm.src = "https://hm.baidu.com/hm.js?14c98a4c2ac48bfa7a4c6e9bf797d125";
-  var s = document.getElementsByTagName("script")[0]; 
-  s.parentNode.insertBefore(hm, s);
-})();
-</script>
-
-</body>
-</html>
diff --git a/docs/js/anime.min.js b/docs/js/anime.min.js
deleted file mode 100644
index b4f295084..000000000
--- a/docs/js/anime.min.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- 2017 Julian Garnier
- Released under the MIT license
-*/
-var $jscomp$this=this;
-(function(u,r){"function"===typeof define&&define.amd?define([],r):"object"===typeof module&&module.exports?module.exports=r():u.anime=r()})(this,function(){function u(a){if(!g.col(a))try{return document.querySelectorAll(a)}catch(b){}}function r(a){return a.reduce(function(a,c){return a.concat(g.arr(c)?r(c):c)},[])}function v(a){if(g.arr(a))return a;g.str(a)&&(a=u(a)||a);return a instanceof NodeList||a instanceof HTMLCollection?[].slice.call(a):[a]}function E(a,b){return a.some(function(a){return a===b})}
-function z(a){var b={},c;for(c in a)b[c]=a[c];return b}function F(a,b){var c=z(a),d;for(d in a)c[d]=b.hasOwnProperty(d)?b[d]:a[d];return c}function A(a,b){var c=z(a),d;for(d in b)c[d]=g.und(a[d])?b[d]:a[d];return c}function R(a){a=a.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,function(a,b,c,h){return b+b+c+c+h+h});var b=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(a);a=parseInt(b[1],16);var c=parseInt(b[2],16),b=parseInt(b[3],16);return"rgb("+a+","+c+","+b+")"}function S(a){function b(a,b,c){0>
-c&&(c+=1);1<c&&--c;return c<1/6?a+6*(b-a)*c:.5>c?b:c<2/3?a+(b-a)*(2/3-c)*6:a}var c=/hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.exec(a);a=parseInt(c[1])/360;var d=parseInt(c[2])/100,c=parseInt(c[3])/100;if(0==d)d=c=a=c;else{var e=.5>c?c*(1+d):c+d-c*d,k=2*c-e,d=b(k,e,a+1/3),c=b(k,e,a);a=b(k,e,a-1/3)}return"rgb("+255*d+","+255*c+","+255*a+")"}function w(a){if(a=/([\+\-]?[0-9#\.]+)(%|px|pt|em|rem|in|cm|mm|ex|pc|vw|vh|deg|rad|turn)?/.exec(a))return a[2]}function T(a){if(-1<a.indexOf("translate"))return"px";
-if(-1<a.indexOf("rotate")||-1<a.indexOf("skew"))return"deg"}function G(a,b){return g.fnc(a)?a(b.target,b.id,b.total):a}function B(a,b){if(b in a.style)return getComputedStyle(a).getPropertyValue(b.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase())||"0"}function H(a,b){if(g.dom(a)&&E(U,b))return"transform";if(g.dom(a)&&(a.getAttribute(b)||g.svg(a)&&a[b]))return"attribute";if(g.dom(a)&&"transform"!==b&&B(a,b))return"css";if(null!=a[b])return"object"}function V(a,b){var c=T(b),c=-1<b.indexOf("scale")?
-1:0+c;a=a.style.transform;if(!a)return c;for(var d=[],e=[],k=[],h=/(\w+)\((.+?)\)/g;d=h.exec(a);)e.push(d[1]),k.push(d[2]);a=k.filter(function(a,c){return e[c]===b});return a.length?a[0]:c}function I(a,b){switch(H(a,b)){case "transform":return V(a,b);case "css":return B(a,b);case "attribute":return a.getAttribute(b)}return a[b]||0}function J(a,b){var c=/^(\*=|\+=|-=)/.exec(a);if(!c)return a;b=parseFloat(b);a=parseFloat(a.replace(c[0],""));switch(c[0][0]){case "+":return b+a;case "-":return b-a;case "*":return b*
-a}}function C(a){return g.obj(a)&&a.hasOwnProperty("totalLength")}function W(a,b){function c(c){c=void 0===c?0:c;return a.el.getPointAtLength(1<=b+c?b+c:0)}var d=c(),e=c(-1),k=c(1);switch(a.property){case "x":return d.x;case "y":return d.y;case "angle":return 180*Math.atan2(k.y-e.y,k.x-e.x)/Math.PI}}function K(a,b){var c=/-?\d*\.?\d+/g;a=C(a)?a.totalLength:a;if(g.col(a))b=g.rgb(a)?a:g.hex(a)?R(a):g.hsl(a)?S(a):void 0;else{var d=w(a);a=d?a.substr(0,a.length-d.length):a;b=b?a+b:a}b+="";return{original:b,
-numbers:b.match(c)?b.match(c).map(Number):[0],strings:b.split(c)}}function X(a,b){return b.reduce(function(b,d,e){return b+a[e-1]+d})}function L(a){return(a?r(g.arr(a)?a.map(v):v(a)):[]).filter(function(a,c,d){return d.indexOf(a)===c})}function Y(a){var b=L(a);return b.map(function(a,d){return{target:a,id:d,total:b.length}})}function Z(a,b){var c=z(b);if(g.arr(a)){var d=a.length;2!==d||g.obj(a[0])?g.fnc(b.duration)||(c.duration=b.duration/d):a={value:a}}return v(a).map(function(a,c){c=c?0:b.delay;
-a=g.obj(a)&&!C(a)?a:{value:a};g.und(a.delay)&&(a.delay=c);return a}).map(function(a){return A(a,c)})}function aa(a,b){var c={},d;for(d in a){var e=G(a[d],b);g.arr(e)&&(e=e.map(function(a){return G(a,b)}),1===e.length&&(e=e[0]));c[d]=e}c.duration=parseFloat(c.duration);c.delay=parseFloat(c.delay);return c}function ba(a){return g.arr(a)?x.apply(this,a):M[a]}function ca(a,b){var c;return a.tweens.map(function(d){d=aa(d,b);var e=d.value,k=I(b.target,a.name),h=c?c.to.original:k,h=g.arr(e)?e[0]:h,n=J(g.arr(e)?
-e[1]:e,h),k=w(n)||w(h)||w(k);d.isPath=C(e);d.from=K(h,k);d.to=K(n,k);d.start=c?c.end:a.offset;d.end=d.start+d.delay+d.duration;d.easing=ba(d.easing);d.elasticity=(1E3-Math.min(Math.max(d.elasticity,1),999))/1E3;g.col(d.from.original)&&(d.round=1);return c=d})}function da(a,b){return r(a.map(function(a){return b.map(function(b){var c=H(a.target,b.name);if(c){var d=ca(b,a);b={type:c,property:b.name,animatable:a,tweens:d,duration:d[d.length-1].end,delay:d[0].delay}}else b=void 0;return b})})).filter(function(a){return!g.und(a)})}
-function N(a,b,c){var d="delay"===a?Math.min:Math.max;return b.length?d.apply(Math,b.map(function(b){return b[a]})):c[a]}function ea(a){var b=F(fa,a),c=F(ga,a),d=Y(a.targets),e=[],g=A(b,c),h;for(h in a)g.hasOwnProperty(h)||"targets"===h||e.push({name:h,offset:g.offset,tweens:Z(a[h],c)});a=da(d,e);return A(b,{animatables:d,animations:a,duration:N("duration",a,c),delay:N("delay",a,c)})}function m(a){function b(){return window.Promise&&new Promise(function(a){return P=a})}function c(a){return f.reversed?
-f.duration-a:a}function d(a){for(var b=0,c={},d=f.animations,e={};b<d.length;){var g=d[b],h=g.animatable,n=g.tweens;e.tween=n.filter(function(b){return a<b.end})[0]||n[n.length-1];e.isPath$0=e.tween.isPath;e.round=e.tween.round;e.eased=e.tween.easing(Math.min(Math.max(a-e.tween.start-e.tween.delay,0),e.tween.duration)/e.tween.duration,e.tween.elasticity);n=X(e.tween.to.numbers.map(function(a){return function(b,c){c=a.isPath$0?0:a.tween.from.numbers[c];b=c+a.eased*(b-c);a.isPath$0&&(b=W(a.tween.value,
-b));a.round&&(b=Math.round(b*a.round)/a.round);return b}}(e)),e.tween.to.strings);ha[g.type](h.target,g.property,n,c,h.id);g.currentValue=n;b++;e={isPath$0:e.isPath$0,tween:e.tween,eased:e.eased,round:e.round}}if(c)for(var k in c)D||(D=B(document.body,"transform")?"transform":"-webkit-transform"),f.animatables[k].target.style[D]=c[k].join(" ");f.currentTime=a;f.progress=a/f.duration*100}function e(a){if(f[a])f[a](f)}function g(){f.remaining&&!0!==f.remaining&&f.remaining--}function h(a){var h=f.duration,
-k=f.offset,m=f.delay,O=f.currentTime,p=f.reversed,q=c(a),q=Math.min(Math.max(q,0),h);q>k&&q<h?(d(q),!f.began&&q>=m&&(f.began=!0,e("begin")),e("run")):(q<=k&&0!==O&&(d(0),p&&g()),q>=h&&O!==h&&(d(h),p||g()));a>=h&&(f.remaining?(t=n,"alternate"===f.direction&&(f.reversed=!f.reversed)):(f.pause(),P(),Q=b(),f.completed||(f.completed=!0,e("complete"))),l=0);if(f.children)for(a=f.children,h=0;h<a.length;h++)a[h].seek(q);e("update")}a=void 0===a?{}:a;var n,t,l=0,P=null,Q=b(),f=ea(a);f.reset=function(){var a=
-f.direction,b=f.loop;f.currentTime=0;f.progress=0;f.paused=!0;f.began=!1;f.completed=!1;f.reversed="reverse"===a;f.remaining="alternate"===a&&1===b?2:b};f.tick=function(a){n=a;t||(t=n);h((l+n-t)*m.speed)};f.seek=function(a){h(c(a))};f.pause=function(){var a=p.indexOf(f);-1<a&&p.splice(a,1);f.paused=!0};f.play=function(){f.paused&&(f.paused=!1,t=0,l=f.completed?0:c(f.currentTime),p.push(f),y||ia())};f.reverse=function(){f.reversed=!f.reversed;t=0;l=c(f.currentTime)};f.restart=function(){f.pause();
-f.reset();f.play()};f.finished=Q;f.reset();f.autoplay&&f.play();return f}var fa={update:void 0,begin:void 0,run:void 0,complete:void 0,loop:1,direction:"normal",autoplay:!0,offset:0},ga={duration:1E3,delay:0,easing:"easeOutElastic",elasticity:500,round:0},U="translateX translateY translateZ rotate rotateX rotateY rotateZ scale scaleX scaleY scaleZ skewX skewY".split(" "),D,g={arr:function(a){return Array.isArray(a)},obj:function(a){return-1<Object.prototype.toString.call(a).indexOf("Object")},svg:function(a){return a instanceof
-SVGElement},dom:function(a){return a.nodeType||g.svg(a)},str:function(a){return"string"===typeof a},fnc:function(a){return"function"===typeof a},und:function(a){return"undefined"===typeof a},hex:function(a){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(a)},rgb:function(a){return/^rgb/.test(a)},hsl:function(a){return/^hsl/.test(a)},col:function(a){return g.hex(a)||g.rgb(a)||g.hsl(a)}},x=function(){function a(a,c,d){return(((1-3*d+3*c)*a+(3*d-6*c))*a+3*c)*a}return function(b,c,d,e){if(0<=b&&1>=b&&
-0<=d&&1>=d){var g=new Float32Array(11);if(b!==c||d!==e)for(var h=0;11>h;++h)g[h]=a(.1*h,b,d);return function(h){if(b===c&&d===e)return h;if(0===h)return 0;if(1===h)return 1;for(var k=0,l=1;10!==l&&g[l]<=h;++l)k+=.1;--l;var l=k+(h-g[l])/(g[l+1]-g[l])*.1,n=3*(1-3*d+3*b)*l*l+2*(3*d-6*b)*l+3*b;if(.001<=n){for(k=0;4>k;++k){n=3*(1-3*d+3*b)*l*l+2*(3*d-6*b)*l+3*b;if(0===n)break;var m=a(l,b,d)-h,l=l-m/n}h=l}else if(0===n)h=l;else{var l=k,k=k+.1,f=0;do m=l+(k-l)/2,n=a(m,b,d)-h,0<n?k=m:l=m;while(1e-7<Math.abs(n)&&
-10>++f);h=m}return a(h,c,e)}}}}(),M=function(){function a(a,b){return 0===a||1===a?a:-Math.pow(2,10*(a-1))*Math.sin(2*(a-1-b/(2*Math.PI)*Math.asin(1))*Math.PI/b)}var b="Quad Cubic Quart Quint Sine Expo Circ Back Elastic".split(" "),c={In:[[.55,.085,.68,.53],[.55,.055,.675,.19],[.895,.03,.685,.22],[.755,.05,.855,.06],[.47,0,.745,.715],[.95,.05,.795,.035],[.6,.04,.98,.335],[.6,-.28,.735,.045],a],Out:[[.25,.46,.45,.94],[.215,.61,.355,1],[.165,.84,.44,1],[.23,1,.32,1],[.39,.575,.565,1],[.19,1,.22,1],
-[.075,.82,.165,1],[.175,.885,.32,1.275],function(b,c){return 1-a(1-b,c)}],InOut:[[.455,.03,.515,.955],[.645,.045,.355,1],[.77,0,.175,1],[.86,0,.07,1],[.445,.05,.55,.95],[1,0,0,1],[.785,.135,.15,.86],[.68,-.55,.265,1.55],function(b,c){return.5>b?a(2*b,c)/2:1-a(-2*b+2,c)/2}]},d={linear:x(.25,.25,.75,.75)},e={},k;for(k in c)e.type=k,c[e.type].forEach(function(a){return function(c,e){d["ease"+a.type+b[e]]=g.fnc(c)?c:x.apply($jscomp$this,c)}}(e)),e={type:e.type};return d}(),ha={css:function(a,b,c){return a.style[b]=
-c},attribute:function(a,b,c){return a.setAttribute(b,c)},object:function(a,b,c){return a[b]=c},transform:function(a,b,c,d,e){d[e]||(d[e]=[]);d[e].push(b+"("+c+")")}},p=[],y=0,ia=function(){function a(){y=requestAnimationFrame(b)}function b(b){var c=p.length;if(c){for(var e=0;e<c;)p[e]&&p[e].tick(b),e++;a()}else cancelAnimationFrame(y),y=0}return a}();m.version="2.0.1";m.speed=1;m.running=p;m.remove=function(a){a=L(a);for(var b=p.length-1;0<=b;b--)for(var c=p[b],d=c.animations,e=d.length-1;0<=e;e--)E(a,
-d[e].animatable.target)&&(d.splice(e,1),d.length||c.pause())};m.getValue=I;m.path=function(a,b){var c=g.str(a)?u(a)[0]:a,d=b||100;return function(a){return{el:c,property:a,totalLength:c.getTotalLength()*(d/100)}}};m.setDashoffset=function(a){var b=a.getTotalLength();a.setAttribute("stroke-dasharray",b);return b};m.bezier=x;m.easings=M;m.timeline=function(a){var b=m(a);b.duration=0;b.children=[];b.add=function(a){v(a).forEach(function(a){var c=a.offset,d=b.duration;a.autoplay=!1;a.offset=g.und(c)?
-d:J(c,d);a=m(a);a.duration>d&&(b.duration=a.duration);b.children.push(a)});return b};return b};m.random=function(a,b){return Math.floor(Math.random()*(b-a+1))+a};return m});
\ No newline at end of file
diff --git a/docs/js/charming.min.js b/docs/js/charming.min.js
deleted file mode 100644
index 81900b7c7..000000000
--- a/docs/js/charming.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e){"undefined"==typeof module?this.charming=e:module.exports=e}(function(e,n){"use strict";n=n||{};var t=n.tagName||"span",o=null!=n.classPrefix?n.classPrefix:"char",r=1,a=function(e){for(var n=e.parentNode,a=e.nodeValue,c=a.length,l=-1;++l<c;){var d=document.createElement(t);o&&(d.className=o+r,r++),d.appendChild(document.createTextNode(a[l])),n.insertBefore(d,e)}n.removeChild(e)};return function c(e){for(var n=[].slice.call(e.childNodes),t=n.length,o=-1;++o<t;)c(n[o]);e.nodeType===Node.TEXT_NODE&&a(e)}(e),e});
\ No newline at end of file
diff --git a/docs/js/flickity.pkgd.min.js b/docs/js/flickity.pkgd.min.js
deleted file mode 100644
index 6af899452..000000000
--- a/docs/js/flickity.pkgd.min.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/*!
- * Flickity PACKAGED v2.0.10
- * Touch, responsive, flickable carousels
- *
- * Licensed GPLv3 for open source use
- * or Flickity Commercial License for commercial use
- *
- * http://flickity.metafizzy.co
- * Copyright 2017 Metafizzy
- */
-
-!function(t,e){"function"==typeof define&&define.amd?define("jquery-bridget/jquery-bridget",["jquery"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("jquery")):t.jQueryBridget=e(t,t.jQuery)}(window,function(t,e){"use strict";function i(i,o,a){function h(t,e,n){var s,o="$()."+i+'("'+e+'")';return t.each(function(t,h){var l=a.data(h,i);if(!l)return void r(i+" not initialized. Cannot call methods, i.e. "+o);var c=l[e];if(!c||"_"==e.charAt(0))return void r(o+" is not a valid method");var d=c.apply(l,n);s=void 0===s?d:s}),void 0!==s?s:t}function l(t,e){t.each(function(t,n){var s=a.data(n,i);s?(s.option(e),s._init()):(s=new o(n,e),a.data(n,i,s))})}a=a||e||t.jQuery,a&&(o.prototype.option||(o.prototype.option=function(t){a.isPlainObject(t)&&(this.options=a.extend(!0,this.options,t))}),a.fn[i]=function(t){if("string"==typeof t){var e=s.call(arguments,1);return h(this,t,e)}return l(this,t),this},n(a))}function n(t){!t||t&&t.bridget||(t.bridget=i)}var s=Array.prototype.slice,o=t.console,r="undefined"==typeof o?function(){}:function(t){o.error(t)};return n(e||t.jQuery),i}),function(t,e){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",e):"object"==typeof module&&module.exports?module.exports=e():t.EvEmitter=e()}("undefined"!=typeof window?window:this,function(){function t(){}var e=t.prototype;return e.on=function(t,e){if(t&&e){var i=this._events=this._events||{},n=i[t]=i[t]||[];return n.indexOf(e)==-1&&n.push(e),this}},e.once=function(t,e){if(t&&e){this.on(t,e);var i=this._onceEvents=this._onceEvents||{},n=i[t]=i[t]||{};return n[e]=!0,this}},e.off=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){var n=i.indexOf(e);return n!=-1&&i.splice(n,1),this}},e.emitEvent=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){i=i.slice(0),e=e||[];for(var n=this._onceEvents&&this._onceEvents[t],s=0;s<i.length;s++){var o=i[s],r=n&&n[o];r&&(this.off(t,o),delete n[o]),o.apply(this,e)}return this}},e.allOff=function(){delete this._events,delete this._onceEvents},t}),function(t,e){"use strict";"function"==typeof define&&define.amd?define("get-size/get-size",[],function(){return e()}):"object"==typeof module&&module.exports?module.exports=e():t.getSize=e()}(window,function(){"use strict";function t(t){var e=parseFloat(t),i=t.indexOf("%")==-1&&!isNaN(e);return i&&e}function e(){}function i(){for(var t={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0},e=0;e<l;e++){var i=h[e];t[i]=0}return t}function n(t){var e=getComputedStyle(t);return e||a("Style returned "+e+". Are you running this code in a hidden iframe on Firefox? See http://bit.ly/getsizebug1"),e}function s(){if(!c){c=!0;var e=document.createElement("div");e.style.width="200px",e.style.padding="1px 2px 3px 4px",e.style.borderStyle="solid",e.style.borderWidth="1px 2px 3px 4px",e.style.boxSizing="border-box";var i=document.body||document.documentElement;i.appendChild(e);var s=n(e);o.isBoxSizeOuter=r=200==t(s.width),i.removeChild(e)}}function o(e){if(s(),"string"==typeof e&&(e=document.querySelector(e)),e&&"object"==typeof e&&e.nodeType){var o=n(e);if("none"==o.display)return i();var a={};a.width=e.offsetWidth,a.height=e.offsetHeight;for(var c=a.isBorderBox="border-box"==o.boxSizing,d=0;d<l;d++){var u=h[d],f=o[u],p=parseFloat(f);a[u]=isNaN(p)?0:p}var v=a.paddingLeft+a.paddingRight,g=a.paddingTop+a.paddingBottom,m=a.marginLeft+a.marginRight,y=a.marginTop+a.marginBottom,E=a.borderLeftWidth+a.borderRightWidth,S=a.borderTopWidth+a.borderBottomWidth,b=c&&r,x=t(o.width);x!==!1&&(a.width=x+(b?0:v+E));var C=t(o.height);return C!==!1&&(a.height=C+(b?0:g+S)),a.innerWidth=a.width-(v+E),a.innerHeight=a.height-(g+S),a.outerWidth=a.width+m,a.outerHeight=a.height+y,a}}var r,a="undefined"==typeof console?e:function(t){console.error(t)},h=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"],l=h.length,c=!1;return o}),function(t,e){"use strict";"function"==typeof define&&define.amd?define("desandro-matches-selector/matches-selector",e):"object"==typeof module&&module.exports?module.exports=e():t.matchesSelector=e()}(window,function(){"use strict";var t=function(){var t=window.Element.prototype;if(t.matches)return"matches";if(t.matchesSelector)return"matchesSelector";for(var e=["webkit","moz","ms","o"],i=0;i<e.length;i++){var n=e[i],s=n+"MatchesSelector";if(t[s])return s}}();return function(e,i){return e[t](i)}}),function(t,e){"function"==typeof define&&define.amd?define("fizzy-ui-utils/utils",["desandro-matches-selector/matches-selector"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("desandro-matches-selector")):t.fizzyUIUtils=e(t,t.matchesSelector)}(window,function(t,e){var i={};i.extend=function(t,e){for(var i in e)t[i]=e[i];return t},i.modulo=function(t,e){return(t%e+e)%e},i.makeArray=function(t){var e=[];if(Array.isArray(t))e=t;else if(t&&"object"==typeof t&&"number"==typeof t.length)for(var i=0;i<t.length;i++)e.push(t[i]);else e.push(t);return e},i.removeFrom=function(t,e){var i=t.indexOf(e);i!=-1&&t.splice(i,1)},i.getParent=function(t,i){for(;t.parentNode&&t!=document.body;)if(t=t.parentNode,e(t,i))return t},i.getQueryElement=function(t){return"string"==typeof t?document.querySelector(t):t},i.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},i.filterFindElements=function(t,n){t=i.makeArray(t);var s=[];return t.forEach(function(t){if(t instanceof HTMLElement){if(!n)return void s.push(t);e(t,n)&&s.push(t);for(var i=t.querySelectorAll(n),o=0;o<i.length;o++)s.push(i[o])}}),s},i.debounceMethod=function(t,e,i){var n=t.prototype[e],s=e+"Timeout";t.prototype[e]=function(){var t=this[s];t&&clearTimeout(t);var e=arguments,o=this;this[s]=setTimeout(function(){n.apply(o,e),delete o[s]},i||100)}},i.docReady=function(t){var e=document.readyState;"complete"==e||"interactive"==e?setTimeout(t):document.addEventListener("DOMContentLoaded",t)},i.toDashed=function(t){return t.replace(/(.)([A-Z])/g,function(t,e,i){return e+"-"+i}).toLowerCase()};var n=t.console;return i.htmlInit=function(e,s){i.docReady(function(){var o=i.toDashed(s),r="data-"+o,a=document.querySelectorAll("["+r+"]"),h=document.querySelectorAll(".js-"+o),l=i.makeArray(a).concat(i.makeArray(h)),c=r+"-options",d=t.jQuery;l.forEach(function(t){var i,o=t.getAttribute(r)||t.getAttribute(c);try{i=o&&JSON.parse(o)}catch(a){return void(n&&n.error("Error parsing "+r+" on "+t.className+": "+a))}var h=new e(t,i);d&&d.data(t,s,h)})})},i}),function(t,e){"function"==typeof define&&define.amd?define("flickity/js/cell",["get-size/get-size"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("get-size")):(t.Flickity=t.Flickity||{},t.Flickity.Cell=e(t,t.getSize))}(window,function(t,e){function i(t,e){this.element=t,this.parent=e,this.create()}var n=i.prototype;return n.create=function(){this.element.style.position="absolute",this.x=0,this.shift=0},n.destroy=function(){this.element.style.position="";var t=this.parent.originSide;this.element.style[t]=""},n.getSize=function(){this.size=e(this.element)},n.setPosition=function(t){this.x=t,this.updateTarget(),this.renderPosition(t)},n.updateTarget=n.setDefaultTarget=function(){var t="left"==this.parent.originSide?"marginLeft":"marginRight";this.target=this.x+this.size[t]+this.size.width*this.parent.cellAlign},n.renderPosition=function(t){var e=this.parent.originSide;this.element.style[e]=this.parent.getPositionValue(t)},n.wrapShift=function(t){this.shift=t,this.renderPosition(this.x+this.parent.slideableWidth*t)},n.remove=function(){this.element.parentNode.removeChild(this.element)},i}),function(t,e){"function"==typeof define&&define.amd?define("flickity/js/slide",e):"object"==typeof module&&module.exports?module.exports=e():(t.Flickity=t.Flickity||{},t.Flickity.Slide=e())}(window,function(){"use strict";function t(t){this.parent=t,this.isOriginLeft="left"==t.originSide,this.cells=[],this.outerWidth=0,this.height=0}var e=t.prototype;return e.addCell=function(t){if(this.cells.push(t),this.outerWidth+=t.size.outerWidth,this.height=Math.max(t.size.outerHeight,this.height),1==this.cells.length){this.x=t.x;var e=this.isOriginLeft?"marginLeft":"marginRight";this.firstMargin=t.size[e]}},e.updateTarget=function(){var t=this.isOriginLeft?"marginRight":"marginLeft",e=this.getLastCell(),i=e?e.size[t]:0,n=this.outerWidth-(this.firstMargin+i);this.target=this.x+this.firstMargin+n*this.parent.cellAlign},e.getLastCell=function(){return this.cells[this.cells.length-1]},e.select=function(){this.changeSelectedClass("add")},e.unselect=function(){this.changeSelectedClass("remove")},e.changeSelectedClass=function(t){this.cells.forEach(function(e){e.element.classList[t]("is-selected")})},e.getCellElements=function(){return this.cells.map(function(t){return t.element})},t}),function(t,e){"function"==typeof define&&define.amd?define("flickity/js/animate",["fizzy-ui-utils/utils"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("fizzy-ui-utils")):(t.Flickity=t.Flickity||{},t.Flickity.animatePrototype=e(t,t.fizzyUIUtils))}(window,function(t,e){var i=t.requestAnimationFrame||t.webkitRequestAnimationFrame,n=0;i||(i=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-n)),s=setTimeout(t,i);return n=e+i,s});var s={};s.startAnimation=function(){this.isAnimating||(this.isAnimating=!0,this.restingFrames=0,this.animate())},s.animate=function(){this.applyDragForce(),this.applySelectedAttraction();var t=this.x;if(this.integratePhysics(),this.positionSlider(),this.settle(t),this.isAnimating){var e=this;i(function(){e.animate()})}};var o=function(){var t=document.documentElement.style;return"string"==typeof t.transform?"transform":"WebkitTransform"}();return s.positionSlider=function(){var t=this.x;this.options.wrapAround&&this.cells.length>1&&(t=e.modulo(t,this.slideableWidth),t-=this.slideableWidth,this.shiftWrapCells(t)),t+=this.cursorPosition,t=this.options.rightToLeft&&o?-t:t;var i=this.getPositionValue(t);this.slider.style[o]=this.isAnimating?"translate3d("+i+",0,0)":"translateX("+i+")";var n=this.slides[0];if(n){var s=-this.x-n.target,r=s/this.slidesWidth;this.dispatchEvent("scroll",null,[r,s])}},s.positionSliderAtSelected=function(){this.cells.length&&(this.x=-this.selectedSlide.target,this.positionSlider())},s.getPositionValue=function(t){return this.options.percentPosition?.01*Math.round(t/this.size.innerWidth*1e4)+"%":Math.round(t)+"px"},s.settle=function(t){this.isPointerDown||Math.round(100*this.x)!=Math.round(100*t)||this.restingFrames++,this.restingFrames>2&&(this.isAnimating=!1,delete this.isFreeScrolling,this.positionSlider(),this.dispatchEvent("settle"))},s.shiftWrapCells=function(t){var e=this.cursorPosition+t;this._shiftCells(this.beforeShiftCells,e,-1);var i=this.size.innerWidth-(t+this.slideableWidth+this.cursorPosition);this._shiftCells(this.afterShiftCells,i,1)},s._shiftCells=function(t,e,i){for(var n=0;n<t.length;n++){var s=t[n],o=e>0?i:0;s.wrapShift(o),e-=s.size.outerWidth}},s._unshiftCells=function(t){if(t&&t.length)for(var e=0;e<t.length;e++)t[e].wrapShift(0)},s.integratePhysics=function(){this.x+=this.velocity,this.velocity*=this.getFrictionFactor()},s.applyForce=function(t){this.velocity+=t},s.getFrictionFactor=function(){return 1-this.options[this.isFreeScrolling?"freeScrollFriction":"friction"]},s.getRestingPosition=function(){return this.x+this.velocity/(1-this.getFrictionFactor())},s.applyDragForce=function(){if(this.isPointerDown){var t=this.dragX-this.x,e=t-this.velocity;this.applyForce(e)}},s.applySelectedAttraction=function(){if(!this.isPointerDown&&!this.isFreeScrolling&&this.cells.length){var t=this.selectedSlide.target*-1-this.x,e=t*this.options.selectedAttraction;this.applyForce(e)}},s}),function(t,e){if("function"==typeof define&&define.amd)define("flickity/js/flickity",["ev-emitter/ev-emitter","get-size/get-size","fizzy-ui-utils/utils","./cell","./slide","./animate"],function(i,n,s,o,r,a){return e(t,i,n,s,o,r,a)});else if("object"==typeof module&&module.exports)module.exports=e(t,require("ev-emitter"),require("get-size"),require("fizzy-ui-utils"),require("./cell"),require("./slide"),require("./animate"));else{var i=t.Flickity;t.Flickity=e(t,t.EvEmitter,t.getSize,t.fizzyUIUtils,i.Cell,i.Slide,i.animatePrototype)}}(window,function(t,e,i,n,s,o,r){function a(t,e){for(t=n.makeArray(t);t.length;)e.appendChild(t.shift())}function h(t,e){var i=n.getQueryElement(t);if(!i)return void(d&&d.error("Bad element for Flickity: "+(i||t)));if(this.element=i,this.element.flickityGUID){var s=f[this.element.flickityGUID];return s.option(e),s}l&&(this.$element=l(this.element)),this.options=n.extend({},this.constructor.defaults),this.option(e),this._create()}var l=t.jQuery,c=t.getComputedStyle,d=t.console,u=0,f={};h.defaults={accessibility:!0,cellAlign:"center",freeScrollFriction:.075,friction:.28,namespaceJQueryEvents:!0,percentPosition:!0,resize:!0,selectedAttraction:.025,setGallerySize:!0},h.createMethods=[];var p=h.prototype;n.extend(p,e.prototype),p._create=function(){var e=this.guid=++u;this.element.flickityGUID=e,f[e]=this,this.selectedIndex=0,this.restingFrames=0,this.x=0,this.velocity=0,this.originSide=this.options.rightToLeft?"right":"left",this.viewport=document.createElement("div"),this.viewport.className="flickity-viewport",this._createSlider(),(this.options.resize||this.options.watchCSS)&&t.addEventListener("resize",this),h.createMethods.forEach(function(t){this[t]()},this),this.options.watchCSS?this.watchCSS():this.activate()},p.option=function(t){n.extend(this.options,t)},p.activate=function(){if(!this.isActive){this.isActive=!0,this.element.classList.add("flickity-enabled"),this.options.rightToLeft&&this.element.classList.add("flickity-rtl"),this.getSize();var t=this._filterFindCellElements(this.element.children);a(t,this.slider),this.viewport.appendChild(this.slider),this.element.appendChild(this.viewport),this.reloadCells(),this.options.accessibility&&(this.element.tabIndex=0,this.element.addEventListener("keydown",this)),this.emitEvent("activate");var e,i=this.options.initialIndex;e=this.isInitActivated?this.selectedIndex:void 0!==i&&this.cells[i]?i:0,this.select(e,!1,!0),this.isInitActivated=!0}},p._createSlider=function(){var t=document.createElement("div");t.className="flickity-slider",t.style[this.originSide]=0,this.slider=t},p._filterFindCellElements=function(t){return n.filterFindElements(t,this.options.cellSelector)},p.reloadCells=function(){this.cells=this._makeCells(this.slider.children),this.positionCells(),this._getWrapShiftCells(),this.setGallerySize()},p._makeCells=function(t){var e=this._filterFindCellElements(t),i=e.map(function(t){return new s(t,this)},this);return i},p.getLastCell=function(){return this.cells[this.cells.length-1]},p.getLastSlide=function(){return this.slides[this.slides.length-1]},p.positionCells=function(){this._sizeCells(this.cells),this._positionCells(0)},p._positionCells=function(t){t=t||0,this.maxCellHeight=t?this.maxCellHeight||0:0;var e=0;if(t>0){var i=this.cells[t-1];e=i.x+i.size.outerWidth}for(var n=this.cells.length,s=t;s<n;s++){var o=this.cells[s];o.setPosition(e),e+=o.size.outerWidth,this.maxCellHeight=Math.max(o.size.outerHeight,this.maxCellHeight)}this.slideableWidth=e,this.updateSlides(),this._containSlides(),this.slidesWidth=n?this.getLastSlide().target-this.slides[0].target:0},p._sizeCells=function(t){t.forEach(function(t){t.getSize()})},p.updateSlides=function(){if(this.slides=[],this.cells.length){var t=new o(this);this.slides.push(t);var e="left"==this.originSide,i=e?"marginRight":"marginLeft",n=this._getCanCellFit();this.cells.forEach(function(e,s){if(!t.cells.length)return void t.addCell(e);var r=t.outerWidth-t.firstMargin+(e.size.outerWidth-e.size[i]);n.call(this,s,r)?t.addCell(e):(t.updateTarget(),t=new o(this),this.slides.push(t),t.addCell(e))},this),t.updateTarget(),this.updateSelectedSlide()}},p._getCanCellFit=function(){var t=this.options.groupCells;if(!t)return function(){return!1};if("number"==typeof t){var e=parseInt(t,10);return function(t){return t%e!==0}}var i="string"==typeof t&&t.match(/^(\d+)%$/),n=i?parseInt(i[1],10)/100:1;return function(t,e){return e<=(this.size.innerWidth+1)*n}},p._init=p.reposition=function(){this.positionCells(),this.positionSliderAtSelected()},p.getSize=function(){this.size=i(this.element),this.setCellAlign(),this.cursorPosition=this.size.innerWidth*this.cellAlign};var v={center:{left:.5,right:.5},left:{left:0,right:1},right:{right:0,left:1}};return p.setCellAlign=function(){var t=v[this.options.cellAlign];this.cellAlign=t?t[this.originSide]:this.options.cellAlign},p.setGallerySize=function(){if(this.options.setGallerySize){var t=this.options.adaptiveHeight&&this.selectedSlide?this.selectedSlide.height:this.maxCellHeight;this.viewport.style.height=t+"px"}},p._getWrapShiftCells=function(){if(this.options.wrapAround){this._unshiftCells(this.beforeShiftCells),this._unshiftCells(this.afterShiftCells);var t=this.cursorPosition,e=this.cells.length-1;this.beforeShiftCells=this._getGapCells(t,e,-1),t=this.size.innerWidth-this.cursorPosition,this.afterShiftCells=this._getGapCells(t,0,1)}},p._getGapCells=function(t,e,i){for(var n=[];t>0;){var s=this.cells[e];if(!s)break;n.push(s),e+=i,t-=s.size.outerWidth}return n},p._containSlides=function(){if(this.options.contain&&!this.options.wrapAround&&this.cells.length){var t=this.options.rightToLeft,e=t?"marginRight":"marginLeft",i=t?"marginLeft":"marginRight",n=this.slideableWidth-this.getLastCell().size[i],s=n<this.size.innerWidth,o=this.cursorPosition+this.cells[0].size[e],r=n-this.size.innerWidth*(1-this.cellAlign);this.slides.forEach(function(t){s?t.target=n*this.cellAlign:(t.target=Math.max(t.target,o),t.target=Math.min(t.target,r))},this)}},p.dispatchEvent=function(t,e,i){var n=e?[e].concat(i):i;if(this.emitEvent(t,n),l&&this.$element){t+=this.options.namespaceJQueryEvents?".flickity":"";var s=t;if(e){var o=l.Event(e);o.type=t,s=o}this.$element.trigger(s,i)}},p.select=function(t,e,i){this.isActive&&(t=parseInt(t,10),this._wrapSelect(t),(this.options.wrapAround||e)&&(t=n.modulo(t,this.slides.length)),this.slides[t]&&(this.selectedIndex=t,this.updateSelectedSlide(),i?this.positionSliderAtSelected():this.startAnimation(),this.options.adaptiveHeight&&this.setGallerySize(),this.dispatchEvent("select"),this.dispatchEvent("cellSelect")))},p._wrapSelect=function(t){var e=this.slides.length,i=this.options.wrapAround&&e>1;if(!i)return t;var s=n.modulo(t,e),o=Math.abs(s-this.selectedIndex),r=Math.abs(s+e-this.selectedIndex),a=Math.abs(s-e-this.selectedIndex);!this.isDragSelect&&r<o?t+=e:!this.isDragSelect&&a<o&&(t-=e),t<0?this.x-=this.slideableWidth:t>=e&&(this.x+=this.slideableWidth)},p.previous=function(t,e){this.select(this.selectedIndex-1,t,e)},p.next=function(t,e){this.select(this.selectedIndex+1,t,e)},p.updateSelectedSlide=function(){var t=this.slides[this.selectedIndex];t&&(this.unselectSelectedSlide(),this.selectedSlide=t,t.select(),this.selectedCells=t.cells,this.selectedElements=t.getCellElements(),this.selectedCell=t.cells[0],this.selectedElement=this.selectedElements[0])},p.unselectSelectedSlide=function(){this.selectedSlide&&this.selectedSlide.unselect()},p.selectCell=function(t,e,i){var n;"number"==typeof t?n=this.cells[t]:("string"==typeof t&&(t=this.element.querySelector(t)),n=this.getCell(t));for(var s=0;n&&s<this.slides.length;s++){var o=this.slides[s],r=o.cells.indexOf(n);if(r!=-1)return void this.select(s,e,i)}},p.getCell=function(t){for(var e=0;e<this.cells.length;e++){var i=this.cells[e];if(i.element==t)return i}},p.getCells=function(t){t=n.makeArray(t);var e=[];return t.forEach(function(t){var i=this.getCell(t);i&&e.push(i)},this),e},p.getCellElements=function(){return this.cells.map(function(t){return t.element})},p.getParentCell=function(t){var e=this.getCell(t);return e?e:(t=n.getParent(t,".flickity-slider > *"),this.getCell(t))},p.getAdjacentCellElements=function(t,e){if(!t)return this.selectedSlide.getCellElements();e=void 0===e?this.selectedIndex:e;var i=this.slides.length;if(1+2*t>=i)return this.getCellElements();for(var s=[],o=e-t;o<=e+t;o++){var r=this.options.wrapAround?n.modulo(o,i):o,a=this.slides[r];a&&(s=s.concat(a.getCellElements()))}return s},p.uiChange=function(){this.emitEvent("uiChange")},p.childUIPointerDown=function(t){this.emitEvent("childUIPointerDown",[t])},p.onresize=function(){this.watchCSS(),this.resize()},n.debounceMethod(h,"onresize",150),p.resize=function(){if(this.isActive){this.getSize(),this.options.wrapAround&&(this.x=n.modulo(this.x,this.slideableWidth)),this.positionCells(),this._getWrapShiftCells(),this.setGallerySize(),this.emitEvent("resize");var t=this.selectedElements&&this.selectedElements[0];this.selectCell(t,!1,!0)}},p.watchCSS=function(){var t=this.options.watchCSS;if(t){var e=c(this.element,":after").content;e.indexOf("flickity")!=-1?this.activate():this.deactivate()}},p.onkeydown=function(t){if(this.options.accessibility&&(!document.activeElement||document.activeElement==this.element))if(37==t.keyCode){var e=this.options.rightToLeft?"next":"previous";this.uiChange(),this[e]()}else if(39==t.keyCode){var i=this.options.rightToLeft?"previous":"next";this.uiChange(),this[i]()}},p.deactivate=function(){this.isActive&&(this.element.classList.remove("flickity-enabled"),this.element.classList.remove("flickity-rtl"),this.cells.forEach(function(t){t.destroy()}),this.unselectSelectedSlide(),this.element.removeChild(this.viewport),a(this.slider.children,this.element),this.options.accessibility&&(this.element.removeAttribute("tabIndex"),this.element.removeEventListener("keydown",this)),this.isActive=!1,this.emitEvent("deactivate"))},p.destroy=function(){this.deactivate(),t.removeEventListener("resize",this),this.emitEvent("destroy"),l&&this.$element&&l.removeData(this.element,"flickity"),delete this.element.flickityGUID,delete f[this.guid]},n.extend(p,r),h.data=function(t){t=n.getQueryElement(t);var e=t&&t.flickityGUID;return e&&f[e]},n.htmlInit(h,"flickity"),l&&l.bridget&&l.bridget("flickity",h),h.setJQuery=function(t){l=t},h.Cell=s,h}),function(t,e){"function"==typeof define&&define.amd?define("unipointer/unipointer",["ev-emitter/ev-emitter"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("ev-emitter")):t.Unipointer=e(t,t.EvEmitter)}(window,function(t,e){function i(){}function n(){}var s=n.prototype=Object.create(e.prototype);s.bindStartEvent=function(t){this._bindStartEvent(t,!0)},s.unbindStartEvent=function(t){this._bindStartEvent(t,!1)},s._bindStartEvent=function(e,i){i=void 0===i||!!i;var n=i?"addEventListener":"removeEventListener";t.PointerEvent?e[n]("pointerdown",this):(e[n]("mousedown",this),e[n]("touchstart",this))},s.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},s.getTouch=function(t){for(var e=0;e<t.length;e++){var i=t[e];if(i.identifier==this.pointerIdentifier)return i}},s.onmousedown=function(t){var e=t.button;e&&0!==e&&1!==e||this._pointerDown(t,t)},s.ontouchstart=function(t){this._pointerDown(t,t.changedTouches[0])},s.onpointerdown=function(t){this._pointerDown(t,t)},s._pointerDown=function(t,e){this.isPointerDown||(this.isPointerDown=!0,this.pointerIdentifier=void 0!==e.pointerId?e.pointerId:e.identifier,this.pointerDown(t,e))},s.pointerDown=function(t,e){this._bindPostStartEvents(t),this.emitEvent("pointerDown",[t,e])};var o={mousedown:["mousemove","mouseup"],touchstart:["touchmove","touchend","touchcancel"],pointerdown:["pointermove","pointerup","pointercancel"]};return s._bindPostStartEvents=function(e){if(e){var i=o[e.type];i.forEach(function(e){t.addEventListener(e,this)},this),this._boundPointerEvents=i}},s._unbindPostStartEvents=function(){this._boundPointerEvents&&(this._boundPointerEvents.forEach(function(e){t.removeEventListener(e,this)},this),delete this._boundPointerEvents)},s.onmousemove=function(t){this._pointerMove(t,t)},s.onpointermove=function(t){t.pointerId==this.pointerIdentifier&&this._pointerMove(t,t)},s.ontouchmove=function(t){var e=this.getTouch(t.changedTouches);e&&this._pointerMove(t,e)},s._pointerMove=function(t,e){this.pointerMove(t,e)},s.pointerMove=function(t,e){this.emitEvent("pointerMove",[t,e])},s.onmouseup=function(t){this._pointerUp(t,t)},s.onpointerup=function(t){t.pointerId==this.pointerIdentifier&&this._pointerUp(t,t)},s.ontouchend=function(t){var e=this.getTouch(t.changedTouches);e&&this._pointerUp(t,e)},s._pointerUp=function(t,e){this._pointerDone(),this.pointerUp(t,e)},s.pointerUp=function(t,e){this.emitEvent("pointerUp",[t,e])},s._pointerDone=function(){this.isPointerDown=!1,delete this.pointerIdentifier,this._unbindPostStartEvents(),this.pointerDone()},s.pointerDone=i,s.onpointercancel=function(t){t.pointerId==this.pointerIdentifier&&this._pointerCancel(t,t)},s.ontouchcancel=function(t){var e=this.getTouch(t.changedTouches);e&&this._pointerCancel(t,e)},s._pointerCancel=function(t,e){this._pointerDone(),this.pointerCancel(t,e)},s.pointerCancel=function(t,e){this.emitEvent("pointerCancel",[t,e])},n.getPointerPoint=function(t){return{x:t.pageX,y:t.pageY}},n}),function(t,e){"function"==typeof define&&define.amd?define("unidragger/unidragger",["unipointer/unipointer"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("unipointer")):t.Unidragger=e(t,t.Unipointer)}(window,function(t,e){function i(){}var n=i.prototype=Object.create(e.prototype);return n.bindHandles=function(){this._bindHandles(!0)},n.unbindHandles=function(){this._bindHandles(!1)},n._bindHandles=function(e){e=void 0===e||!!e;for(var i=e?"addEventListener":"removeEventListener",n=0;n<this.handles.length;n++){var s=this.handles[n];this._bindStartEvent(s,e),s[i]("click",this),t.PointerEvent&&(s.style.touchAction=e?this._touchActionValue:"")}},n._touchActionValue="none",n.pointerDown=function(t,e){if("INPUT"==t.target.nodeName&&"range"==t.target.type)return this.isPointerDown=!1,void delete this.pointerIdentifier;this._dragPointerDown(t,e);var i=document.activeElement;i&&i.blur&&i.blur(),this._bindPostStartEvents(t),this.emitEvent("pointerDown",[t,e])},n._dragPointerDown=function(t,i){this.pointerDownPoint=e.getPointerPoint(i);var n=this.canPreventDefaultOnPointerDown(t,i);n&&t.preventDefault()},n.canPreventDefaultOnPointerDown=function(t){return"SELECT"!=t.target.nodeName},n.pointerMove=function(t,e){var i=this._dragPointerMove(t,e);this.emitEvent("pointerMove",[t,e,i]),this._dragMove(t,e,i)},n._dragPointerMove=function(t,i){var n=e.getPointerPoint(i),s={x:n.x-this.pointerDownPoint.x,y:n.y-this.pointerDownPoint.y};return!this.isDragging&&this.hasDragStarted(s)&&this._dragStart(t,i),s},n.hasDragStarted=function(t){return Math.abs(t.x)>3||Math.abs(t.y)>3},n.pointerUp=function(t,e){this.emitEvent("pointerUp",[t,e]),this._dragPointerUp(t,e)},n._dragPointerUp=function(t,e){this.isDragging?this._dragEnd(t,e):this._staticClick(t,e)},n._dragStart=function(t,i){this.isDragging=!0,this.dragStartPoint=e.getPointerPoint(i),this.isPreventingClicks=!0,this.dragStart(t,i)},n.dragStart=function(t,e){this.emitEvent("dragStart",[t,e])},n._dragMove=function(t,e,i){this.isDragging&&this.dragMove(t,e,i)},n.dragMove=function(t,e,i){t.preventDefault(),this.emitEvent("dragMove",[t,e,i])},n._dragEnd=function(t,e){this.isDragging=!1,setTimeout(function(){delete this.isPreventingClicks}.bind(this)),this.dragEnd(t,e)},n.dragEnd=function(t,e){this.emitEvent("dragEnd",[t,e])},n.onclick=function(t){this.isPreventingClicks&&t.preventDefault()},n._staticClick=function(t,e){if(!this.isIgnoringMouseUp||"mouseup"!=t.type){var i=t.target.nodeName;"INPUT"!=i&&"TEXTAREA"!=i||t.target.focus(),this.staticClick(t,e),"mouseup"!=t.type&&(this.isIgnoringMouseUp=!0,setTimeout(function(){delete this.isIgnoringMouseUp}.bind(this),400))}},n.staticClick=function(t,e){this.emitEvent("staticClick",[t,e])},i.getPointerPoint=e.getPointerPoint,i}),function(t,e){"function"==typeof define&&define.amd?define("flickity/js/drag",["./flickity","unidragger/unidragger","fizzy-ui-utils/utils"],function(i,n,s){return e(t,i,n,s)}):"object"==typeof module&&module.exports?module.exports=e(t,require("./flickity"),require("unidragger"),require("fizzy-ui-utils")):t.Flickity=e(t,t.Flickity,t.Unidragger,t.fizzyUIUtils)}(window,function(t,e,i,n){function s(t){var e="touchstart"==t.type,i="touch"==t.pointerType,n=d[t.target.nodeName];return e||i||n}function o(){return{x:t.pageXOffset,y:t.pageYOffset}}n.extend(e.defaults,{draggable:!0,dragThreshold:3}),e.createMethods.push("_createDrag");var r=e.prototype;n.extend(r,i.prototype),r._touchActionValue="pan-y";var a="createTouch"in document,h=!1;r._createDrag=function(){this.on("activate",this.bindDrag),this.on("uiChange",this._uiChangeDrag),this.on("childUIPointerDown",this._childUIPointerDownDrag),this.on("deactivate",this.unbindDrag),a&&!h&&(t.addEventListener("touchmove",function(){}),h=!0)},r.bindDrag=function(){this.options.draggable&&!this.isDragBound&&(this.element.classList.add("is-draggable"),this.handles=[this.viewport],this.bindHandles(),this.isDragBound=!0)},r.unbindDrag=function(){this.isDragBound&&(this.element.classList.remove("is-draggable"),this.unbindHandles(),delete this.isDragBound)},r._uiChangeDrag=function(){delete this.isFreeScrolling},r._childUIPointerDownDrag=function(t){t.preventDefault(),this.pointerDownFocus(t)};var l={TEXTAREA:!0,INPUT:!0,OPTION:!0},c={radio:!0,checkbox:!0,button:!0,submit:!0,image:!0,file:!0};r.pointerDown=function(e,i){var n=l[e.target.nodeName]&&!c[e.target.type];if(n)return this.isPointerDown=!1,void delete this.pointerIdentifier;this._dragPointerDown(e,i);var s=document.activeElement;s&&s.blur&&s!=this.element&&s!=document.body&&s.blur(),this.pointerDownFocus(e),this.dragX=this.x,this.viewport.classList.add("is-pointer-down"),this._bindPostStartEvents(e),this.pointerDownScroll=o(),t.addEventListener("scroll",this),this.dispatchEvent("pointerDown",e,[i])},r.pointerDownFocus=function(e){var i=s(e);if(this.options.accessibility&&!i){var n=t.pageYOffset;this.element.focus(),t.pageYOffset!=n&&t.scrollTo(t.pageXOffset,n)}};var d={INPUT:!0,SELECT:!0};return r.canPreventDefaultOnPointerDown=function(t){var e=s(t);return!e},r.hasDragStarted=function(t){return Math.abs(t.x)>this.options.dragThreshold},r.pointerUp=function(t,e){delete this.isTouchScrolling,this.viewport.classList.remove("is-pointer-down"),this.dispatchEvent("pointerUp",t,[e]),this._dragPointerUp(t,e)},r.pointerDone=function(){t.removeEventListener("scroll",this),delete this.pointerDownScroll},r.dragStart=function(e,i){this.dragStartPosition=this.x,this.startAnimation(),t.removeEventListener("scroll",this),this.dispatchEvent("dragStart",e,[i])},r.pointerMove=function(t,e){var i=this._dragPointerMove(t,e);this.dispatchEvent("pointerMove",t,[e,i]),this._dragMove(t,e,i)},r.dragMove=function(t,e,i){t.preventDefault(),this.previousDragX=this.dragX;var n=this.options.rightToLeft?-1:1,s=this.dragStartPosition+i.x*n;if(!this.options.wrapAround&&this.slides.length){var o=Math.max(-this.slides[0].target,this.dragStartPosition);s=s>o?.5*(s+o):s;var r=Math.min(-this.getLastSlide().target,this.dragStartPosition);s=s<r?.5*(s+r):s}this.dragX=s,this.dragMoveTime=new Date,this.dispatchEvent("dragMove",t,[e,i])},r.dragEnd=function(t,e){this.options.freeScroll&&(this.isFreeScrolling=!0);var i=this.dragEndRestingSelect();if(this.options.freeScroll&&!this.options.wrapAround){var n=this.getRestingPosition();this.isFreeScrolling=-n>this.slides[0].target&&-n<this.getLastSlide().target}else this.options.freeScroll||i!=this.selectedIndex||(i+=this.dragEndBoostSelect());delete this.previousDragX,this.isDragSelect=this.options.wrapAround,this.select(i),delete this.isDragSelect,this.dispatchEvent("dragEnd",t,[e])},r.dragEndRestingSelect=function(){var t=this.getRestingPosition(),e=Math.abs(this.getSlideDistance(-t,this.selectedIndex)),i=this._getClosestResting(t,e,1),n=this._getClosestResting(t,e,-1),s=i.distance<n.distance?i.index:n.index;
-return s},r._getClosestResting=function(t,e,i){for(var n=this.selectedIndex,s=1/0,o=this.options.contain&&!this.options.wrapAround?function(t,e){return t<=e}:function(t,e){return t<e};o(e,s)&&(n+=i,s=e,e=this.getSlideDistance(-t,n),null!==e);)e=Math.abs(e);return{distance:s,index:n-i}},r.getSlideDistance=function(t,e){var i=this.slides.length,s=this.options.wrapAround&&i>1,o=s?n.modulo(e,i):e,r=this.slides[o];if(!r)return null;var a=s?this.slideableWidth*Math.floor(e/i):0;return t-(r.target+a)},r.dragEndBoostSelect=function(){if(void 0===this.previousDragX||!this.dragMoveTime||new Date-this.dragMoveTime>100)return 0;var t=this.getSlideDistance(-this.dragX,this.selectedIndex),e=this.previousDragX-this.dragX;return t>0&&e>0?1:t<0&&e<0?-1:0},r.staticClick=function(t,e){var i=this.getParentCell(t.target),n=i&&i.element,s=i&&this.cells.indexOf(i);this.dispatchEvent("staticClick",t,[e,n,s])},r.onscroll=function(){var t=o(),e=this.pointerDownScroll.x-t.x,i=this.pointerDownScroll.y-t.y;(Math.abs(e)>3||Math.abs(i)>3)&&this._pointerDone()},e}),function(t,e){"function"==typeof define&&define.amd?define("tap-listener/tap-listener",["unipointer/unipointer"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("unipointer")):t.TapListener=e(t,t.Unipointer)}(window,function(t,e){function i(t){this.bindTap(t)}var n=i.prototype=Object.create(e.prototype);return n.bindTap=function(t){t&&(this.unbindTap(),this.tapElement=t,this._bindStartEvent(t,!0))},n.unbindTap=function(){this.tapElement&&(this._bindStartEvent(this.tapElement,!0),delete this.tapElement)},n.pointerUp=function(i,n){if(!this.isIgnoringMouseUp||"mouseup"!=i.type){var s=e.getPointerPoint(n),o=this.tapElement.getBoundingClientRect(),r=t.pageXOffset,a=t.pageYOffset,h=s.x>=o.left+r&&s.x<=o.right+r&&s.y>=o.top+a&&s.y<=o.bottom+a;if(h&&this.emitEvent("tap",[i,n]),"mouseup"!=i.type){this.isIgnoringMouseUp=!0;var l=this;setTimeout(function(){delete l.isIgnoringMouseUp},400)}}},n.destroy=function(){this.pointerDone(),this.unbindTap()},i}),function(t,e){"function"==typeof define&&define.amd?define("flickity/js/prev-next-button",["./flickity","tap-listener/tap-listener","fizzy-ui-utils/utils"],function(i,n,s){return e(t,i,n,s)}):"object"==typeof module&&module.exports?module.exports=e(t,require("./flickity"),require("tap-listener"),require("fizzy-ui-utils")):e(t,t.Flickity,t.TapListener,t.fizzyUIUtils)}(window,function(t,e,i,n){"use strict";function s(t,e){this.direction=t,this.parent=e,this._create()}function o(t){return"string"==typeof t?t:"M "+t.x0+",50 L "+t.x1+","+(t.y1+50)+" L "+t.x2+","+(t.y2+50)+" L "+t.x3+",50  L "+t.x2+","+(50-t.y2)+" L "+t.x1+","+(50-t.y1)+" Z"}var r="http://www.w3.org/2000/svg";s.prototype=new i,s.prototype._create=function(){this.isEnabled=!0,this.isPrevious=this.direction==-1;var t=this.parent.options.rightToLeft?1:-1;this.isLeft=this.direction==t;var e=this.element=document.createElement("button");e.className="flickity-prev-next-button",e.className+=this.isPrevious?" previous":" next",e.setAttribute("type","button"),this.disable(),e.setAttribute("aria-label",this.isPrevious?"previous":"next");var i=this.createSVG();e.appendChild(i),this.on("tap",this.onTap),this.parent.on("select",this.update.bind(this)),this.on("pointerDown",this.parent.childUIPointerDown.bind(this.parent))},s.prototype.activate=function(){this.bindTap(this.element),this.element.addEventListener("click",this),this.parent.element.appendChild(this.element)},s.prototype.deactivate=function(){this.parent.element.removeChild(this.element),i.prototype.destroy.call(this),this.element.removeEventListener("click",this)},s.prototype.createSVG=function(){var t=document.createElementNS(r,"svg");t.setAttribute("viewBox","0 0 100 100");var e=document.createElementNS(r,"path"),i=o(this.parent.options.arrowShape);return e.setAttribute("d",i),e.setAttribute("class","arrow"),this.isLeft||e.setAttribute("transform","translate(100, 100) rotate(180) "),t.appendChild(e),t},s.prototype.onTap=function(){if(this.isEnabled){this.parent.uiChange();var t=this.isPrevious?"previous":"next";this.parent[t]()}},s.prototype.handleEvent=n.handleEvent,s.prototype.onclick=function(){var t=document.activeElement;t&&t==this.element&&this.onTap()},s.prototype.enable=function(){this.isEnabled||(this.element.disabled=!1,this.isEnabled=!0)},s.prototype.disable=function(){this.isEnabled&&(this.element.disabled=!0,this.isEnabled=!1)},s.prototype.update=function(){var t=this.parent.slides;if(this.parent.options.wrapAround&&t.length>1)return void this.enable();var e=t.length?t.length-1:0,i=this.isPrevious?0:e,n=this.parent.selectedIndex==i?"disable":"enable";this[n]()},s.prototype.destroy=function(){this.deactivate()},n.extend(e.defaults,{prevNextButtons:!0,arrowShape:{x0:10,x1:60,y1:50,x2:70,y2:40,x3:30}}),e.createMethods.push("_createPrevNextButtons");var a=e.prototype;return a._createPrevNextButtons=function(){this.options.prevNextButtons&&(this.prevButton=new s((-1),this),this.nextButton=new s(1,this),this.on("activate",this.activatePrevNextButtons))},a.activatePrevNextButtons=function(){this.prevButton.activate(),this.nextButton.activate(),this.on("deactivate",this.deactivatePrevNextButtons)},a.deactivatePrevNextButtons=function(){this.prevButton.deactivate(),this.nextButton.deactivate(),this.off("deactivate",this.deactivatePrevNextButtons)},e.PrevNextButton=s,e}),function(t,e){"function"==typeof define&&define.amd?define("flickity/js/page-dots",["./flickity","tap-listener/tap-listener","fizzy-ui-utils/utils"],function(i,n,s){return e(t,i,n,s)}):"object"==typeof module&&module.exports?module.exports=e(t,require("./flickity"),require("tap-listener"),require("fizzy-ui-utils")):e(t,t.Flickity,t.TapListener,t.fizzyUIUtils)}(window,function(t,e,i,n){function s(t){this.parent=t,this._create()}s.prototype=new i,s.prototype._create=function(){this.holder=document.createElement("ol"),this.holder.className="flickity-page-dots",this.dots=[],this.on("tap",this.onTap),this.on("pointerDown",this.parent.childUIPointerDown.bind(this.parent))},s.prototype.activate=function(){this.setDots(),this.bindTap(this.holder),this.parent.element.appendChild(this.holder)},s.prototype.deactivate=function(){this.parent.element.removeChild(this.holder),i.prototype.destroy.call(this)},s.prototype.setDots=function(){var t=this.parent.slides.length-this.dots.length;t>0?this.addDots(t):t<0&&this.removeDots(-t)},s.prototype.addDots=function(t){for(var e=document.createDocumentFragment(),i=[];t;){var n=document.createElement("li");n.className="dot",e.appendChild(n),i.push(n),t--}this.holder.appendChild(e),this.dots=this.dots.concat(i)},s.prototype.removeDots=function(t){var e=this.dots.splice(this.dots.length-t,t);e.forEach(function(t){this.holder.removeChild(t)},this)},s.prototype.updateSelected=function(){this.selectedDot&&(this.selectedDot.className="dot"),this.dots.length&&(this.selectedDot=this.dots[this.parent.selectedIndex],this.selectedDot.className="dot is-selected")},s.prototype.onTap=function(t){var e=t.target;if("LI"==e.nodeName){this.parent.uiChange();var i=this.dots.indexOf(e);this.parent.select(i)}},s.prototype.destroy=function(){this.deactivate()},e.PageDots=s,n.extend(e.defaults,{pageDots:!0}),e.createMethods.push("_createPageDots");var o=e.prototype;return o._createPageDots=function(){this.options.pageDots&&(this.pageDots=new s(this),this.on("activate",this.activatePageDots),this.on("select",this.updateSelectedPageDots),this.on("cellChange",this.updatePageDots),this.on("resize",this.updatePageDots),this.on("deactivate",this.deactivatePageDots))},o.activatePageDots=function(){this.pageDots.activate()},o.updateSelectedPageDots=function(){this.pageDots.updateSelected()},o.updatePageDots=function(){this.pageDots.setDots()},o.deactivatePageDots=function(){this.pageDots.deactivate()},e.PageDots=s,e}),function(t,e){"function"==typeof define&&define.amd?define("flickity/js/player",["ev-emitter/ev-emitter","fizzy-ui-utils/utils","./flickity"],function(t,i,n){return e(t,i,n)}):"object"==typeof module&&module.exports?module.exports=e(require("ev-emitter"),require("fizzy-ui-utils"),require("./flickity")):e(t.EvEmitter,t.fizzyUIUtils,t.Flickity)}(window,function(t,e,i){function n(t){this.parent=t,this.state="stopped",o&&(this.onVisibilityChange=function(){this.visibilityChange()}.bind(this),this.onVisibilityPlay=function(){this.visibilityPlay()}.bind(this))}var s,o;"hidden"in document?(s="hidden",o="visibilitychange"):"webkitHidden"in document&&(s="webkitHidden",o="webkitvisibilitychange"),n.prototype=Object.create(t.prototype),n.prototype.play=function(){if("playing"!=this.state){var t=document[s];if(o&&t)return void document.addEventListener(o,this.onVisibilityPlay);this.state="playing",o&&document.addEventListener(o,this.onVisibilityChange),this.tick()}},n.prototype.tick=function(){if("playing"==this.state){var t=this.parent.options.autoPlay;t="number"==typeof t?t:3e3;var e=this;this.clear(),this.timeout=setTimeout(function(){e.parent.next(!0),e.tick()},t)}},n.prototype.stop=function(){this.state="stopped",this.clear(),o&&document.removeEventListener(o,this.onVisibilityChange)},n.prototype.clear=function(){clearTimeout(this.timeout)},n.prototype.pause=function(){"playing"==this.state&&(this.state="paused",this.clear())},n.prototype.unpause=function(){"paused"==this.state&&this.play()},n.prototype.visibilityChange=function(){var t=document[s];this[t?"pause":"unpause"]()},n.prototype.visibilityPlay=function(){this.play(),document.removeEventListener(o,this.onVisibilityPlay)},e.extend(i.defaults,{pauseAutoPlayOnHover:!0}),i.createMethods.push("_createPlayer");var r=i.prototype;return r._createPlayer=function(){this.player=new n(this),this.on("activate",this.activatePlayer),this.on("uiChange",this.stopPlayer),this.on("pointerDown",this.stopPlayer),this.on("deactivate",this.deactivatePlayer)},r.activatePlayer=function(){this.options.autoPlay&&(this.player.play(),this.element.addEventListener("mouseenter",this))},r.playPlayer=function(){this.player.play()},r.stopPlayer=function(){this.player.stop()},r.pausePlayer=function(){this.player.pause()},r.unpausePlayer=function(){this.player.unpause()},r.deactivatePlayer=function(){this.player.stop(),this.element.removeEventListener("mouseenter",this)},r.onmouseenter=function(){this.options.pauseAutoPlayOnHover&&(this.player.pause(),this.element.addEventListener("mouseleave",this))},r.onmouseleave=function(){this.player.unpause(),this.element.removeEventListener("mouseleave",this)},i.Player=n,i}),function(t,e){"function"==typeof define&&define.amd?define("flickity/js/add-remove-cell",["./flickity","fizzy-ui-utils/utils"],function(i,n){return e(t,i,n)}):"object"==typeof module&&module.exports?module.exports=e(t,require("./flickity"),require("fizzy-ui-utils")):e(t,t.Flickity,t.fizzyUIUtils)}(window,function(t,e,i){function n(t){var e=document.createDocumentFragment();return t.forEach(function(t){e.appendChild(t.element)}),e}var s=e.prototype;return s.insert=function(t,e){var i=this._makeCells(t);if(i&&i.length){var s=this.cells.length;e=void 0===e?s:e;var o=n(i),r=e==s;if(r)this.slider.appendChild(o);else{var a=this.cells[e].element;this.slider.insertBefore(o,a)}if(0===e)this.cells=i.concat(this.cells);else if(r)this.cells=this.cells.concat(i);else{var h=this.cells.splice(e,s-e);this.cells=this.cells.concat(i).concat(h)}this._sizeCells(i);var l=e>this.selectedIndex?0:i.length;this._cellAddedRemoved(e,l)}},s.append=function(t){this.insert(t,this.cells.length)},s.prepend=function(t){this.insert(t,0)},s.remove=function(t){var e,n,s=this.getCells(t),o=0,r=s.length;for(e=0;e<r;e++){n=s[e];var a=this.cells.indexOf(n)<this.selectedIndex;o-=a?1:0}for(e=0;e<r;e++)n=s[e],n.remove(),i.removeFrom(this.cells,n);s.length&&this._cellAddedRemoved(0,o)},s._cellAddedRemoved=function(t,e){e=e||0,this.selectedIndex+=e,this.selectedIndex=Math.max(0,Math.min(this.slides.length-1,this.selectedIndex)),this.cellChange(t,!0),this.emitEvent("cellAddedRemoved",[t,e])},s.cellSizeChange=function(t){var e=this.getCell(t);if(e){e.getSize();var i=this.cells.indexOf(e);this.cellChange(i)}},s.cellChange=function(t,e){var i=this.slideableWidth;if(this._positionCells(t),this._getWrapShiftCells(),this.setGallerySize(),this.emitEvent("cellChange",[t]),this.options.freeScroll){var n=i-this.slideableWidth;this.x+=n*this.cellAlign,this.positionSlider()}else e&&this.positionSliderAtSelected(),this.select(this.selectedIndex)},e}),function(t,e){"function"==typeof define&&define.amd?define("flickity/js/lazyload",["./flickity","fizzy-ui-utils/utils"],function(i,n){return e(t,i,n)}):"object"==typeof module&&module.exports?module.exports=e(t,require("./flickity"),require("fizzy-ui-utils")):e(t,t.Flickity,t.fizzyUIUtils)}(window,function(t,e,i){"use strict";function n(t){if("IMG"==t.nodeName&&t.getAttribute("data-flickity-lazyload"))return[t];var e=t.querySelectorAll("img[data-flickity-lazyload]");return i.makeArray(e)}function s(t,e){this.img=t,this.flickity=e,this.load()}e.createMethods.push("_createLazyload");var o=e.prototype;return o._createLazyload=function(){this.on("select",this.lazyLoad)},o.lazyLoad=function(){var t=this.options.lazyLoad;if(t){var e="number"==typeof t?t:0,i=this.getAdjacentCellElements(e),o=[];i.forEach(function(t){var e=n(t);o=o.concat(e)}),o.forEach(function(t){new s(t,this)},this)}},s.prototype.handleEvent=i.handleEvent,s.prototype.load=function(){this.img.addEventListener("load",this),this.img.addEventListener("error",this),this.img.src=this.img.getAttribute("data-flickity-lazyload"),this.img.removeAttribute("data-flickity-lazyload")},s.prototype.onload=function(t){this.complete(t,"flickity-lazyloaded")},s.prototype.onerror=function(t){this.complete(t,"flickity-lazyerror")},s.prototype.complete=function(t,e){this.img.removeEventListener("load",this),this.img.removeEventListener("error",this);var i=this.flickity.getParentCell(this.img),n=i&&i.element;this.flickity.cellSizeChange(n),this.img.classList.add(e),this.flickity.dispatchEvent("lazyLoad",t,n)},e.LazyLoader=s,e}),function(t,e){"function"==typeof define&&define.amd?define("flickity/js/index",["./flickity","./drag","./prev-next-button","./page-dots","./player","./add-remove-cell","./lazyload"],e):"object"==typeof module&&module.exports&&(module.exports=e(require("./flickity"),require("./drag"),require("./prev-next-button"),require("./page-dots"),require("./player"),require("./add-remove-cell"),require("./lazyload")))}(window,function(t){return t}),function(t,e){"function"==typeof define&&define.amd?define("flickity-as-nav-for/as-nav-for",["flickity/js/index","fizzy-ui-utils/utils"],e):"object"==typeof module&&module.exports?module.exports=e(require("flickity"),require("fizzy-ui-utils")):t.Flickity=e(t.Flickity,t.fizzyUIUtils)}(window,function(t,e){function i(t,e,i){return(e-t)*i+t}t.createMethods.push("_createAsNavFor");var n=t.prototype;return n._createAsNavFor=function(){this.on("activate",this.activateAsNavFor),this.on("deactivate",this.deactivateAsNavFor),this.on("destroy",this.destroyAsNavFor);var t=this.options.asNavFor;if(t){var e=this;setTimeout(function(){e.setNavCompanion(t)})}},n.setNavCompanion=function(i){i=e.getQueryElement(i);var n=t.data(i);if(n&&n!=this){this.navCompanion=n;var s=this;this.onNavCompanionSelect=function(){s.navCompanionSelect()},n.on("select",this.onNavCompanionSelect),this.on("staticClick",this.onNavStaticClick),this.navCompanionSelect(!0)}},n.navCompanionSelect=function(t){if(this.navCompanion){var e=this.navCompanion.selectedCells[0],n=this.navCompanion.cells.indexOf(e),s=n+this.navCompanion.selectedCells.length-1,o=Math.floor(i(n,s,this.navCompanion.cellAlign));if(this.selectCell(o,!1,t),this.removeNavSelectedElements(),!(o>=this.cells.length)){var r=this.cells.slice(n,s+1);this.navSelectedElements=r.map(function(t){return t.element}),this.changeNavSelectedClass("add")}}},n.changeNavSelectedClass=function(t){this.navSelectedElements.forEach(function(e){e.classList[t]("is-nav-selected")})},n.activateAsNavFor=function(){this.navCompanionSelect(!0)},n.removeNavSelectedElements=function(){this.navSelectedElements&&(this.changeNavSelectedClass("remove"),delete this.navSelectedElements)},n.onNavStaticClick=function(t,e,i,n){"number"==typeof n&&this.navCompanion.selectCell(n)},n.deactivateAsNavFor=function(){this.removeNavSelectedElements()},n.destroyAsNavFor=function(){this.navCompanion&&(this.navCompanion.off("select",this.onNavCompanionSelect),this.off("staticClick",this.onNavStaticClick),delete this.navCompanion)},t}),function(t,e){"use strict";"function"==typeof define&&define.amd?define("imagesloaded/imagesloaded",["ev-emitter/ev-emitter"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("ev-emitter")):t.imagesLoaded=e(t,t.EvEmitter)}("undefined"!=typeof window?window:this,function(t,e){function i(t,e){for(var i in e)t[i]=e[i];return t}function n(t){var e=[];if(Array.isArray(t))e=t;else if("number"==typeof t.length)for(var i=0;i<t.length;i++)e.push(t[i]);else e.push(t);return e}function s(t,e,o){return this instanceof s?("string"==typeof t&&(t=document.querySelectorAll(t)),this.elements=n(t),this.options=i({},this.options),"function"==typeof e?o=e:i(this.options,e),o&&this.on("always",o),this.getImages(),a&&(this.jqDeferred=new a.Deferred),void setTimeout(function(){this.check()}.bind(this))):new s(t,e,o)}function o(t){this.img=t}function r(t,e){this.url=t,this.element=e,this.img=new Image}var a=t.jQuery,h=t.console;s.prototype=Object.create(e.prototype),s.prototype.options={},s.prototype.getImages=function(){this.images=[],this.elements.forEach(this.addElementImages,this)},s.prototype.addElementImages=function(t){"IMG"==t.nodeName&&this.addImage(t),this.options.background===!0&&this.addElementBackgroundImages(t);var e=t.nodeType;if(e&&l[e]){for(var i=t.querySelectorAll("img"),n=0;n<i.length;n++){var s=i[n];this.addImage(s)}if("string"==typeof this.options.background){var o=t.querySelectorAll(this.options.background);for(n=0;n<o.length;n++){var r=o[n];this.addElementBackgroundImages(r)}}}};var l={1:!0,9:!0,11:!0};return s.prototype.addElementBackgroundImages=function(t){var e=getComputedStyle(t);if(e)for(var i=/url\((['"])?(.*?)\1\)/gi,n=i.exec(e.backgroundImage);null!==n;){var s=n&&n[2];s&&this.addBackground(s,t),n=i.exec(e.backgroundImage)}},s.prototype.addImage=function(t){var e=new o(t);this.images.push(e)},s.prototype.addBackground=function(t,e){var i=new r(t,e);this.images.push(i)},s.prototype.check=function(){function t(t,i,n){setTimeout(function(){e.progress(t,i,n)})}var e=this;return this.progressedCount=0,this.hasAnyBroken=!1,this.images.length?void this.images.forEach(function(e){e.once("progress",t),e.check()}):void this.complete()},s.prototype.progress=function(t,e,i){this.progressedCount++,this.hasAnyBroken=this.hasAnyBroken||!t.isLoaded,this.emitEvent("progress",[this,t,e]),this.jqDeferred&&this.jqDeferred.notify&&this.jqDeferred.notify(this,t),this.progressedCount==this.images.length&&this.complete(),this.options.debug&&h&&h.log("progress: "+i,t,e)},s.prototype.complete=function(){var t=this.hasAnyBroken?"fail":"done";if(this.isComplete=!0,this.emitEvent(t,[this]),this.emitEvent("always",[this]),this.jqDeferred){var e=this.hasAnyBroken?"reject":"resolve";this.jqDeferred[e](this)}},o.prototype=Object.create(e.prototype),o.prototype.check=function(){var t=this.getIsImageComplete();return t?void this.confirm(0!==this.img.naturalWidth,"naturalWidth"):(this.proxyImage=new Image,this.proxyImage.addEventListener("load",this),this.proxyImage.addEventListener("error",this),this.img.addEventListener("load",this),this.img.addEventListener("error",this),void(this.proxyImage.src=this.img.src))},o.prototype.getIsImageComplete=function(){return this.img.complete&&void 0!==this.img.naturalWidth},o.prototype.confirm=function(t,e){this.isLoaded=t,this.emitEvent("progress",[this,this.img,e])},o.prototype.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},o.prototype.onload=function(){this.confirm(!0,"onload"),this.unbindEvents()},o.prototype.onerror=function(){this.confirm(!1,"onerror"),this.unbindEvents()},o.prototype.unbindEvents=function(){this.proxyImage.removeEventListener("load",this),this.proxyImage.removeEventListener("error",this),this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},r.prototype=Object.create(o.prototype),r.prototype.check=function(){this.img.addEventListener("load",this),this.img.addEventListener("error",this),this.img.src=this.url;var t=this.getIsImageComplete();t&&(this.confirm(0!==this.img.naturalWidth,"naturalWidth"),this.unbindEvents())},r.prototype.unbindEvents=function(){this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},r.prototype.confirm=function(t,e){this.isLoaded=t,this.emitEvent("progress",[this,this.element,e])},s.makeJQueryPlugin=function(e){e=e||t.jQuery,e&&(a=e,a.fn.imagesLoaded=function(t,e){var i=new s(this,t,e);return i.jqDeferred.promise(a(this))})},s.makeJQueryPlugin(),s}),function(t,e){"function"==typeof define&&define.amd?define(["flickity/js/index","imagesloaded/imagesloaded"],function(i,n){return e(t,i,n)}):"object"==typeof module&&module.exports?module.exports=e(t,require("flickity"),require("imagesloaded")):t.Flickity=e(t,t.Flickity,t.imagesLoaded)}(window,function(t,e,i){"use strict";e.createMethods.push("_createImagesLoaded");var n=e.prototype;return n._createImagesLoaded=function(){this.on("activate",this.imagesLoaded)},n.imagesLoaded=function(){function t(t,i){var n=e.getParentCell(i.img);e.cellSizeChange(n&&n.element),e.options.freeScroll||e.positionSliderAtSelected()}if(this.options.imagesLoaded){var e=this;i(this.slider).on("progress",t)}},e});
\ No newline at end of file
diff --git a/docs/js/main.es.js b/docs/js/main.es.js
deleted file mode 100644
index ae263a520..000000000
--- a/docs/js/main.es.js
+++ /dev/null
@@ -1,209 +0,0 @@
-{
-	const config = {
-		indis: {
-			in: {
-				base: {
-					duration: 500,
-					easing: 'easeOutQuint',
-					translateY: [0, 240],
-					opacity: {
-						value: 1,
-						duration: 50,
-						easing: 'linear'
-					}
-				},
-				shape: {
-					duration: 350,
-					easing: 'easeOutBack',
-					scaleY:  {
-						value: [1.3,1],
-						duration: 1300,
-						easing: 'easeOutElastic',
-						elasticity: 500
-					},
-					scaleX: {
-						value: [0.3,1],
-						duration: 1300,
-						easing: 'easeOutElastic',
-						elasticity: 500
-					},
-				},
-				path: {
-					duration: 450,
-					easing: 'easeInOutQuad',
-					d: 'M 44.5,24 C 148,24 252,24 356,24 367,24 376,32.9 376,44 L 376,256 C 376,267 367,276 356,276 252,276 148,276 44.5,276 33.4,276 24.5,267 24.5,256 L 24.5,44 C 24.5,32.9 33.4,24 44.5,24 Z'
-				},	
-				content: {
-					duration: 300,
-					delay: 50,
-					easing: 'easeOutQuad',
-					translateY: [10,0],
-					opacity: {
-						value: 1,
-						easing: 'linear',
-						duration: 100
-					}
-				},
-				trigger: {
-					translateY: [
-						{value: '-50%', duration: 100, easing: 'easeInQuad'},
-						{value: ['50%','0%'], duration: 100, easing: 'easeOutQuad'}
-					],
-					opacity: [
-						{value: 0, duration: 100, easing: 'easeInQuad'},
-						{value: 1, duration: 100, easing: 'easeOutQuad'}
-					],
-					color: {
-						value: '#6fbb95', 
-						duration: 1, 
-						delay: 100, 
-						easing: 'easeOutQuad'
-					}
-				}
-			},
-			out: {
-				base: {
-					duration: 320,
-					delay: 50,
-					easing: 'easeInOutQuint',
-					scaleY: 1.5,
-					scaleX: 0,
-					translateY: -100,
-					opacity: {
-						value: 0,
-						duration: 100,
-						delay: 130,
-						easing: 'linear'
-					}
-				},
-				path: {
-					duration: 300,
-					delay: 50,
-					easing: 'easeInOutQuint',
-					d: 'M 44.5,24 C 138,4.47 246,-6.47 356,24 367,26.9 376,32.9 376,44 L 376,256 C 376,267 367,279 356,276 231,240 168,241 44.5,276 33.8,279 24.5,267 24.5,256 L 24.5,44 C 24.5,32.9 33.6,26.3 44.5,24 Z'
-				},
-				content: {
-					duration: 300,
-					easing: 'easeInOutQuad',
-					translateY: -40,
-					opacity: {
-						value: 0,
-						duration: 100,
-						delay: 135,
-						easing: 'linear'
-					}
-				},
-				trigger: {
-					translateY: [
-						{value: '-50%', duration: 100, easing: 'easeInQuad'},
-						{value: ['50%','0%'], duration: 100, easing: 'easeOutQuad'}
-					],
-					opacity: [
-						{value: 0, duration: 100, easing: 'easeInQuad'},
-						{value: 1, duration: 100, easing: 'easeOutQuad'}
-					],
-					color: {
-						value: '#666', 
-						duration: 1, 
-						delay: 100, 
-						easing: 'easeOutQuad'
-					}
-				}
-			}
-		}
-	};
-
-	const tooltips = Array.from(document.querySelectorAll('.tooltip'));
-	
-	class Tooltip {
-		constructor(el) {
-			this.DOM = {};
-			this.DOM.el = el;
-			this.type = this.DOM.el.getAttribute('data-type');
-			this.DOM.trigger = this.DOM.el.querySelector('.tooltip__trigger');
-			this.DOM.triggerSpan = this.DOM.el.querySelector('.tooltip__trigger-text');
-			this.DOM.base = this.DOM.el.querySelector('.tooltip__base');
-			this.DOM.shape = this.DOM.base.querySelector('.tooltip__shape');
-			if( this.DOM.shape ) {
-				this.DOM.path = this.DOM.shape.childElementCount > 1 ? Array.from(this.DOM.shape.querySelectorAll('path')) : this.DOM.shape.querySelector('path');
-			}
-			this.DOM.deco = this.DOM.base.querySelector('.tooltip__deco');
-			this.DOM.content = this.DOM.base.querySelector('.tooltip__content');
-
-			this.DOM.letters = this.DOM.content.querySelector('.tooltip__letters');
-			if( this.DOM.letters ) {
-				// Create spans for each letter.
-				charming(this.DOM.letters);
-				// Redefine content.
-				this.DOM.content = this.DOM.letters.querySelectorAll('span');
-			}
-			this.initEvents();
-		}
-		initEvents() {
-			this.mouseenterFn = () => {
-				this.mouseTimeout = setTimeout(() => {
-					this.isShown = true;
-					this.show();
-				}, 75);
-			}
-			this.mouseleaveFn = () => {
-				clearTimeout(this.mouseTimeout);
-				if( this.isShown ) {
-					this.isShown = false;
-					this.hide();
-				}
-			}
-			this.DOM.trigger.addEventListener('mouseenter', this.mouseenterFn);
-			this.DOM.trigger.addEventListener('mouseleave', this.mouseleaveFn);
-			this.DOM.trigger.addEventListener('touchstart', this.mouseenterFn);
-			this.DOM.trigger.addEventListener('touchend', this.mouseleaveFn);
-		}
-		show() {
-			this.animate('in');
-		}
-		hide() {
-			this.animate('out');
-		}
-		animate(dir) {
-			if ( config[this.type][dir].base ) {
-				anime.remove(this.DOM.base);
-				let baseAnimOpts = {targets: this.DOM.base};
-				anime(Object.assign(baseAnimOpts, config[this.type][dir].base));
-			}
-			if ( config[this.type][dir].shape ) {
-				anime.remove(this.DOM.shape);
-				let shapeAnimOpts = {targets: this.DOM.shape};
-				anime(Object.assign(shapeAnimOpts, config[this.type][dir].shape));
-			}
-			if ( config[this.type][dir].path ) {
-				anime.remove(this.DOM.path);
-				let shapeAnimOpts = {targets: this.DOM.path};
-				anime(Object.assign(shapeAnimOpts, config[this.type][dir].path));
-			}
-			if ( config[this.type][dir].content ) {
-				anime.remove(this.DOM.content);
-				let contentAnimOpts = {targets: this.DOM.content};
-				anime(Object.assign(contentAnimOpts, config[this.type][dir].content));
-			}
-			// if ( config[this.type][dir].trigger ) {
-			// 	anime.remove(this.DOM.triggerSpan);
-			// 	let triggerAnimOpts = {targets: this.DOM.triggerSpan};
-			// 	anime(Object.assign(triggerAnimOpts, config[this.type][dir].trigger));
-			// }
-			if ( config[this.type][dir].deco ) {
-				anime.remove(this.DOM.deco);
-				let decoAnimOpts = {targets: this.DOM.deco};
-				anime(Object.assign(decoAnimOpts, config[this.type][dir].deco));
-			}
-		}
-		destroy() {
-			this.DOM.trigger.removeEventListener('mouseenter', this.mouseenterFn);
-			this.DOM.trigger.removeEventListener('mouseleave', this.mouseleaveFn);
-			this.DOM.trigger.removeEventListener('touchstart', this.mouseenterFn);
-			this.DOM.trigger.removeEventListener('touchend', this.mouseleaveFn);
-		}
-	}
-
-	const init = (() => tooltips.forEach(t => new Tooltip(t)))();
-};
-
diff --git a/docs/js/main.js b/docs/js/main.js
deleted file mode 100644
index bc4debbf7..000000000
--- a/docs/js/main.js
+++ /dev/null
@@ -1,224 +0,0 @@
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-{
-  var config = {
-    indis: {
-      in: {
-        base: {
-          duration: 500,
-          easing: 'easeOutQuint',
-          translateY: [0, 240],
-          opacity: {
-            value: 1,
-            duration: 50,
-            easing: 'linear'
-          }
-        },
-        shape: {
-          duration: 350,
-          easing: 'easeOutBack',
-          scaleY: {
-            value: [1.3, 1],
-            duration: 1300,
-            easing: 'easeOutElastic',
-            elasticity: 500
-          },
-          scaleX: {
-            value: [0.3, 1],
-            duration: 1300,
-            easing: 'easeOutElastic',
-            elasticity: 500
-          }
-        },
-        path: {
-          duration: 450,
-          easing: 'easeInOutQuad',
-          d: 'M 44.5,24 C 148,24 252,24 356,24 367,24 376,32.9 376,44 L 376,256 C 376,267 367,276 356,276 252,276 148,276 44.5,276 33.4,276 24.5,267 24.5,256 L 24.5,44 C 24.5,32.9 33.4,24 44.5,24 Z'
-        },
-        content: {
-          duration: 300,
-          delay: 50,
-          easing: 'easeOutQuad',
-          translateY: [10, 0],
-          opacity: {
-            value: 1,
-            easing: 'linear',
-            duration: 100
-          }
-        },
-        trigger: {
-          translateY: [{ value: '-50%', duration: 100, easing: 'easeInQuad' }, { value: ['50%', '0%'], duration: 100, easing: 'easeOutQuad' }],
-          opacity: [{ value: 0, duration: 100, easing: 'easeInQuad' }, { value: 1, duration: 100, easing: 'easeOutQuad' }],
-          color: {
-            value: '#6fbb95',
-            duration: 1,
-            delay: 100,
-            easing: 'easeOutQuad'
-          }
-        }
-      },
-      out: {
-        base: {
-          duration: 320,
-          delay: 50,
-          easing: 'easeInOutQuint',
-          scaleY: 1.5,
-          scaleX: 0,
-          translateY: -100,
-          opacity: {
-            value: 0,
-            duration: 100,
-            delay: 130,
-            easing: 'linear'
-          }
-        },
-        path: {
-          duration: 300,
-          delay: 50,
-          easing: 'easeInOutQuint',
-          d: 'M 44.5,24 C 138,4.47 246,-6.47 356,24 367,26.9 376,32.9 376,44 L 376,256 C 376,267 367,279 356,276 231,240 168,241 44.5,276 33.8,279 24.5,267 24.5,256 L 24.5,44 C 24.5,32.9 33.6,26.3 44.5,24 Z'
-        },
-        content: {
-          duration: 300,
-          easing: 'easeInOutQuad',
-          translateY: -40,
-          opacity: {
-            value: 0,
-            duration: 100,
-            delay: 135,
-            easing: 'linear'
-          }
-        },
-        trigger: {
-          translateY: [{ value: '-50%', duration: 100, easing: 'easeInQuad' }, { value: ['50%', '0%'], duration: 100, easing: 'easeOutQuad' }],
-          opacity: [{ value: 0, duration: 100, easing: 'easeInQuad' }, { value: 1, duration: 100, easing: 'easeOutQuad' }],
-          color: {
-            value: '#666',
-            duration: 1,
-            delay: 100,
-            easing: 'easeOutQuad'
-          }
-        }
-      }
-    }
-  };
-
-  var tooltips = Array.from(document.querySelectorAll('.tooltip'));
-
-  var Tooltip = function () {
-    function Tooltip(el) {
-      _classCallCheck(this, Tooltip);
-
-      this.DOM = {};
-      this.DOM.el = el;
-      this.type = this.DOM.el.getAttribute('data-type');
-      this.DOM.trigger = this.DOM.el.querySelector('.tooltip__trigger');
-      this.DOM.triggerSpan = this.DOM.el.querySelector('.tooltip__trigger-text');
-      this.DOM.base = this.DOM.el.querySelector('.tooltip__base');
-      this.DOM.shape = this.DOM.base.querySelector('.tooltip__shape');
-      if (this.DOM.shape) {
-        this.DOM.path = this.DOM.shape.childElementCount > 1 ? Array.from(this.DOM.shape.querySelectorAll('path')) : this.DOM.shape.querySelector('path');
-      }
-      this.DOM.deco = this.DOM.base.querySelector('.tooltip__deco');
-      this.DOM.content = this.DOM.base.querySelector('.tooltip__content');
-
-      this.DOM.letters = this.DOM.content.querySelector('.tooltip__letters');
-      if (this.DOM.letters) {
-        // Create spans for each letter.
-        charming(this.DOM.letters);
-        // Redefine content.
-        this.DOM.content = this.DOM.letters.querySelectorAll('span');
-      }
-      this.initEvents();
-    }
-
-    _createClass(Tooltip, [{
-      key: 'initEvents',
-      value: function initEvents() {
-        var _this = this;
-
-        this.mouseenterFn = function () {
-          _this.mouseTimeout = setTimeout(function () {
-            _this.isShown = true;
-            _this.show();
-          }, 75);
-        };
-        this.mouseleaveFn = function () {
-          clearTimeout(_this.mouseTimeout);
-          if (_this.isShown) {
-            _this.isShown = false;
-            _this.hide();
-          }
-        };
-        this.DOM.trigger.addEventListener('mouseenter', this.mouseenterFn);
-        this.DOM.trigger.addEventListener('mouseleave', this.mouseleaveFn);
-        this.DOM.trigger.addEventListener('touchstart', this.mouseenterFn);
-        this.DOM.trigger.addEventListener('touchend', this.mouseleaveFn);
-      }
-    }, {
-      key: 'show',
-      value: function show() {
-        this.animate('in');
-      }
-    }, {
-      key: 'hide',
-      value: function hide() {
-        this.animate('out');
-      }
-    }, {
-      key: 'animate',
-      value: function animate(dir) {
-        if (config[this.type][dir].base) {
-          anime.remove(this.DOM.base);
-          var baseAnimOpts = { targets: this.DOM.base };
-          anime(Object.assign(baseAnimOpts, config[this.type][dir].base));
-        }
-        if (config[this.type][dir].shape) {
-          anime.remove(this.DOM.shape);
-          var shapeAnimOpts = { targets: this.DOM.shape };
-          anime(Object.assign(shapeAnimOpts, config[this.type][dir].shape));
-        }
-        if (config[this.type][dir].path) {
-          anime.remove(this.DOM.path);
-          var _shapeAnimOpts = { targets: this.DOM.path };
-          anime(Object.assign(_shapeAnimOpts, config[this.type][dir].path));
-        }
-        if (config[this.type][dir].content) {
-          anime.remove(this.DOM.content);
-          var contentAnimOpts = { targets: this.DOM.content };
-          anime(Object.assign(contentAnimOpts, config[this.type][dir].content));
-        }
-        // if ( config[this.type][dir].trigger ) {
-        // 	anime.remove(this.DOM.triggerSpan);
-        // 	let triggerAnimOpts = {targets: this.DOM.triggerSpan};
-        // 	anime(Object.assign(triggerAnimOpts, config[this.type][dir].trigger));
-        // }
-        if (config[this.type][dir].deco) {
-          anime.remove(this.DOM.deco);
-          var decoAnimOpts = { targets: this.DOM.deco };
-          anime(Object.assign(decoAnimOpts, config[this.type][dir].deco));
-        }
-      }
-    }, {
-      key: 'destroy',
-      value: function destroy() {
-        this.DOM.trigger.removeEventListener('mouseenter', this.mouseenterFn);
-        this.DOM.trigger.removeEventListener('mouseleave', this.mouseleaveFn);
-        this.DOM.trigger.removeEventListener('touchstart', this.mouseenterFn);
-        this.DOM.trigger.removeEventListener('touchend', this.mouseleaveFn);
-      }
-    }]);
-
-    return Tooltip;
-  }();
-
-  var init = function () {
-    return tooltips.forEach(function (t) {
-      return new Tooltip(t);
-    });
-  }();
-};
\ No newline at end of file
diff --git a/docs/js/prism.js b/docs/js/prism.js
deleted file mode 100644
index b903c1774..000000000
--- a/docs/js/prism.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript&plugins=line-highlight+line-numbers */
-var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\blang(?:uage)?-(\w+)\b/i,t=0,n=_self.Prism={manual:_self.Prism&&_self.Prism.manual,disableWorkerMessageHandler:_self.Prism&&_self.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof a?new a(e.type,n.util.encode(e.content),e.alias):"Array"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).match(/\[object (\w+)\]/)[1]},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function(e){var t=n.util.type(e);switch(t){case"Object":var a={};for(var r in e)e.hasOwnProperty(r)&&(a[r]=n.util.clone(e[r]));return a;case"Array":return e.map(function(e){return n.util.clone(e)})}return e}},languages:{extend:function(e,t){var a=n.util.clone(n.languages[e]);for(var r in t)a[r]=t[r];return a},insertBefore:function(e,t,a,r){r=r||n.languages;var l=r[e];if(2==arguments.length){a=arguments[1];for(var i in a)a.hasOwnProperty(i)&&(l[i]=a[i]);return l}var o={};for(var s in l)if(l.hasOwnProperty(s)){if(s==t)for(var i in a)a.hasOwnProperty(i)&&(o[i]=a[i]);o[s]=l[s]}return n.languages.DFS(n.languages,function(t,n){n===r[e]&&t!=e&&(this[t]=o)}),r[e]=o},DFS:function(e,t,a,r){r=r||{};for(var l in e)e.hasOwnProperty(l)&&(t.call(e,l,e[l],a||l),"Object"!==n.util.type(e[l])||r[n.util.objId(e[l])]?"Array"!==n.util.type(e[l])||r[n.util.objId(e[l])]||(r[n.util.objId(e[l])]=!0,n.languages.DFS(e[l],t,l,r)):(r[n.util.objId(e[l])]=!0,n.languages.DFS(e[l],t,null,r)))}},plugins:{},highlightAll:function(e,t){var a={callback:t,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};n.hooks.run("before-highlightall",a);for(var r,l=a.elements||document.querySelectorAll(a.selector),i=0;r=l[i++];)n.highlightElement(r,e===!0,a.callback)},highlightElement:function(t,a,r){for(var l,i,o=t;o&&!e.test(o.className);)o=o.parentNode;o&&(l=(o.className.match(e)||[,""])[1].toLowerCase(),i=n.languages[l]),t.className=t.className.replace(e,"").replace(/\s+/g," ")+" language-"+l,t.parentNode&&(o=t.parentNode,/pre/i.test(o.nodeName)&&(o.className=o.className.replace(e,"").replace(/\s+/g," ")+" language-"+l));var s=t.textContent,g={element:t,language:l,grammar:i,code:s};if(n.hooks.run("before-sanity-check",g),!g.code||!g.grammar)return g.code&&(n.hooks.run("before-highlight",g),g.element.textContent=g.code,n.hooks.run("after-highlight",g)),n.hooks.run("complete",g),void 0;if(n.hooks.run("before-highlight",g),a&&_self.Worker){var u=new Worker(n.filename);u.onmessage=function(e){g.highlightedCode=e.data,n.hooks.run("before-insert",g),g.element.innerHTML=g.highlightedCode,r&&r.call(g.element),n.hooks.run("after-highlight",g),n.hooks.run("complete",g)},u.postMessage(JSON.stringify({language:g.language,code:g.code,immediateClose:!0}))}else g.highlightedCode=n.highlight(g.code,g.grammar,g.language),n.hooks.run("before-insert",g),g.element.innerHTML=g.highlightedCode,r&&r.call(t),n.hooks.run("after-highlight",g),n.hooks.run("complete",g)},highlight:function(e,t,r){var l=n.tokenize(e,t);return a.stringify(n.util.encode(l),r)},matchGrammar:function(e,t,a,r,l,i,o){var s=n.Token;for(var g in a)if(a.hasOwnProperty(g)&&a[g]){if(g==o)return;var u=a[g];u="Array"===n.util.type(u)?u:[u];for(var c=0;c<u.length;++c){var h=u[c],f=h.inside,d=!!h.lookbehind,m=!!h.greedy,p=0,y=h.alias;if(m&&!h.pattern.global){var v=h.pattern.toString().match(/[imuy]*$/)[0];h.pattern=RegExp(h.pattern.source,v+"g")}h=h.pattern||h;for(var b=r,k=l;b<t.length;k+=t[b].length,++b){var w=t[b];if(t.length>e.length)return;if(!(w instanceof s)){h.lastIndex=0;var _=h.exec(w),P=1;if(!_&&m&&b!=t.length-1){if(h.lastIndex=k,_=h.exec(e),!_)break;for(var A=_.index+(d?_[1].length:0),j=_.index+_[0].length,x=b,O=k,N=t.length;N>x&&(j>O||!t[x].type&&!t[x-1].greedy);++x)O+=t[x].length,A>=O&&(++b,k=O);if(t[b]instanceof s||t[x-1].greedy)continue;P=x-b,w=e.slice(k,O),_.index-=k}if(_){d&&(p=_[1].length);var A=_.index+p,_=_[0].slice(p),j=A+_.length,S=w.slice(0,A),C=w.slice(j),M=[b,P];S&&(++b,k+=S.length,M.push(S));var E=new s(g,f?n.tokenize(_,f):_,y,_,m);if(M.push(E),C&&M.push(C),Array.prototype.splice.apply(t,M),1!=P&&n.matchGrammar(e,t,a,b,k,!0,g),i)break}else if(i)break}}}}},tokenize:function(e,t){var a=[e],r=t.rest;if(r){for(var l in r)t[l]=r[l];delete t.rest}return n.matchGrammar(e,a,t,0,0,!1),a},hooks:{all:{},add:function(e,t){var a=n.hooks.all;a[e]=a[e]||[],a[e].push(t)},run:function(e,t){var a=n.hooks.all[e];if(a&&a.length)for(var r,l=0;r=a[l++];)r(t)}}},a=n.Token=function(e,t,n,a,r){this.type=e,this.content=t,this.alias=n,this.length=0|(a||"").length,this.greedy=!!r};if(a.stringify=function(e,t,r){if("string"==typeof e)return e;if("Array"===n.util.type(e))return e.map(function(n){return a.stringify(n,t,e)}).join("");var l={type:e.type,content:a.stringify(e.content,t,r),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:r};if(e.alias){var i="Array"===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(l.classes,i)}n.hooks.run("wrap",l);var o=Object.keys(l.attributes).map(function(e){return e+'="'+(l.attributes[e]||"").replace(/"/g,"&quot;")+'"'}).join(" ");return"<"+l.tag+' class="'+l.classes.join(" ")+'"'+(o?" "+o:"")+">"+l.content+"</"+l.tag+">"},!_self.document)return _self.addEventListener?(n.disableWorkerMessageHandler||_self.addEventListener("message",function(e){var t=JSON.parse(e.data),a=t.language,r=t.code,l=t.immediateClose;_self.postMessage(n.highlight(r,n.languages[a],a)),l&&_self.close()},!1),_self.Prism):_self.Prism;var r=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return r&&(n.filename=r.src,n.manual||r.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
-Prism.languages.markup={comment:/<!--[\s\S]*?-->/,prolog:/<\?[\s\S]+?\?>/,doctype:/<!DOCTYPE[\s\S]+?>/i,cdata:/<!\[CDATA\[[\s\S]*?]]>/i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/(^|[^\\])["']/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&amp;/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup;
-Prism.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(?:;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^{}\s][^{};]*?(?=\s*\{)/,string:{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.util.clone(Prism.languages.css),Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/(<style[\s\S]*?>)[\s\S]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css"}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag));
-Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(?:true|false)\b/,"function":/[a-z0-9_]+(?=\()/i,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/};
-Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,number:/\b-?(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+|\d*\.?\d+(?:[Ee][+-]?\d+)?|NaN|Infinity)\b/,"function":/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*\()/i,operator:/-[-=]?|\+[+=]?|!=?=?|<<?=?|>>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^\/])\/(?!\/)(\[[^\]\r\n]+]|\\.|[^\/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=\s*(?:function\b|(?:\([^()]*\)|[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/i,alias:"function"}}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^}]+\}/,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/(<script[\s\S]*?>)[\s\S]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:"language-javascript"}}),Prism.languages.js=Prism.languages.javascript;
-!function(){function e(e,t){return Array.prototype.slice.call((t||document).querySelectorAll(e))}function t(e,t){return t=" "+t+" ",(" "+e.className+" ").replace(/[\n\t]/g," ").indexOf(t)>-1}function n(e,n,i){for(var o,a=n.replace(/\s+/g,"").split(","),l=+e.getAttribute("data-line-offset")||0,d=r()?parseInt:parseFloat,c=d(getComputedStyle(e).lineHeight),s=0;o=a[s++];){o=o.split("-");var u=+o[0],m=+o[1]||u,h=document.createElement("div");h.textContent=Array(m-u+2).join(" \n"),h.setAttribute("aria-hidden","true"),h.className=(i||"")+" line-highlight",t(e,"line-numbers")||(h.setAttribute("data-start",u),m>u&&h.setAttribute("data-end",m)),h.style.top=(u-l-1)*c+"px",t(e,"line-numbers")?e.appendChild(h):(e.querySelector("code")||e).appendChild(h)}}function i(){var t=location.hash.slice(1);e(".temporary.line-highlight").forEach(function(e){e.parentNode.removeChild(e)});var i=(t.match(/\.([\d,-]+)$/)||[,""])[1];if(i&&!document.getElementById(t)){var r=t.slice(0,t.lastIndexOf(".")),o=document.getElementById(r);o&&(o.hasAttribute("data-line")||o.setAttribute("data-line",""),n(o,i,"temporary "),document.querySelector(".temporary.line-highlight").scrollIntoView())}}if("undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector){var r=function(){var e;return function(){if("undefined"==typeof e){var t=document.createElement("div");t.style.fontSize="13px",t.style.lineHeight="1.5",t.style.padding=0,t.style.border=0,t.innerHTML="&nbsp;<br />&nbsp;",document.body.appendChild(t),e=38===t.offsetHeight,document.body.removeChild(t)}return e}}(),o=0;Prism.hooks.add("before-sanity-check",function(t){var n=t.element.parentNode,i=n&&n.getAttribute("data-line");if(n&&i&&/pre/i.test(n.nodeName)){var r=0;e(".line-highlight",n).forEach(function(e){r+=e.textContent.length,e.parentNode.removeChild(e)}),r&&/^( \n)+$/.test(t.code.slice(-r))&&(t.code=t.code.slice(0,-r))}}),Prism.hooks.add("complete",function(e){var t=e.element.parentNode,r=t&&t.getAttribute("data-line");t&&r&&/pre/i.test(t.nodeName)&&(clearTimeout(o),n(t,r),o=setTimeout(i,1))}),window.addEventListener("hashchange",i)}}();
-!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var e="line-numbers",t=function(e){var t=n(e),r=t["white-space"];if("pre-wrap"===r||"pre-line"===r){var s=e.querySelector("code"),l=e.querySelector(".line-numbers-rows"),a=e.querySelector(".line-numbers-sizer"),i=e.textContent.split("\n");a||(a=document.createElement("span"),a.className="line-numbers-sizer",s.appendChild(a)),a.style.display="block",i.forEach(function(e,t){a.textContent=e||"\n";var n=a.getBoundingClientRect().height;l.children[t].style.height=n+"px"}),a.textContent="",a.style.display="none"}},n=function(e){return e?window.getComputedStyle?getComputedStyle(e):e.currentStyle||null:null};window.addEventListener("resize",function(){Array.prototype.forEach.call(document.querySelectorAll("pre."+e),t)}),Prism.hooks.add("complete",function(e){if(e.code){var n=e.element.parentNode,r=/\s*\bline-numbers\b\s*/;if(n&&/pre/i.test(n.nodeName)&&(r.test(n.className)||r.test(e.element.className))&&!e.element.querySelector(".line-numbers-rows")){r.test(e.element.className)&&(e.element.className=e.element.className.replace(r," ")),r.test(n.className)||(n.className+=" line-numbers");var s,l=e.code.match(/\n(?!$)/g),a=l?l.length+1:1,i=new Array(a+1);i=i.join("<span></span>"),s=document.createElement("span"),s.setAttribute("aria-hidden","true"),s.className="line-numbers-rows",s.innerHTML=i,n.hasAttribute("data-start")&&(n.style.counterReset="linenumber "+(parseInt(n.getAttribute("data-start"),10)-1)),e.element.appendChild(s),t(n)}}})}}();
diff --git a/docs/less/_components.less b/docs/less/_components.less
deleted file mode 100644
index 1e213b1c6..000000000
--- a/docs/less/_components.less
+++ /dev/null
@@ -1,7 +0,0 @@
-@import "components/button/style";
-@import "components/header/style";
-@import "components/tagline/style";
-@import "components/footer/style";
-@import "components/examples/style";
-// @import "components/tooltip/style";
-@import "components/modal/style";
\ No newline at end of file
diff --git a/docs/less/_main.less b/docs/less/_main.less
deleted file mode 100644
index 7905ebd82..000000000
--- a/docs/less/_main.less
+++ /dev/null
@@ -1,84 +0,0 @@
-body {
-  background-color: @background_color_1;
-  font-family: @font_family;
-  font-weight: 400;
-  font-size: 14px;
-  line-height: 25px;
-  color: @color_1;
-  text-rendering: optimizeLegibility;
-  -webkit-font-smoothing: antialiased;
-}
-a {
-  color: @primary;
-  text-decoration: none;
-  font-weight: bold;
-  transition: opacity .2s ease;
-  outline: 0px;
-}
-a.cases {
-  color: #000;
-  font-weight: normal;
-  cursor: default;
-  &.islink {
-    color: @primary;
-    font-weight: bold;
-    cursor: pointer;
-  }
-}
-
-.container-wrap {
-  z-index: 2;
-  margin-bottom: 160px;
-  background-color: @background_color_1;
-  box-shadow: 0 0 30px 0 rgba(54, 69, 79, 0.86);
-}
-.container {
-  max-width: 1280px;
-  margin: 0 auto;
-  overflow: hidden;
-  position: relative;
-}
-@media (max-width: 767px) {
-  .container-wrap {
-    margin-bottom: 0;
-  }
-}
-/*.slide.slide--one .slide__inner {
-    margin: 30px 0 0 0;
-    height: 780px;
-    background-color: #4957B8;
-    background-image: url(../img/dot.svg);
-    box-shadow: 0px 10px 14px 0px rgba(79, 90, 166, 0.35);
-    border-radius: 10px;
-    transform: translate3d(0, 0, 0);
-    transition: transform .6s ease, opacity .3s ease;
-}*/
-.keyframes(@name; @arguments) {
-  @-moz-keyframes @name { @arguments(); }
-  @-webkit-keyframes @name { @arguments(); }
-  @keyframes @name { @arguments(); }
-}
-.keyframes(pulsate; {
-  0% {
-    transform: scale(1);
-    box-shadow: 0 2px 9px 0 rgba(57, 80, 164, 0.69);
-  }
-  50% {
-    transform: scale(1.14);
-    box-shadow: 0px 10px 14px 0 rgba(57, 80, 164, 0.69);
-  }
-  100% {
-    transform: scale(1);
-    box-shadow: 0 2px 9px 0 rgba(57, 80, 164, 0.69);
-  }
-});
-.keyframes(pulsateArea; {
-  0% {
-    transform: scale(0.1);
-    opacity: .1;
-  }
-  100% {
-    transform: scale(1.4);
-    opacity: 0;
-  }
-});
\ No newline at end of file
diff --git a/docs/less/_slides.less b/docs/less/_slides.less
deleted file mode 100644
index a93ff1fd2..000000000
--- a/docs/less/_slides.less
+++ /dev/null
@@ -1,111 +0,0 @@
-.slides {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-}
-.slide {
-  position: relative;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-align: center;
-  align-items: center;
-}
-.slide__inner {
-  width: 1180px;
-  position: relative;
-}
-.slide__header {
-  margin: 0 auto;
-  width: 600px;
-  text-align: center;
-}
-.slide__title {
-  color: @primary;
-  font-size: 24px;
-  line-height: 30px;
-  margin: 0 0 15px 0;
-  font-weight: bold;
-}
-.slide__description {
-  color: @color_second;
-  font-size: 14px;
-  line-height: 25px;
-}
-.slide__footer {
-  text-align: center;
-  width: 250px;
-  margin: 0 auto;
-  color: @color_4;
-  opacity: .6;
-  font-size: 15px;
-  line-height: 25px;
-}
-.slide__header--inversed {
-  .slide__title {
-    color: @color_2;
-  }
-  .slide__description {
-    color: @color_2;
-    opacity: .6;
-  }
-}
-.slide--shown {
-  .example {
-    opacity: 1;
-    transform: translate3d(0, 0, 0);
-  }
-  .example__icon-inner {
-    -ms-transform: scale(1);
-    transform: scale(1);
-    opacity: 1;
-  }
-  -ms-transform: scale(1);
-  transform: scale(1);
-  opacity: 1;
-}
-@media (max-width: 1140px) {
-  .slide__inner {
-    width: 100%;
-    margin: 0;
-  }
-}
-@media (max-width: 767px) {
-  .slide__header {
-    padding: 0 20px;
-    margin: 0 auto;
-    width: auto;
-    max-width: 300px;
-  }
-  .slide__title {
-    font-size: 19px;
-    line-height: 26px;
-    margin: 0 0 6px 0;
-  }
-  .slide__description {
-    font-size: 15px;
-    line-height: 21px;
-  }
-  .slide__footer {
-    font-size: 14px;
-    line-height: 20px;
-  }
-  .slide.slide--one {
-    margin: 0;
-    .slide__inner {
-      height: auto;
-      border-radius: 0;
-    }
-  }
-}
-
-@import "slides/slide-one";
-@import "slides/slide-feature";
-@import "slides/slide-gist";
-@import "slides/slide-examples";
-@import "slides/slide-three";
-@import "slides/slide-four";
-@import "slides/slide-five";
-@import "slides/slide-six";
diff --git a/docs/less/_vendor.less b/docs/less/_vendor.less
deleted file mode 100644
index 514bc32c1..000000000
--- a/docs/less/_vendor.less
+++ /dev/null
@@ -1,586 +0,0 @@
-/*! Flickity v2.0.10
-http://flickity.metafizzy.co
----------------------------------------------- */
-
-.flickity-enabled {
-  position: relative;
-}
-
-.flickity-enabled:focus { outline: none; }
-
-.flickity-viewport {
-  overflow: hidden;
-  position: relative;
-  height: 100%;
-}
-
-.flickity-slider {
-  position: absolute;
-  width: 100%;
-  height: 100%;
-}
-
-/* draggable */
-
-.flickity-enabled.is-draggable {
-  -webkit-tap-highlight-color: transparent;
-  tap-highlight-color: transparent;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-
-.flickity-enabled.is-draggable .flickity-viewport {
-  cursor: move;
-  cursor: -webkit-grab;
-  cursor: grab;
-}
-
-.flickity-enabled.is-draggable .flickity-viewport.is-pointer-down {
-  cursor: -webkit-grabbing;
-  cursor: grabbing;
-}
-
-/* ---- previous/next buttons ---- */
-
-.flickity-prev-next-button {
-  position: absolute;
-  top: 50%;
-  width: 44px;
-  height: 44px;
-  border: none;
-  border-radius: 50%;
-  background: white;
-  background: hsla(0, 0%, 100%, 0.75);
-  cursor: pointer;
-  /* vertically center */
-  -webkit-transform: translateY(-50%);
-  transform: translateY(-50%);
-}
-
-.flickity-prev-next-button:hover { background: white; }
-
-.flickity-prev-next-button:focus {
-  outline: none;
-  box-shadow: 0 0 0 5px #09F;
-}
-
-.flickity-prev-next-button:active {
-  opacity: 0.6;
-}
-
-.flickity-prev-next-button.previous { left: 10px; }
-.flickity-prev-next-button.next { right: 10px; }
-/* right to left */
-.flickity-rtl .flickity-prev-next-button.previous {
-  left: auto;
-  right: 10px;
-}
-.flickity-rtl .flickity-prev-next-button.next {
-  right: auto;
-  left: 10px;
-}
-
-.flickity-prev-next-button:disabled {
-  opacity: 0.3;
-  cursor: auto;
-}
-
-.flickity-prev-next-button svg {
-  position: absolute;
-  left: 20%;
-  top: 20%;
-  width: 60%;
-  height: 60%;
-}
-
-.flickity-prev-next-button .arrow {
-  fill: #333;
-}
-
-/* ---- page dots ---- */
-
-.flickity-page-dots {
-  position: absolute;
-  width: 100%;
-  bottom: -25px;
-  padding: 0;
-  margin: 0;
-  list-style: none;
-  text-align: center;
-  line-height: 1;
-}
-
-.flickity-rtl .flickity-page-dots { direction: rtl; }
-
-.flickity-page-dots .dot {
-  display: inline-block;
-  width: 10px;
-  height: 10px;
-  margin: 0 8px;
-  background: #333;
-  border-radius: 50%;
-  opacity: 0.25;
-  cursor: pointer;
-}
-
-.flickity-page-dots .dot.is-selected {
-  opacity: 1;
-}
-
-/* ------------------------------------------------------------------------------
- *
- *  # Prism
- *
- *  Lightweight, extensible syntax highlighter
- *
- *  Version: 1.0
- *  Latest update: May 10, 2015
- *
- * ---------------------------------------------------------------------------- */
-code[class*="language-"],
-pre[class*="language-"] {
-  text-shadow: 0 1px #fff;
-  word-break: normal;
-  line-height: 1.5;
-  direction: ltr;
-}
-@media print {
-  code[class*="language-"],
-  pre[class*="language-"] {
-    text-shadow: none;
-  }
-}
-.token.comment,
-.token.prolog,
-.token.doctype,
-.token.cdata,
-.token.punctuation {
-  color: #999;
-}
-.token.property,
-.token.tag,
-.token.boolean,
-.token.number,
-.token.constant,
-.token.symbol {
-  color: #905;
-}
-.token.selector,
-.token.attr-name,
-.token.string,
-.token.builtin {
-  color: #690;
-}
-.token.operator,
-.token.entity,
-.token.url,
-.language-css .token.string,
-.style .token.string,
-.token.variable {
-  color: #a67f59;
-  background: rgba(255, 255, 255, 0.5);
-}
-.token.atrule,
-.token.attr-value,
-.token.keyword {
-  color: #07a;
-}
-.token.function {
-  color: #DD4A68;
-}
-.token.regex,
-.token.important {
-  color: #e90;
-}
-.token.important {
-  font-weight: bold;
-}
-.token.entity {
-  cursor: help;
-}
-.namespace {
-  opacity: 0.7;
-  filter: alpha(opacity=70);
-}
-.line-highlight {
-  position: absolute;
-  left: 0;
-  right: 0;
-  margin-top: 20px;
-  background: rgba(133, 238, 149, 0.12);
-  pointer-events: none;
-  white-space: pre;
-  line-height: inherit;
-}
-.line-highlight:before,
-.line-highlight:after {
-  content: attr(data-start);
-  position: absolute;
-  top: 0px;
-  left: 10px;
-  padding: 2px;
-  text-align: center;
-  font-size: 10px;
-  color: #777777;
-}
-.line-highlight[data-end]:after {
-  content: attr(data-end);
-  top: auto;
-  bottom: 0;
-}
-pre.line-numbers {
-  position: relative;
-  padding-left: 50px;
-  counter-reset: linenumber;
-}
-pre.line-numbers > code {
-  position: relative;
-}
-.line-numbers .line-numbers-rows {
-  position: absolute;
-  pointer-events: none;
-  top: 0;
-  font-size: 100%;
-  left: 0px;
-  width: 36px;
-  letter-spacing: -1px;
-  border-right: 1px solid #999;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  -o-user-select: none;
-  user-select: none;
-}
-.line-numbers .line-numbers-rows > span {
-  pointer-events: none;
-  display: block;
-  counter-increment: linenumber;
-}
-.line-numbers .line-numbers-rows > span:before {
-  content: counter(linenumber);
-  color: #777777;
-  display: block;
-  padding-right: 10px;
-  text-align: right;
-}
-pre[class*="language-"] {
-  overflow: auto;
-  position: relative;
-  border-left-width: 3px;
-  border-left-color: #31639C;
-  background-color: #fdfdfd;
-  background-image: -webkit-linear-gradient(transparent 50%, rgba(25, 118, 210, 0.025) 50%);
-  background-image: -moz-linear-gradient(transparent 50%, rgba(25, 118, 210, 0.025) 50%);
-  background-image: -ms-linear-gradient(transparent 50%, rgba(25, 118, 210, 0.025) 50%);
-  background-image: -o-linear-gradient(transparent 50%, rgba(25, 118, 210, 0.025) 50%);
-  background-image: linear-gradient(transparent 50%, rgba(25, 118, 210, 0.025) 50%);
-  background-size: 3em 3em;
-  background-origin: content-box;
-  border-bottom-left-radius: 0;
-  border-top-left-radius: 0;
-}
-pre[class*="language-"] > code[data-language] {
-  display: block;
-}
-pre[class*="language-"] > code[data-language]:before {
-  content: attr(data-language);
-  background-color: #f8f8f8;
-  display: inline-block;
-  position: absolute;
-  top: 0px;
-  right: 0px;
-  font-size: 11px;
-  border-radius: 0 0 0 2px;
-  padding: 4px 8px;
-  text-shadow: none;
-  color: #333333;
-  border-left: 1px solid #ddd;
-  border-bottom: 1px solid #ddd;
-}
-pre[class*="language-"].line-numbers > code[data-language]:before {
-  top: -15px;
-  right: -15px;
-}
-pre[data-line] {
-  position: relative;
-  padding-left: 36px;
-}
-
-//* {
-//  line-height: calc(1em + 1ex);
-//  box-sizing: border-box;
-//}
-//article {
-//  justify-content: center;
-//}
-.enter {
-  animation: move 1s;
-}
-
-@keyframes move {
-  0% {
-    opacity: 0;
-    transform: translate(0, 50px);
-  }
-
-  100% {
-    opacity: 1;
-    transform: translate(0, 0);
-  }
-}
-
-strong {
-  font-weight: bolder;
-}
-
-
-
-pre,
-code {
-  font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
-  font-size: small;
-}
-
-
-.window {
-  margin: 2em auto;
-  border: 1px solid;
-  border-radius: 4px;
-  font-size: 14px;
-  box-shadow: 0 2px 4px 0px rgba(0, 0, 0, 0.10);
-  transition: box-shadow 0.3s ease, transform 0.3s ease;
-  // 0px 2px 4px 0px rgba(0, 0, 0, 0.1)
-}
-
-.window figcaption {
-  display: -webkit-flex;
-  display: flex;
-  letter-spacing: 1px;
-  border-bottom: 1px solid;
-  padding-right: 66px;
-  padding-left: 12px;
-}
-
-.window pre {
-  padding: 7px 12px;
-  margin: 0;
-  line-height: 1.6;
-  overflow: scroll;
-}
-
-.chrome.btn {
-  display: inline-block;
-  border-radius: 50%;
-  min-width: 12px;
-  height: 12px;
-  margin: 12px 6px;
-  margin-left: 0;
-}
-
-.chrome.close {
-  background-color: #ff5f56;
-  cursor: pointer;
-}
-
-.chrome.minimize {
-  background-color: #ffbd2e;
-}
-
-.chrome.fullscreen {
-  background-color: #27c93f;
-}
-
-.chrome.title {
-  -webkit-flex: 1;
-  flex: 1;
-  text-align: center;
-  line-height: 36px;
-  white-space: nowrap;
-  overflow: hidden;
-}
-
-.gist,
-.browser {
-  text-align: left;
-  border-color: #ddd;
-  color: #777;
-  background-color: #fdfdfc;
-}
-
-.gist figcaption,
-.browser figcaption {
-  background: #fafafa;
-  border-bottom-color: inherit;
-  border-top-left-radius: inherit;
-  border-top-right-radius: inherit;
-}
-
-.gist pre {
-  color: #777;
-}
-
-.gist .chrome.btn {
-  background-color: #ccc;
-}
-
-.browser div {
-  color: initial;
-  padding: 6px;
-  font-size: 14px;
-  line-height: 1.5;
-}
-
-.browser .chrome.btn {
-  opacity: 0.5;
-}
-
-.browser .chrome.title {
-  font-size: 12px;
-}
-
-.browser .chrome.title a,
-.browser .chrome.title .link {
-  background-color: rgba(0, 0, 0, 0.05);
-  color: #777;
-  border-radius: 4px;
-  padding: 0.25em 2em;
-  margin: 0.5em auto;
-  display: block;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  position: relative;
-  max-width: 20em;
-}
-
-.browser .chrome.title a::before {
-  content: '+';
-  position: absolute;
-  left: 0.5em;
-  top: 0.35em;
-  display: block;
-  border-radius: 100%;
-  border: 1px solid currentcolor;
-  width: 1em;
-  height: 1em;
-  line-height: 1;
-  padding-left: 0.05em;
-  padding-bottom: 0.05em;
-  opacity: 0;
-  transition: opacity 200ms;
-}
-
-.browser .chrome.title a:hover::before,
-.browser .chrome.title a:focus::before {
-  opacity: 1;
-}
-
-.terminal {
-  color: #93a1a1;
-  background-color: #002b36;
-  border-width: 0;
-}
-
-.terminal figcaption {
-  border-bottom-color: #073642;
-  color: #657b83;
-}
-
-.terminal .command::before,
-.terminal .input::before {
-  content: '$ ';
-  font-weight: bold;
-}
-
-.terminal .input {
-  font-weight: bold;
-}
-
-.terminal .hl {
-  color: #b58900;
-}
-
-.terminal .nok {
-  color: #dc322f;
-}
-
-.terminal .ll {
-  color: #586e75;
-}
-
-.terminal .chrome.close {
-  background-color: #dc322f;
-}
-
-.terminal .chrome.minimize {
-  background-color: #b58900;
-}
-
-.terminal .chrome.fullscreen {
-  background-color: #859900;
-}
-
-.caret {
-  font-weight: bold;
-}
-
-.caret.blink {
-  animation: blink 1s linear infinite;
-  opacity: 1;
-}
-
-@keyframes blink {
-  0%,
-  49% { opacity: 0; }
-
-  50%,
-  100% { opacity: 1; }
-}
-
-.gallery {
-  //width: 100%;
-  width: 450px;
-  position: relative;
-}
-.gallery .window pre {
-  min-height: 400px;
-}
-
-.gallery .window:first-child {
-  transform: scale(.7) translate(-98%,5%);
-  transform-origin: 0 0;
-}
-
-.gallery .window:first-child,
-.gallery .window:last-child {
-  z-index: -1;
-  position: absolute;
-  top: 0;
-  width: 80%;
-}
-
-@media (max-width: 78em) {
-  .gallery .window:first-child,
-  .gallery .window:last-child {
-    display: none;
-  }
-}
-
-.gallery .window:first-child pre,
-.gallery .window:last-child pre {
-  height: 420px;
-  opacity: 0.8;
-  overflow: hidden;
-}
-
-.gallery .window:first-child {
-  transform: scale(0.7) translate(-98%, 5%);
-  transform-origin: 0% 0%;
-}
-.gallery .window:last-child {
-  transform: scale(0.7) translate(130%, 5%);
-  transform-origin: 100% 0%;
-}
-
-
diff --git a/docs/less/components/button/style.less b/docs/less/components/button/style.less
deleted file mode 100644
index be2c4d22f..000000000
--- a/docs/less/components/button/style.less
+++ /dev/null
@@ -1,48 +0,0 @@
-.button {
-  display: block;
-  height: 44px;
-  line-height: 43px;
-  padding: 0 20px;
-  font-family: @font_family_1;
-  font-size: 13px;
-  text-transform: uppercase;
-  text-align: center;
-  letter-spacing: 1px;
-  color: @color_2;
-  background-color: @background_color_2;
-  box-shadow: 0 8px 14px 0 #DEE2E5;
-  border-radius: 8px;
-  transform: translate3d(0, 0, 0) scale(1);
-  transition: transform .1s ease, box-shadow .2s ease, background-color .2s ease;
-  -webkit-appearance: none;
-  cursor: pointer;
-  &:active {
-    transform: translate3d(0, 0, 0) scale(0.99);
-  }
-  &:hover {
-    background-color: @background_color_3;
-  }
-}
-.button.button--disabled {
-  color: @color_3;
-  cursor: default;
-}
-.button.button--secondary {
-  box-shadow: none;
-  &:hover {
-    color: @color_2;
-    //border: #1F9948 2px solid;
-    background-color: @background_color_8;
-  }
-}
-.button.button--more {
-  padding: 0 35px;
-  transform: translate3d(-50%, 0, 0);
-  position: absolute;
-  bottom: 30px;
-  left: 50%;
-  transition: transform .2s ease, background-color .2s ease;
-  &:active {
-    transform: translate3d(-50%, 0, 0) scale(0.99);
-  }
-}
diff --git a/docs/less/components/contributor/style.less b/docs/less/components/contributor/style.less
deleted file mode 100644
index c2ca30b2c..000000000
--- a/docs/less/components/contributor/style.less
+++ /dev/null
@@ -1,84 +0,0 @@
-@media (max-width: 922px) {
-  .contributors {
-    width: 100%;
-  }
-  .contributors__list {
-    -ms-flex-pack: center;
-    justify-content: center;
-  }
-  .contributor {
-    width: 160px;
-  }
-  .section {
-    &:first-child {
-      padding-top: 60px;
-    }
-  }
-}
-@media (max-width: 767px) {
-  .container-wrap {
-    margin-bottom: 0;
-  }
-}
-
-.contributors {
-  width: 870px;
-  margin: 0 auto;
-  padding: 80px 0 0 0;
-}
-.contributors__title {
-  text-align: center;
-  color: @color_2;
-  opacity: .6;
-  padding: 24px 0;
-}
-.contributors__list {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-pack: center;
-  justify-content: center;
-}
-.contributor {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-align: center;
-  align-items: center;
-  width: 210px;
-  height: 92px;
-}
-.contributor__pic {
-  width: 60px;
-  height: 60px;
-  border-radius: 50%;
-  box-shadow: 0 2px 8px 0 #394C97;
-  background-size: cover;
-}
-.contributor--gcaufy {
-  .contributor__pic {
-    background-image: url(../img/contributors/gcaufy.png);
-  }
-}
-.contributor--bruce {
-  .contributor__pic {
-    background-image: url(../img/contributors/bruce.png);
-  }
-}
-.contributor--sail {
-  .contributor__pic {
-    background-image: url(../img/contributors/sail.png);
-  }
-}
-.contributor__info {
-  padding: 0 0 0 16px;
-  color: @color_2;
-}
-.contributor__info__name {
-  font-family: font_family_1;
-  line-height: 16px;
-}
-.contributor__info__position {
-  font-size: 14px;
-  color: @color_8;
-}
diff --git a/docs/less/components/examples/style.less b/docs/less/components/examples/style.less
deleted file mode 100644
index 8996d59be..000000000
--- a/docs/less/components/examples/style.less
+++ /dev/null
@@ -1,135 +0,0 @@
-.examples {
-  margin: 50px auto 30px;
-  //width: auto;
-  //display: -ms-flexbox;
-  //display: flex;
-  //-ms-flex-wrap: wrap;
-  //flex-wrap: wrap;
-  //-ms-flex-line-pack: start;
-  //align-content: flex-start;
-  //-ms-flex-pack: justify;
-  //justify-content: space-between;
-
-}
-.example {
-  display: block;
-  text-decoration: none;
-  width: 19%;
-  opacity: 0;
-  //padding: 10px;
-  //transform: translate3d(0, 20px, 0);
-  transition: transform .6s ease, opacity .4s ease;
-  transition-delay: .1s;
-  &:hover {
-    .example__inner {
-      transform: translate3d(0, -2px, 0);
-      box-shadow: 0px 4px 20px 0px rgba(0, 0, 0, 0.1);
-    }
-  }
-}
-.slide--shown {
-  .example {
-    opacity: 1;
-    transform: translate3d(0, 0, 0);
-  }
-  .example__icon-inner {
-    -ms-transform: scale(1);
-    transform: scale(1);
-    opacity: 1;
-  }
-  -ms-transform: scale(1);
-  transform: scale(1);
-  opacity: 1;
-}
-.example.example--plus {
-  display: -ms-flexbox;
-  display: flex;
-  a.example--plus__link {
-    text-align: center;
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-direction: column;
-    flex-direction: column;
-    -ms-flex-align: center;
-    align-items: center;
-    -ms-flex-pack: center;
-    justify-content: center;
-  }
-}
-.example__inner {
-  background-color: @background_color_10;
-  height: 200px;
-  margin: 10px;
-  box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.1);
-  border-radius: 8px;
-  padding: 20px;
-  position: relative;
-  transition: box-shadow .3s ease, transform .3s ease;
-}
-.example__title {
-  font-size: 15px;
-  line-height: 15px;
-  font-family: font_family;
-  margin: 0 0 10px 0;
-}
-.example__description {
-  font-size: 14px;
-  line-height: 20px;
-  color: @color_7;
-  opacity: .8;
-}
-.example__wximage {
-  display: block;
-  width: 160px;
-  height: 160px;
-  -ms-transform: scale(1);
-  transform: scale(1);
-  transition: transform 0.4s cubic-bezier(0.175, 0.885, 0.135, 1.425);
-}
-.example__icon {
-  display: block;
-  width: 72px;
-  height: 72px;
-  margin: 0 0 10px 0;
-  -ms-transform: scale(1);
-  transform: scale(1);
-  transition: transform 0.4s cubic-bezier(0.175, 0.885, 0.135, 1.425);
-}
-.example--plus {
-  &:hover {
-    .example__icon {
-      -ms-transform: scale(1.12);
-      transform: scale(1.12);
-    }
-  }
-  .example__description {
-    text-align: center;
-    display: inline-block;
-    width: 80%;
-  }
-}
-.example__icon-inner {
-  width: 72px;
-  height: 72px;
-  background-image: url(../img/plus.svg);
-  background-repeat: no-repeat;
-  background-size: cover;
-  opacity: 0;
-  -ms-transform: scale(0.6);
-  transform: scale(0.6);
-  transition: transform 0.4s cubic-bezier(0.175, 0.885, 0.135, 1.425), opacity 0.2s ease;
-  transition-delay: 1.2s;
-}
-.example__image {
-  width: 160px;
-  height: 160px;
-  border-radius: 50%;
-  text-align: center;
-  display: block;
-  text-align: center;
-  //position: absolute;
-  //left: 15%;
-  bottom: 20px;
-  background-color: @background_color_10;
-  background-size: cover;
-}
\ No newline at end of file
diff --git a/docs/less/components/footer/style.less b/docs/less/components/footer/style.less
deleted file mode 100644
index e88722e6f..000000000
--- a/docs/less/components/footer/style.less
+++ /dev/null
@@ -1,148 +0,0 @@
-.footer {
-  position: fixed;
-  width: 100%;
-  bottom: 0;
-  left: 0;
-  z-index: -1;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-pack: center;
-  justify-content: center;
-  background-color: @background_color_11;
-}
-.footer.footer--page {
-  position: static;
-  margin: -96px 0 0 0;
-  border-top: 56px solid #4A5C69;
-}
-.footer-inner {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-pack: justify;
-  justify-content: space-between;
-  width: 1080px;
-}
-.footer--copyright {
-  color: @color_2;
-  opacity: .5;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-pack: justify;
-  justify-content: space-between;
-  padding: 65px 0 75px 0;
-}
-.footer-logo-wrap {
-  width: 280px;
-  display: -ms-flexbox;
-  display: flex;
-}
-.footer-logo-wrap__inner {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-pack: justify;
-  justify-content: space-between;
-  padding: 65px 0 75px 0;
-}
-.footer-logo {
-  width: 52px;
-  height: 52px;
-  background-size: 52px;
-  background-image: url(../img/wepylogo.png);
-}
-.footer-header {
-  color: @color_2;
-  opacity: .5;
-  font-size: 18px;
-  margin: 0 0 40px 0;
-}
-.footer-link {
-  height: 32px;
-  line-height: 32px;
-  font-size: 16px;
-  margin: 0 0 15px 0;
-  a {
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-align: center;
-    align-items: center;
-    color: @color_2;
-    &:hover {
-      opacity: .8;
-    }
-  }
-}
-.footer-icon {
-  display: inline-block;
-  width: 32px;
-  height: 32px;
-  background-color: @background_color_12;
-  border-radius: 50%;
-  margin: 0 15px 0 0;
-  background-repeat: no-repeat;
-  background-size: 24px;
-  background-position: center;
-}
-
-@media (max-width: 1140px) {
-  .footer-inner {
-    width: 820px;
-    -ms-flex-pack: distribute;
-    justify-content: space-around;
-  }
-  .footer-logo-wrap {
-    width: 200px;
-  }
-}
-@media (max-width: 767px) {
-  .footer {
-    position: static;
-    border-top: 0px;
-  }
-  .footer.footer--page {
-    border-top: 100px solid #4A5C69;
-  }
-  .footer-inner {
-    padding: 30px 0 0 0;
-    -ms-flex-direction: column;
-    flex-direction: column;
-  }
-  .footer--copyright {
-    padding: 20px 30px;
-  }
-  .footer-logo-wrap {
-    width: auto;
-    -ms-flex-order: 2;
-    order: 2;
-  }
-  .footer-header {
-    margin: 0 0 10px 0;
-  }
-  .footer-logo-wrap__inner {
-    width: 100%;
-    padding: 0 0 40px 0;
-    -ms-flex-align: center;
-    align-items: center;
-    text-align: center;
-  }
-  .footer-link {
-    text-align: center;
-    height: 24px;
-    line-height: 24px;
-    margin: 0 0 10px 0;
-    a {
-      -ms-flex-pack: center;
-      justify-content: center;
-      text-align: center;
-    }
-  }
-  .footer-icon {
-    display: none;
-  }
-  .footer-logo {
-    display: none;
-  }
-}
diff --git a/docs/less/components/header/style.less b/docs/less/components/header/style.less
deleted file mode 100644
index 717fb7a4c..000000000
--- a/docs/less/components/header/style.less
+++ /dev/null
@@ -1,225 +0,0 @@
-.header-wrap {
-  margin: 30px 0 0 0;
-  width: 1080px;
-  height: 130px;
-  background-color: @background_color_4;
-  background-image: url(../img/dot.svg);
-  box-shadow: 0px 10px 14px 0px rgba(79, 90, 166, 0.35);
-  border-top-left-radius: 10px;
-  border-top-right-radius: 10px;
-  transform: translate3d(0, 0, 0);
-  transition: transform .6s ease, opacity .3s ease;
-}
-.header {
-  position: absolute;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-pack: center;
-  justify-content: center;
-  width: 100%;
-  z-index: 900;
-  top: 40px;
-  left: 0;
-  .nav {
-    a {
-      color: @color_2;
-      outline: 0px;
-    }
-  }
-}
-.header__inner {
-  width: 1012px;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-pack: justify;
-  justify-content: space-between;
-}
-
-.nav {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-align: start;
-  align-items: flex-start;
-  a {
-    font-family: @font_family_1;
-    font-size: 15px;
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-align: center;
-    align-items: center;
-    padding: 10px 15px 15px;
-    &:hover {
-      opacity: .9;
-    }
-  }
-}
-a.logo {
-  display: -ms-flexbox;
-  display: flex;
-  width: 260px;
-  -ms-flex-wrap: nowrap;
-  flex-wrap: nowrap;
-  -ms-flex-pack: start;
-  justify-content: flex-start;
-  -ms-flex-align: start;
-  align-items: flex-start;
-}
-.logo__icon {
-  height: 52px;
-  width: 52px;
-  background-image: url(../img/wepylogo.png);
-  background-size: 52px;
-  background-position: left;
-}
-.logo_text {
-  margin: 2px 0 0 8px;
-}
-.logo__title {
-  display: block;
-  font-family: @font_family_1;
-  font-size: 22px;
-  line-height: 25px;
-  color: @color_2;
-}
-.logo__description {
-  display: block;
-  font-size: 15px;
-  line-height: 25px;
-  color: @color_2;
-  opacity: .8;
-}
-.shares {
-  width: 260px;
-  height: 50px;
-  .social-links {
-    -ms-flex-pack: end;
-    justify-content: flex-end;
-  }
-}
-.social-links {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-pack: center;
-  justify-content: center;
-  li.social-link {
-    margin: 0 5px;
-  }
-}
-li.social-link {
-  a {
-    display: block;
-    width: 40px;
-    height: 40px;
-    border-radius: 50%;
-    background: rgba(255,255,255,0.20);
-    background-repeat: no-repeat;
-    background-size: 20px;
-    background-position: center;
-    transition: transform .2s ease;
-    cursor: pointer;
-    //box-shadow: 0 10px 10px 0 rgba(62, 76, 167, 0.25);
-  }
-}
-.social-link.social-link--wx {
-  a {
-    color: #1F9948;
-    background-image: url(../img/icon_wechat.svg);
-  }
-}
-.social-link.social-link--gh {
-  a {
-    background-image: url(../img/icon_gh.svg);
-  }
-}
-.social-link {
-  &:hover {
-    a {
-      -ms-transform: scale(1.06);
-      transform: scale(1.06);
-    }
-  }
-}
-@media (max-width: 1440px) {
-  .header {
-    top: 0;
-  }
-  .header__inner {
-    width: 100%;
-    margin: 40px;
-    -ms-flex-align: center;
-    align-items: center;
-  }
-  .header-wrap {
-    margin: 0 0 0 0;
-    width: 100%;
-  }
-}
-@media (max-width: 960px) {
-  
-  a.logo {
-    width: auto;
-  }
-  .shares {
-    width: auto;
-  }
-}
-@media (max-width: 840px) {
-  .header__inner {
-    margin: 30px;
-  }
-}
-@media (max-width: 767px) {
-  .header__inner {
-    margin: 20px 20px 20px 17px;
-    -ms-flex-align: start;
-    align-items: flex-start;
-    display: inline-block;
-  }
-  .header-wrap {
-    height: 92px;
-    border-radius: 0;
-  }
-  .logo__icon {
-    height: 48px;
-    width: 48px;
-    background-size: 48px;
-    -ms-flex-negative: 0;
-    flex-shrink: 0;
-    flex-grow: 0;
-  }
-  .logo__title {
-    font-size: 18px;
-    line-height: 24px;
-  }
-  .logo__description {
-    font-size: 14px;
-    line-height: 15px;
-    span {
-      display: none;
-    }
-  }
-  .logo_text {
-    margin: 0px 0 0 4px;
-  }
-  .nav a {
-    padding: 5px;
-    font-size: .82em;
-  }
-  .tagline__title {
-    display: none;
-  }
-  .tagline__body {
-    display: none;
-  }
-  .shares {
-    justify-content: center;
-    display: flex;
-    margin-bottom: 50px;
-    .social-links {
-      li.social-link {
-        margin: 0 0 0 7px;
-      }
-    }
-  }
-}
-
diff --git a/docs/less/components/modal/style.less b/docs/less/components/modal/style.less
deleted file mode 100644
index 069d8212d..000000000
--- a/docs/less/components/modal/style.less
+++ /dev/null
@@ -1,37 +0,0 @@
-.modal-container {
-    position: fixed;
-    width: 100%;
-    height: 100%;
-    top: 0;
-    left: 0;
-    opacity: 0;
-    visibility: hidden;
-    cursor: pointer;
-    overflow-y: auto;
-    z-index: 3;
-    font-family: 'Lato', 'Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif';
-    font-size: 14px;
-    -webkit-transition: all 0.25s linear;
-    -moz-transition: all 0.25s linear;
-    -o-transition: all 0.25s linear;
-    -ms-transition: all 0.25s linear;
-    transition: all 0.25s linear;
-}
-.modal-container.active {
-    opacity: 1;
-    visibility: visible;
-}
-.modal-container .qr-modal {
-    border-radius: 8px;
-    box-shadow: 0 24px 80px -2px rgb(6, 122, 31)!important;
-    transition: box-shadow 1s;
-    position: relative;
-    margin: 50px auto;
-    width: 90%;
-    padding: 20px;
-    max-width: 380px;
-    text-align: center;
-    font-weight: bold;
-    background-color: #f6f6f6;
-    cursor: initial;
-}
\ No newline at end of file
diff --git a/docs/less/components/table/style.less b/docs/less/components/table/style.less
deleted file mode 100644
index c2865dea9..000000000
--- a/docs/less/components/table/style.less
+++ /dev/null
@@ -1,87 +0,0 @@
-table.table {
-    line-height: 26px;
-    width: 100%;
-    margin-bottom: 20px;
-}
-
-table.table.border {
-    border: 1px solid #E3E6E9;
-}
-
-table.table.stripe tbody tr:nth-child(2n + 1) td {
-    background: rgba(245, 246, 250, 0.6);
-}
-
-table.table.hover tbody tr:hover td,
-table.table.hover tbody tr:hover th {
-    background: #F5F6FA;
-}
-
-@media (max-width: 768px) {
-    table.table.responsive {
-        border-top: 0;
-    }
-}
-
-table.table.responsive tr th {
-    display: table-cell;
-}
-
-@media (max-width: 768px) {
-    table.table.responsive tr th {
-        display: none;
-    }
-}
-
-table.table.responsive tr td {
-    display: table-cell;
-}
-
-@media (max-width: 768px) {
-    table.table.responsive tr td {
-        display: block;
-        padding-left: 42%;
-        padding-bottom: 0;
-        padding-right: 15px;
-        position: relative;
-        border: 0;
-    }
-}
-
-table.table.responsive tr td:first-child {
-    border-top: 1px solid #E3E6E9;
-}
-
-table.table.responsive tr td:last-child {
-    padding-bottom: 10px;
-}
-
-table.table.responsive tr td:before {
-    content: attr(data-th) ": ";
-    color: #454954;
-    font-weight: normal;
-    display: none;
-    position: absolute;
-    left: 15px;
-    top: 10px;
-    width: 42%;
-}
-
-@media (max-width: 768px) {
-    table.table.responsive tr td:before {
-        display: block;
-    }
-}
-
-table.table tr th {
-    color: #454954;
-    padding: 10px 15px;
-    background: none;
-    font-weight: normal;
-}
-
-table.table tr td {
-    padding: 10px 15px;
-    border-top: 1px solid #E3E6E9;
-    background: none;
-}
\ No newline at end of file
diff --git a/docs/less/components/tagline/style.less b/docs/less/components/tagline/style.less
deleted file mode 100644
index 93f0346e4..000000000
--- a/docs/less/components/tagline/style.less
+++ /dev/null
@@ -1,192 +0,0 @@
-.tagline {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-pack: center;
-  justify-content: center;
-  position: absolute;
-  z-index: 200;
-  text-align: center;
-  width: 100%;
-  display: inline-block;
-  top: 200px;
-  .tagline__title {
-    font-family: font_family_1;
-    color: @color_2;
-    font-size: 25px;
-    line-height: 35px;
-    letter-spacing: 1px;
-    font-weight: 500;
-    margin: 0 0 5px 0;
-    opacity: 0;
-    transform: translate3d(0, 20px, 0);
-    transition: transform .6s ease, opacity .6s ease;
-    transition-delay: .1s;
-  }
-  .tagline__body {
-    color: @color_2;
-    font-size: 18px;
-    line-height: 25px;
-    letter-spacing: 1px;
-    margin: 0 0 20px 0;
-    opacity: 0;
-    //opacity: .8;
-    transform: translate3d(0, 20px, 0);
-    transition: transform .6s ease, opacity .6s ease;
-    transition-delay: .2s;
-  }
-}
-.shown {
-  .tagline__title {
-    opacity: 1;
-    transform: translate3d(0, 0, 0);
-  }
-  .tagline__body {
-    opacity: .8;
-    transform: translate3d(0, 0, 0);
-  }
-  .tagline__shieds {
-    opacity: 1;
-    transform: translate3d(0, 0, 0);
-  }
-  .tagline__footer {
-    opacity: 1;
-    transform: translate3d(0, 0, 0);
-  }
-}
-.tagline__button {
-  display: -ms-flexbox;
-  display: flex;
-  justify-content: center;
-  transform: translate3d(0, 20px, 0);
-  transition: transform .6s ease, opacity .6s ease;
-  transition-delay: .3s;
-  .button.button--secondary {
-    font-size: 16px;
-    border: #fff 2px solid;
-    color: #353535;
-    background-color: @background_light;
-    box-shadow: 0 0 1px 1px rgba(0,0,0,0.10), 0 2px 2px 0 rgba(0,0,0,0.10);
-    border-radisu: 8px;
-    width: 180px;
-  }
-}
-.tagline__shieds {
-  margin-top: 60px;
-  transform: translate3d(0, 20px, 0);
-  transition: transform .6s ease, opacity .6s ease;
-  transition-delay: .3s;
-}
-.tagline__shieds--social {
-  display: block;
-  margin-bottom: 20px;
-}
-.tagline__footer {
-  text-align: center;
-  color: @color_2;
-  margin: 0 auto;
-  padding: 25px;
-  width: 200px;
-  font-size: 16px;
-  line-height: 24px;
-  opacity: 0;
-  transform: translate3d(0, 20px, 0);
-  transition: transform .6s ease, opacity .6s ease;
-  transition-delay: .3s;
-  display: none;
-}
-.tagline__footer-inner {
-  transition: opacity .2s ease;
-}
-.tagline__footer.tagline__footer--hidden {
-  .tagline__footer-inner {
-    opacity: 0;
-  }
-}
-.button.button--secondary {
-  box-shadow: none;
-  &:hover {
-    color: @color_2;
-    //border: #1F9948 2px solid;
-    background-color: @background_color_8;
-  }
-}
-.button.button--more {
-  padding: 0 35px;
-  transform: translate3d(-50%, 0, 0);
-  position: absolute;
-  bottom: 30px;
-  left: 50%;
-  transition: transform .2s ease, background-color .2s ease;
-  &:active {
-    transform: translate3d(-50%, 0, 0) scale(0.99);
-  }
-}
-
-@media (max-width: 1220px) {
-  .tagline {
-    left: 65px;
-  }
-}
-@media (max-width: 1030px) {
-  .tagline {
-    width: 300px;
-    top: 230px;
-  }
-}
-@media (max-width: 1140px) {
-  .tagline {
-    -ms-flex-pack: start;
-    justify-content: flex-start;
-    text-align: left;
-    left: 40px;
-  }
-}
-@media (max-width: 960px) {
-  .tagline {
-    width: 280px;
-  }
-}
-@media (max-width: 922px) {
-  .tagline {
-    width: 260px;
-    top: 180px;
-  }
-}
-@media (max-width: 840px) {
-  .tagline {
-    left: 30px;
-    width: 246px;
-    .tagline__title {
-      font-size: 21px;
-      line-height: 35px;
-      margin: 0 0 0 0;
-    }
-    .tagline__body {
-      font-size: 16px;
-      line-height: 24px;
-      margin: 0 0 10px 0;
-    }
-  }
-}
-@media (max-width: 767px) {
-  .tagline {
-    position: static;
-    -ms-flex-direction: column;
-    flex-direction: column;
-    width: auto;
-    left: 0;
-    top: 0;
-    margin: 180px 0 0px 0;
-    padding: 0 20px;
-    width: auto;
-    .tagline__body {
-      margin: 0 0 10px 0;
-    }
-  }
-  .tagline__footer {
-    display: block;
-    margin-top: 24px;
-  }
-}
\ No newline at end of file
diff --git a/docs/less/components/tooltip/style.less b/docs/less/components/tooltip/style.less
deleted file mode 100644
index 127f1e17f..000000000
--- a/docs/less/components/tooltip/style.less
+++ /dev/null
@@ -1,67 +0,0 @@
-/** https://github.com/codrops/TooltipAnimations **/
-.tooltip {
-  position: relative;
-  display: inline-block;
-}
-
-.tooltip__trigger {
-  cursor: pointer;
-  position: relative;
-}
-
-.tooltip__trigger-text {
-  display: block;
-  padding: 0.85em;
-  pointer-events: none;
-}
-
-.tooltip__base {
-  position: absolute;
-  bottom: 2em;
-  left: 50%;
-  margin-left: -420px;
-  width: 420px;
-  height: 300px;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  opacity: 0;
-  pointer-events: none;
-}
-
-.tooltip__content {
-  color: #323232;
-  display: flex;
-  position: relative;
-  align-items: center;
-  justify-content: center;
-  width: 320px;
-  padding: 0 1em;
-  opacity: 0;
-  flex-direction: column;
-  //font-size: 14px;
-  font-size: 1.1em;
-  font-weight: 500;
-  .qrcode {
-    width: 123px;
-    height: 123px;
-    position: relative;
-    justify-content: center;
-    display: inline-block;
-    float: left;
-  }
-}
-
-.tooltip__shape,
-.tooltip__deco {
-  position: absolute;
-  width: 100%;
-  height: 100%;
-  top: 0;
-  left: 0;
-}
-
-.tooltip__shape {
-  fill: @background_color_light1;
-}
-
diff --git a/docs/less/donate.less b/docs/less/donate.less
deleted file mode 100644
index 565c9f9a0..000000000
--- a/docs/less/donate.less
+++ /dev/null
@@ -1,599 +0,0 @@
-@import "shared/_reset";
-@import "shared/_colors";
-@import "shared/_typography";
-@import "components/button/style";
-@import "components/table/style";
-@import "components/footer/style";
-@import "components/modal/style";
-@import "_main";
-.header {
-    background: linear-gradient(90deg, #1F9948 50%, #1F9548 50%);
-}
-
-.header-pattern {
-    background-image: url(../img/dot.svg);
-    background-size: 20px;
-    background-position: left top;
-    background-repeat: repeat;
-    padding-bottom: 134px;
-    img {
-        width: 160px;
-        height: 160px;
-    }
-}
-
-@media (min-width: 1230px) {
-    .header {
-        margin: 0 auto;
-        margin-top: 40px;
-        border-radius: 10px;
-        z-index: 900;
-        max-width: 1200px;
-    }
-}
-
-.header__inner {
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-direction: column;
-    flex-direction: column;
-    -ms-flex-pack: justify;
-    justify-content: space-between;
-    padding: 16px 0 0 16px;
-}
-
-@media (min-width: 640px) {
-    .header__inner {
-        -ms-flex-direction: row;
-        flex-direction: row;
-        padding: 40px 0 38px 40px;
-    }
-}
-
-.header-section {
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-align: center;
-    align-items: center;
-}
-
-.header-section--center {
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-pack: center;
-    justify-content: center;
-}
-
-@media (min-width: 640px) {
-    .header-section--right {
-        -ms-flex-pack: end;
-        justify-content: flex-end;
-    }
-}
-
-.nav {
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-align: center;
-    align-items: center;
-    opacity: 1;
-}
-
-.nav__item:first-child {
-    padding-left: 0;
-}
-
-a.logo {
-    display: -ms-flexbox;
-    display: flex;
-    width: 260px;
-    -ms-flex-wrap: nowrap;
-    flex-wrap: nowrap;
-    -ms-flex-pack: start;
-    justify-content: flex-start;
-    -ms-flex-align: start;
-    align-items: flex-start;
-}
-
-.logo__icon {
-    height: 52px;
-    width: 52px;
-    background-image: url(../img/wepylogo.png);
-    background-size: 52px;
-    background-position: left;
-}
-
-.logo_text {
-    margin: 2px 0 0 8px;
-}
-
-.logo__title {
-    display: block;
-    font-family: @font_family_1;
-    font-size: 22px;
-    line-height: 25px;
-    color: @color_2;
-}
-
-.logo__description {
-    display: block;
-    font-size: 15px;
-    line-height: 25px;
-    color: @color_2;
-    opacity: .8;
-}
-
-.nav a {
-    font-size: 15px;
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-align: center;
-    align-items: center;
-    padding: 15px 15px;
-}
-
-.header .nav a {
-    color: #ffffff;
-    transition: opacity .2s ease;
-    position: relative;
-}
-
-.header .nav a:hover {
-    opacity: 0.5;
-}
-
-.nav a:hover {
-    opacity: .9;
-}
-
-.shares {
-    margin-right: 30px;
-    width: 260px;
-    height: 50px;
-    .social-links {
-        -ms-flex-pack: end;
-        justify-content: flex-end;
-    }
-}
-
-.social-links {
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-pack: center;
-    justify-content: center;
-    li.social-link {
-        margin: 0 5px;
-    }
-}
-
-li.social-link {
-    a {
-        display: block;
-        width: 40px;
-        height: 40px;
-        border-radius: 50%;
-        background: rgba(255, 255, 255, 0.20);
-        background-repeat: no-repeat;
-        background-size: 20px;
-        background-position: center;
-        transition: transform .2s ease;
-        cursor: pointer; //box-shadow: 0 10px 10px 0 rgba(62, 76, 167, 0.25);
-    }
-}
-
-.social-link.social-link--wx {
-    a {
-        color: #1F9948;
-        background-image: url(../img/icon_wechat.svg);
-    }
-}
-
-.social-link.social-link--gh {
-    a {
-        color: #343332;
-        background-image: url(../img/icon_gh.svg);
-    }
-}
-
-.social-link {
-    &:hover {
-        a {
-            -ms-transform: scale(1.06);
-            transform: scale(1.06);
-        }
-    }
-}
-
-@media (max-width: 1440px) {
-    .header {
-        top: 0;
-    }
-    .header__inner {
-        width: 100%;
-        margin: 40px;
-        -ms-flex-align: center;
-        align-items: center;
-    }
-    .header-wrap {
-        margin: 0 0 0 0;
-        width: 100%;
-    }
-}
-
-@media (max-width: 960px) {
-    a.logo {
-        width: auto;
-    }
-    .shares {
-        position: absolute;
-        top: 30px;
-        right: -10px;
-        width: auto;
-    }
-}
-
-@media (max-width: 767px) {
-    .header__inner {
-        margin: 0px;
-        -ms-flex-align: start;
-        align-items: flex-start;
-    }
-    .header-wrap {
-        height: 92px;
-        border-radius: 0;
-    }
-    .logo__icon {
-        height: 48px;
-        width: 48px;
-        background-size: 48px;
-        -ms-flex-negative: 0;
-        flex-shrink: 0;
-        flex-grow: 0;
-    }
-    .logo__title {
-        font-size: 18px;
-        line-height: 24px;
-    }
-    .logo__description {
-        font-size: 14px;
-        line-height: 15px;
-        span {
-            display: none;
-        }
-    }
-    .logo_text {
-        margin: 0px 0 0 4px;
-    }
-    .nav {
-        display: none;
-    }
-    .shares {
-        display: none;
-    }
-}
-
-.actions {
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-direction: column;
-    flex-direction: column;
-    text-align: center;
-    -ms-flex-pack: space-evenly;
-    justify-content: space-evenly;
-}
-
-@media (min-width: 640px) {
-    .actions {
-        -ms-flex-direction: row;
-        flex-direction: row;
-    }
-}
-
-.action {
-    -ms-flex-preferred-size: 0;
-    flex-basis: 0;
-    -ms-flex-positive: 1;
-    flex-grow: 1;
-    margin-top: 24px;
-}
-
-@media (min-width: 640px) {
-    .actions {
-        margin-top: 64px;
-    }
-}
-
-.action h1 {
-    font-size: 13px;
-    font-weight: 500;
-    margin-bottom: 7px;
-    line-height: 1.15;
-    letter-spacing: 1.1px;
-    text-align: center;
-    text-transform: uppercase;
-    color: #ffffff;
-}
-
-.action h2 {
-    font-size: 25px;
-    font-weight: 500;
-    margin-bottom: 6px;
-    line-height: 1.36;
-    text-align: center;
-    color: #ffffff;
-}
-
-.action p {
-    opacity: 0.6;
-    font-size: 18px;
-    line-height: 25px;
-    margin: 0 auto 26px;
-    max-width: 400px;
-    text-align: center;
-    color: #ffffff;
-}
-
-.container {
-    margin: 0 auto;
-    overflow: hidden;
-    position: relative;
-    background-color: #f2f5f8;
-}
-
-.container.container--page {
-    min-height: 500px;
-}
-
-.slides {
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-direction: column;
-    flex-direction: column;
-    background: #f2f5f8;
-}
-
-.slide {
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-direction: column;
-    flex-direction: column;
-    -ms-flex-align: center;
-    align-items: center;
-}
-
-.slide__text {
-    h2 {
-        font-size: 24px;
-        font-weight: 500;
-        line-height: 2;
-        text-align: center;
-        color: #42505c;
-    
-    }
-    .text {
-        max-width: 520px;
-        font-size: 16px;
-        font-weight: 500;
-        line-height: 1.65;
-        text-align: center; 
-    }
-    strong {
-        color: @primary;
-    }
-    .button {
-        display: inline-block;
-        width: 180px;
-        height: 45px;
-        margin-top: 16px;
-        border-radius: 8px;
-        background-color: #57a7ed;
-        transition: opacity .2s ease;
-    }
-    .button--pr {
-        background: @primary;
-        box-shadow: none;
-        transition: box-shadow 0.3s ease, transform 0.3s ease;
-        &:hover {
-          // background: rgba(31, 153, 72, 0.60);
-          box-shadow: 0 8px 30px 2px rgba(28, 216, 87, 0.50);
-        }
-      }
-}
-
-.slide--hidden {
-    display: none;
-}
-
-.slide__inner {
-    position: relative;
-}
-
-.slide.slide--one .slide__inner {
-    width: 1200px;
-    position: relative;
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-pack: center;
-    justify-content: center;
-    -ms-flex-align: center;
-    align-items: center;
-    -ms-flex-direction: column;
-    flex-direction: column;
-}
-
-.slide.slide--three .slide__inner {
-    text-align: center;
-    margin: 0 0 60px 0;
-}
-
-.hero-image-wrap {
-    width: 300px;
-    height: 240px;
-}
-
-.tagline {
-    text-align: center;
-}
-
-.tagline .tagline__title {
-    color: #ffffff;
-    font-size: 34px;
-    line-height: 31px;
-    margin: 0 16px 10px 16px;
-    padding: 16px 0;
-    border-bottom: 1px rgba(255, 255, 255, 0.3) solid;
-}
-
-@media (min-width: 640px) {
-    .tagline {
-        padding: 0 16px;
-    }
-    .tagline .tagline__title {
-        border: none;
-        padding: 0 24px;
-        margin: 0;
-    }
-}
-
-.shown .tagline__title {
-    opacity: 1;
-    transform: translate3d(0, 0, 0);
-}
-
-.tagline .tagline__body {
-    color: #ffffff;
-    font-size: 17px;
-    line-height: 24px;
-    margin: 0 0 20px 0;
-    opacity: 0.5;
-}
-
-.shown .tagline__body {
-    opacity: .5;
-    transform: translate3d(0, 0, 0);
-}
-
-@media (max-width: 1200px) {
-    .slide.slide--one .slide__inner {
-        width: 100%;
-    }
-}
-
-@media (max-width: 740px) {
-    .tagline .tagline__title {
-        font-size: 22px;
-        line-height: 26px;
-    }
-    .tagline .tagline__body {
-        padding: 0 24px;
-    }
-}
-
-.slide.slide--two .slide__inner {
-    background: #FFFFFF;
-    margin: 0 0 0 0;
-}
-
-@media (min-width: 1200px) {
-    .slide.slide--two .slide__inner {
-        top: -72px;
-        width: 1150px;
-        background: #FFFFFF;
-        box-shadow: 0 5px 16px 0 rgba(230, 235, 238, 0.68);
-        border-radius: 8px;
-    }
-}
-
-@media (max-width: 1200px) {
-    .slide.slide--two .slide__inner {
-        width: 100%;
-        border-radius: 0;
-    }
-}
-
-.section {
-    display: -ms-flexbox;
-    display: flex;
-}
-
-.section--title {
-    font-family: @font_family;
-    font-weight: bold;
-    font-size: 24px;
-    font-weight: 500;
-    line-height: 1.42;
-    text-align: center;
-    margin-top: 20px;
-    margin-left: 40px;
-    margin-right: 40px;
-    color: #42505c;
-}
-
-@media (min-width: 640px) {
-    .section--title {
-        margin-top: 50px;
-        margin-bottom: 20px;
-    }
-}
-
-.section__content {
-    padding: 30px;
-    -ms-flex-positive: 1;
-    flex-grow: 1;
-    -ms-flex-preferred-size: 0;
-    flex-basis: 0;
-}
-
-.section__content h1 {
-    padding: 8px 16px;
-    margin: 16px auto;
-    width: -webkit-fit-content;
-    width: -moz-fit-content;
-    width: fit-content;
-    border-radius: 100px;
-    font-size: 13px;
-    font-weight: 500;
-    line-height: 1.15;
-    letter-spacing: 1.1px;
-    text-align: center;
-    text-transform: uppercase;
-}
-
-.section__content h2 {
-    font-size: 19px;
-    font-weight: 500;
-    line-height: 1.26;
-    text-align: left;
-    color: #42505c;
-    margin-bottom: 14px;
-}
-
-.section__content .text+h2 {
-    margin-top: 30px;
-}
-
-.section__content .text {
-    font-size: 18px;
-    color: #8D99A4;
-    line-height: 1.44;
-}
-
-.section__content .text strong {
-    font-weight: 500;
-    color: #42505c;
-}
-
-@media (max-width: 740px) {
-    .section {
-        height: auto;
-        -ms-flex-direction: column;
-        flex-direction: column;
-    }
-    .section__image {
-        height: 260px;
-    }
-    .section__content {
-        width: 90%;
-        padding: 24px 30px 24px 24px;
-    }
-}
\ No newline at end of file
diff --git a/docs/less/main.less b/docs/less/main.less
deleted file mode 100644
index 58c1ed158..000000000
--- a/docs/less/main.less
+++ /dev/null
@@ -1,12 +0,0 @@
-@import "shared/_reset";
-@import "shared/_colors";
-@import "shared/_typography";
-
-@import "_main";
-
-@import "_components";
-
-// Slides
-@import "_slides";
-
-@import "_vendor";
diff --git a/docs/less/shared/_colors.less b/docs/less/shared/_colors.less
deleted file mode 100644
index 837d42c89..000000000
--- a/docs/less/shared/_colors.less
+++ /dev/null
@@ -1,29 +0,0 @@
-@color_1: #49555f;
-@color_2: white;
-@color_3: rgba(255, 255, 255, 0.5);
-@color_4: #70808D;
-@color_5: #fff;
-@color_6: #6370CA;
-@color_7: #353535;
-@color_8: #68C0F8;
-@color_9: #8d99a4;
-@color_10: #78348c;
-@background_color_1: #F4F4F4;
-@background_color_2: #68c0f8;
-@background_color_3: #9ae8a3;
-@background_color_4: #4957b8;
-@background_color_5: #3F4A97;
-@background_color_6: #1F9948;
-@background_color_7: rgba(255, 255, 255, .1);
-@background_color_8: rgba(99, 112, 202, 0.1);
-@background_color_9: rgba(99, 112, 202, 0.2);
-@background_color_10: white;
-@background_color_11: #353535;
-@background_color_12: rgba(255, 255, 255, 0.1);
-@background_color_light1: rgba(255, 255, 255, 0.85);
-@background_color_13: #e4d6e8;
-@background_color_14: #dfc3e7;
-@primary: #1F9948;
-@color_second: #353535;
-@background_color_light: rgba(255, 255, 255, 0.1);
-@background_light: white;
\ No newline at end of file
diff --git a/docs/less/shared/_reset.less b/docs/less/shared/_reset.less
deleted file mode 100644
index 072244e7f..000000000
--- a/docs/less/shared/_reset.less
+++ /dev/null
@@ -1,79 +0,0 @@
-html, body, div, span, applet, object, iframe,
-h1, h2, h3, h4, h5, h6, p, blockquote, pre,
-a, abbr, acronym, address, big, cite, code,
-del, dfn, em, font, ins, kbd, q, s, samp,
-small, strike, strong, sub, sup, tt, var,
-dl, dt, dd, ol, ul, li,
-fieldset, form, label, legend,
-table, caption, tbody, tfoot, thead, tr, th, td {
-  border: 0;
-  font-family: inherit;
-  font-size: 100%;
-  font-style: inherit;
-  font-weight: inherit;
-  margin: 0;
-  outline: 0;
-  padding: 0;
-  vertical-align: baseline;
-}
-html {
-  font-size: 62.5%; /* Corrects text resizing oddly in IE6/7 when body font-size is set using em units http://clagnut.com/blog/348/#c790 */
-  overflow-y: scroll; /* Keeps page centred in all browsers regardless of content height */
-  -webkit-text-size-adjust: 100%; /* Prevents iOS text size adjust after orientation change, without disabling user zoom */
-  -ms-text-size-adjust: 100%; /* www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/ */
-}
-body {
-  background: #fff;
-}
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-nav,
-section {
-  display: block;
-}
-ol, ul {
-  list-style: none;
-}
-table { /* tables still need 'cellspacing="0"' in the markup */
-  border-collapse: separate;
-  border-spacing: 0;
-}
-caption, th, td {
-  font-weight: normal;
-  text-align: left;
-}
-blockquote:before, blockquote:after,
-q:before, q:after {
-  content: "";
-}
-blockquote, q {
-  quotes: "" "";
-}
-a:focus {
-  outline: thin dotted;
-}
-a:hover,
-a:active { /* Improves readability when focused and also mouse hovered in all browsers people.opera.com/patrickl/experiments/keyboard/test */
-  outline: 0;
-}
-a img {
-  border: 0;
-}
-
-// Reset the default styling on form inputs in Webkit/iOS
-input,
-textarea {
-  border-radius: 0;
-  appearance: none;
-}
-input[type="radio"],
-input[type="checkbox"] {
-  -webkit-appearance: none;
-}
diff --git a/docs/less/shared/_typography.less b/docs/less/shared/_typography.less
deleted file mode 100644
index 9bf325a8e..000000000
--- a/docs/less/shared/_typography.less
+++ /dev/null
@@ -1,5 +0,0 @@
-//@font_family: PingFang SC,Helvetica Neue,Helvetica,Arial,Hiragino Sans GB,Microsoft Yahei,\\5FAE\8F6F\96C5\9ED1,STHeiti,\\534E\6587\7EC6\9ED1,sans-serif;
-//@font_family_1: PingFang SC,Helvetica Neue,Helvetica,Arial,Hiragino Sans GB,Microsoft Yahei,\\5FAE\8F6F\96C5\9ED1,STHeiti,\\534E\6587\7EC6\9ED1,sans-serif;
-
-@font_family_1:  Helvetica,Arial,"Hiragino Sans GB","Source Han Sans CN",Roboto,"Microsoft Yahei",sans-serif;
-@font_family:  Helvetica,Arial,"Hiragino Sans GB","Source Han Sans CN",Roboto,"Microsoft Yahei",sans-serif;
diff --git a/docs/less/slides/slide-examples.less b/docs/less/slides/slide-examples.less
deleted file mode 100644
index a00fb78c7..000000000
--- a/docs/less/slides/slide-examples.less
+++ /dev/null
@@ -1,75 +0,0 @@
-.slide.slide--examples {
-    padding: 40px 0 40px 0;
-    margin-bottom: 80px;
-}
-
-.slide.slide--examples h2 {
-    display: block;
-    font-size: 1.5em;
-    -webkit-margin-before: 0.5em;
-    -webkit-margin-after: 0.5em;
-    -webkit-margin-start: 0px;
-    -webkit-margin-end: 0px;
-    font-weight: bold;
-}
-
-.examples__pr {
-    margin-top: 30px;
-    display: -ms-flexbox;
-    display: flex;
-    flex-direction: column;
-    -ms-flex-wrap: wrap;
-    flex-wrap: wrap;
-    -ms-flex-pack: center;
-    align-self: center;
-    align-items: center;
-    position: relative;
-    text-align: center;
-    width: 100%;
-    .button.button--pr {
-      background: @primary;
-      box-shadow: none;
-      width: 80px;
-      transition: box-shadow 0.3s ease, transform 0.3s ease;
-      &:hover {
-        // background: rgba(31, 153, 72, 0.60);
-        box-shadow: 0 8px 30px 2px rgba(28, 216, 87, 0.50);
-      }
-    }
-}
-
-@media (max-width: 767px) {
-    .carousel {
-        //background: #FAFAFA;
-        //margin-bottom: 30px;
-        //counter-reset: carousel-cell;
-    }
-    .carousel-cell {
-        width: 66%;
-        height: 210px;
-        margin-right: 10px;
-        margin-bottom: 10px;
-    }
-    .slide.slide--examples {
-        padding: 0;
-    }
-    .examples {
-        margin: 20px auto 10px;
-        width: auto;
-        padding: 0 10px;
-    }
-    .example__inner {
-        margin: 5px;
-        height: 180px;
-        padding: 15px;
-    }
-    .example {
-        width: auto;
-        opacity: 1;
-        transform: translate3d(0, 0, 0);
-    }
-    .example__image {
-        width: 160px;
-        height: 160px;
-    }
-}
\ No newline at end of file
diff --git a/docs/less/slides/slide-feature.less b/docs/less/slides/slide-feature.less
deleted file mode 100644
index b8f35cebd..000000000
--- a/docs/less/slides/slide-feature.less
+++ /dev/null
@@ -1,277 +0,0 @@
-.slide.slide--features {
-  position: relative;
-  top: -220px;
-  padding: 0 0 100px 0;
-  .slide__inner {
-    width: 1080px;
-    margin: 0 auto;
-    background: #fff;
-    box-shadow: 0 3px 6px 0 rgba(0, 0, 0, .1);
-    border-radius: 10px;
-  }
-}
-.section {
-  padding: 80px 100px;
-  &:first-child {
-    padding-top: 100px;
-  }
-  h2 {
-    display: block;
-    font-size: 1.2em;
-    -webkit-margin-before: 0.5em;
-    -webkit-margin-after: 0.5em;
-    -webkit-margin-start: 0px;
-    -webkit-margin-end: 0px;
-    font-weight: bold;
-  }
-  .title {
-    //font-family: font_family;
-    font-size: 24px;
-    padding: 16px 0 24px 0;
-    position: relative;
-    color: @primary;
-    &::before {
-      content: "";
-      position: absolute;
-      width: 32px;
-      height: 4px;
-      background-color: @primary;
-      top: -4px;
-      left: 0;
-    }
-  }
-  .text {
-    font-size: 18px;
-    line-height: 26px;
-    color: @color_second;
-    p {
-      padding: 0;
-    }
-  }
-}
-.features {
-  display: -ms-flexbox;
-  display: flex;
-  margin: 50px auto 30px;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-line-pack: start;
-  align-content: flex-start;
-  -ms-flex-pack: justify;
-  justify-content: space-between;
-}
-.features__icon {
-  display: inline-block;
-  width: 40px;
-  height: 40px;
-  background-size: 40px;
-  background-repeat: no-repeat;
-}
-
-.feature-item {
-  display: block;
-  text-decoration: none;
-  width: 33.3%;
-  background-color: @background_color_10;
-  border-radius: 8px;
-  position: relative;
-  transition: box-shadow .3s ease, transform .3s ease;
-  margin-bottom: 20px;
-}
-.feature-title {
-  font-size: 16px;
-  font-weight: 500;
-  color: #000;
-}
-.feature-text {
-  font-size: 14px;
-  line-height: 26px;
-  color: @color_second;
-  padding: 0 32px 0 0;
-  min-height: 78px;
-}
-.button.feature-button {
-  width: 160px;
-  line-height: 44px;
-  box-shadow: none;
-  background-color: @background_color_6;
-  color: @color_2;
-  margin: 24px 0 0 0;
-  &:hover {
-    background-color: @background_color_5;
-  }
-}
-.feature-icon-wrap {
-  height: 46px;
-}
-.feature-icon {
-  background-repeat: no-repeat;
-}
-.features-icon--style {
-  background-image: url(../img/fatures/icon_feature_style.svg);
-}
-.features-icon--component {
-  background-image: url(../img/fatures/icon_feature_component.svg);
-}
-.features-icon--npm {
-  background-size: 40px 40px;
-  background-image: url(../img/fatures/icon_feature_npm.svg);
-}
-//
-//.features__icon .features-icon--npm {
-  //background-size: 40px;
-  //background-size: 40px 40px;
-  //width: 40px;
-  //height: 40px;
-  //background-image: url(../img/fatures/icon_feature_npm.svg);
-//}
-.features-icon--es {
-  background-image: url(../img/fatures/icon_feature_es.svg);
-}
-.features-icon--promise {
-  background-size: 40px 40px;
-  background-image: url(../img/fatures/icon_feature_promise.svg);
-}
-.features-icon--optimize {
-  background-image: url(../img/fatures/icon_feature_optimize.svg);
-}
-.features-icon--compile {
-  background-size: 40px 40px;
-  background-image: url(../img/fatures/icon_feature_compile.svg);
-}
-.features-icon--plugin {
-  background-size: 40px 40px;
-  background-image: url(../img/fatures/icon_feature_plugin.svg);
-}
-.features-icon--size {
-  background-image: url(../img/fatures/icon_feature_size.svg);
-}
-@media (max-width: 1220px) {
-  .slide.slide--features {
-    .slide__inner {
-      width: 1100px;
-    }
-  }
-}
-@media (max-width: 1140px) {
-  .slide.slide--features {
-    width: 100%;
-    .slide__inner {
-      width: auto;
-      margin: 0 20px;
-    }
-  }
-}
-@media (max-width: 922px) {
-  .section {
-    &:first-child {
-      padding-top: 60px;
-    }
-  }
-  .slide.slide--features {
-    width: 100%;
-    .slide__inner {
-      width: auto;
-      margin: 0 20px;
-    }
-  }
-}
-
-@media (max-width: 767px) {
-  .features-wrap {
-    margin: 0;
-    top: 0;
-    height: auto;
-  }
-
-  .features {
-    margin: 0;
-    border-radius: 0;
-    height: auto;
-    -ms-flex-direction: column;
-    flex-direction: column;
-  }
-
-  .features-text {
-    margin: 0 0 0 10px;
-    padding: 25px 0;
-    border-bottom: 1px solid #EEF2F5;
-    h2 {
-        display: block;
-        font-size: 1.2em;
-        -webkit-margin-before: 0.5em;
-        -webkit-margin-after: 0.5em;
-        -webkit-margin-start: 0px;
-        -webkit-margin-end: 0px;
-        font-weight: bold;
-    }
-  }
-  .feature-title {
-    font-size: 16px;
-    line-height: 20px;
-  }
-  .feature-text {
-    min-height: auto;
-  }
-  .feature-item {
-    width: auto;
-    text-align: left;
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-align: center;
-    align-items: center;
-    margin: 0;
-
-  }
-  .section--enter {
-    padding: 60px 40px 12px 40px;
-  }
-  .slide.slide--features {
-    width: 100%;
-    position: relative;
-    margin: 0;
-    padding: 0;
-    top: -240px;
-    .slide__inner {
-      margin: 0;
-      display: -ms-flexbox;
-      display: flex;
-      width: 100%;
-      height: 100%;
-      -ms-flex-align: start;
-      align-items: flex-start;
-      -ms-flex-pack: justify;
-      justify-content: space-between;
-      //padding: 20px 80px;
-      background: white;
-      box-shadow: 0px -2px 18px 0px rgba(0, 0, 0, 0.10);
-    }
-  }
-
-  .features__icon {
-    width: 40px;
-    //height: 40px;
-    margin-right: 20px;
-    -ms-flex-negative: 0;
-    flex-shrink: 0;
-    -ms-flex-positive: 0;
-    flex-grow: 0;
-  }
-  //.features__item--component .features__icon {
-  //  background-size: 60px;
-  //}
-  .features__icon .features-icon--npm {
-      //background-size: 40px;
-    background-size: 40px 40px;
-    width: 40px;
-    height: 40px;
-    background-image: url(../img/fatures/icon_feature_npm.svg);
-  }
-  .features-text {
-    margin: 0 0 0 10px;
-    padding: 25px 0;
-    border-bottom: 1px solid #EEF2F5;
-  }
-}
diff --git a/docs/less/slides/slide-five.less b/docs/less/slides/slide-five.less
deleted file mode 100644
index 0ad0fda39..000000000
--- a/docs/less/slides/slide-five.less
+++ /dev/null
@@ -1,44 +0,0 @@
-@media (max-width: 767px) {
-  .slide.slide--five {
-    padding: 40px 0 40px;
-    .slide__inner {
-      padding: 30px 0;
-      width: 100%;
-      border-radius: 0;
-    }
-  }
-}
-.slide.slide--five {
-  display: -ms-flexbox;
-  display: flex;
-  padding: 40px 0 60px;
-  .slide__inner {
-    background-image: linear-gradient(-138deg, #5070D5 14%, #4957B8 100%);
-    box-shadow: 0px 12px 23px 0px rgba(74, 92, 105, 0.33);
-    border-radius: 8px;
-    padding: 50px 0;
-    height: 600px;
-    width: 1080px;
-  }
-  .slide__header {
-    padding: 150px 0 0 0;
-  }
-  .slide__bg-image {
-    width: 814px;
-    height: 519px;
-    background-image: url(../img/lines@2x.png);
-    background-size: 814px;
-    position: absolute;
-    left: 50%;
-    top: 0;
-    margin: 0 0 0 -407px;
-  }
-  .slide__bg-icon {
-    position: absolute;
-    top: 35px;
-    left: 50%;
-    margin: 0 0 0 -75px;
-    height: 150px;
-    width: 150px;
-  }
-}
diff --git a/docs/less/slides/slide-four.less b/docs/less/slides/slide-four.less
deleted file mode 100644
index d64466197..000000000
--- a/docs/less/slides/slide-four.less
+++ /dev/null
@@ -1,20 +0,0 @@
-@media (max-width: 767px) {
-  .slide.slide--four {
-    padding: 0px 0px 60px 0px;
-  }
-}
-.slide.slide--four {
-  display: -ms-flexbox;
-  display: flex;
-  padding: 40px 0 100px;
-  .slide__inner {
-    border-radius: 8px;
-    padding: 20px 0 0 0;
-    height: auto;
-    width: auto;
-  }
-  .button {
-    margin: 20px auto 0;
-    width: 170px;
-  }
-}
diff --git a/docs/less/slides/slide-gist.less b/docs/less/slides/slide-gist.less
deleted file mode 100644
index 0eceecb6d..000000000
--- a/docs/less/slides/slide-gist.less
+++ /dev/null
@@ -1,27 +0,0 @@
-.slide.slide--gist {
-  padding: 40px 0 40px 0;
-  margin: -280px 0 0 0;
-  z-index: 1;
-  .slide__inner {
-    display: flex;
-    flex-direction: column;
-    z-index: -2;
-    .slide__body {
-      position: relative;
-      margin: 0 auto;
-    }
-  }
-}
-@media (max-width: 767px) {
-  .slide.slide--gist {
-    padding: 40px 0 40px;
-    .slide__inner {
-      padding: 30px 0;
-      width: 100%;
-      border-radius: 0;
-    }
-  }
-  article.gallery {
-    width: 350px;
-  }
-}
diff --git a/docs/less/slides/slide-one.less b/docs/less/slides/slide-one.less
deleted file mode 100644
index 2b68df324..000000000
--- a/docs/less/slides/slide-one.less
+++ /dev/null
@@ -1,75 +0,0 @@
-.slide.slide--one {
-  .slide__inner {
-    position: relative;
-    margin: 40px 0 0 0;
-    height: 720px;
-    background-color: @background_color_6;
-    border-radius: 10px;
-    transform: translate3d(0, 0, 0);
-    transition: transform .6s ease, opacity .3s ease;
-    background: #1F9948;
-    background: linear-gradient(180deg,#1F9948,#2CDA9C);
-    // background-image: linear-gradient(180deg, #1F9948 0%,  #2CDA9C 77%);
-    box-shadow: 0 10px 18px 0 rgba(122, 135, 142, .33);
-  }
-}
-.slide.slide--one .slide__bg-image {
-  width: 814px;
-  height: 519px;
-  background-image: url(../img/lines@2x.png);
-  background-size: 814px;
-  position: absolute;
-  left: 12.5%;
-  top: 0;
-  margin: 0 0 0 -408px;
-}
-.slide__bg-area {
-  position: absolute;
-  background-color: @background_color_10;
-  opacity: 0;
-  left: 50%;
-  top: -88px;
-  margin: 0 0 0 -200px;
-  width: 400px;
-  height: 400px;
-  border-radius: 50%;
-  -ms-transform: scale(0.1);
-  transform: scale(0.1);
-  animation-timing-function: ease;
-  animation-name: pulsateArea;
-  animation-duration: 3.4s;
-  animation-delay: 2.3s;
-  animation-iteration-count: infinite;
-}
-@media (max-width: 1140px) {
-  .slide__inner {
-    width: 100%;
-    margin: 0;
-  }
-
-  .slide.slide--one {
-    margin: 20px 20px 0 20px;
-    .slide__inner {
-      margin: 0 0 0 0;
-      width: 100%;
-    }
-  }
-  .slide__bg-area {
-
-  }
-}
-@media (max-width: 922px) {
-  .slide.slide--one {
-    .slide__inner {
-      height: 693px;
-    }
-  }
-}
-@media (max-width: 767px) {
-  .slide.slide--one .slide__bg-image {
-    background-image: none;
-  }
-  .slide__bg-area {
-    display: none;
-  }
-}
diff --git a/docs/less/slides/slide-six.less b/docs/less/slides/slide-six.less
deleted file mode 100644
index 2481c0185..000000000
--- a/docs/less/slides/slide-six.less
+++ /dev/null
@@ -1,7 +0,0 @@
-.slide.slide--six {
-  padding: 40px 0 40px 0;
-  margin: 0 0 0 0;
-  .slide__footer {
-    width: 450px;
-  }
-}
diff --git a/docs/less/slides/slide-three.less b/docs/less/slides/slide-three.less
deleted file mode 100644
index 63e457534..000000000
--- a/docs/less/slides/slide-three.less
+++ /dev/null
@@ -1,39 +0,0 @@
-@media (max-width: 1140px) {
-  .slide.slide--three {
-    .slide__inner {
-      width: 860px;
-    }
-  }
-}
-@media (max-width: 922px) {
-  .slide.slide--three {
-    .slide__inner {
-      width: 728px;
-    }
-  }
-}
-@media (max-width: 767px) {
-  .slide.slide--three {
-    padding: 40px 0 40px;
-    .slide__inner {
-      padding: 30px 0;
-      width: 100%;
-      border-radius: 0;
-      height: 570px;
-    }
-  }
-}
-
-.slide.slide--three {
-  display: -ms-flexbox;
-  display: flex;
-  padding: 40px 0 60px;
-  .slide__inner {
-    background-image: linear-gradient(-180deg, #5A6F7E 0%, #445561 100%);
-    box-shadow: 0px 12px 23px 0px rgba(74, 92, 105, 0.33);
-    border-radius: 8px;
-    padding: 50px 0;
-    height: 740px;
-    width: 1080px;
-  }
-}
diff --git a/docs/less/slides/slide-two.less b/docs/less/slides/slide-two.less
deleted file mode 100644
index 1365084ec..000000000
--- a/docs/less/slides/slide-two.less
+++ /dev/null
@@ -1,93 +0,0 @@
-@media (max-width: 1140px) {
-  .section {
-    padding: 60px 40px;
-    h2 {
-      font-size: 20px;
-    }
-  }
-  .section.section--judges {
-    padding: 60px 40px;
-  }
-}
-@media (max-width: 922px) {
-  .examples {
-    margin: 50px auto 30px;
-    width: 748px;
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-wrap: wrap;
-    flex-wrap: wrap;
-    -ms-flex-line-pack: start;
-    align-content: flex-start;
-    -ms-flex-pack: start;
-    justify-content: flex-start;
-  }
-  .example {
-    width: 25%;
-    -ms-flex-positive: 1;
-    flex-grow: 1;
-    -ms-flex-negative: 1;
-    flex-shrink: 1;
-  }
-  .example__inner {
-    height: 260px;
-    display: flex;
-  }
-  .example__image {
-    align-self: center;
-    justify-content: center;
-    align-items: center;
-  }
-  .section {
-    &:first-child {
-      padding-top: 60px;
-    }
-  }
-}
-@media (max-width: 767px) {
-  .slide.slide--two {
-    margin: 50px auto 40px;
-    padding: 0;
-  }
-  .examples {
-    margin: 20px auto 10px;
-    width: auto;
-    padding: 0 10px;
-  }
-  .example__inner {
-    margin: 5px;
-    height: 160px;
-    padding: 15px;
-  }
-  .example {
-    width: 50%;
-    opacity: 1;
-    transform: translate3d(0, 0, 0);
-  }
-  .example__image {
-    width: 50px;
-    height: 50px;
-  }
-  .example__icon {
-    width: 60px;
-    height: 60px;
-    -ms-transform: scale(1);
-    transform: scale(1);
-    opacity: 1;
-  }
-  .example__icon-inner {
-    width: 60px;
-    height: 60px;
-    -ms-transform: scale(1);
-    transform: scale(1);
-    opacity: 1;
-  }
-  .slide__circle-wrap {
-    top: 145%;
-  }
-}
-
-.slide.slide--two {
-  padding: 40px 0 40px 0;
-  margin: -280px 0 0 0;
-}
diff --git a/docs/md/api.md b/docs/md/api.md
deleted file mode 100644
index ef3d478e5..000000000
--- a/docs/md/api.md
+++ /dev/null
@@ -1,285 +0,0 @@
-## API
-
-### wepy.app Class
-
-App 基类，小程序入口。
-
-```javascript
-export class App extends wepy.app {
-    onLaunch () {
-
-    }
-}
-```
-
- **属性**
-
-* `$wxapp:Object`: `this.$wxapp`等同于`getApp()`。
-* `$pages:List<Page>`: 所有页面列表
-
-    格式如下：
-
-    ```javascript
-    this.$pages = {
-        './pages/index': IndexPage
-    }
-    ```
-
-* `$interceptors:List<Object>`：所有拦截器列表
-
-    格式如下：
-
-    ```javascript
-    this.$interceptors = {
-        'request': {
-            config (p) {
-                return p;
-            },
-            success (rst) {
-
-            }
-        }
-    }
-    ```
-
- **方法**
-
-* `use(middleWare:String|Function)`：使用中间件。
-
-    当前内置两个中间件：
-
-    * `requestfix`: 修复小程序请求并发问题。
-    * `promisify`：使用`wepy.xxx`的方式请求小程序原生API都将Promise化。
-
-    使用方法如下:
-
-    ```javascript
-    this.use('requestfix');
-    this.use('promisify');
-    ```
-
-* `intercept(api:String, provider:Object)`：使用拦截器对原生API请求进行拦截。
-
-    格式如下:
-
-    ```javascript
-    // app.js
-    constructor () {
-        super();
-        this.intercept('request', {
-            config (p) {
-                p.timestamp = +new Date();
-            },
-            success (obj) {
-                console.log('request success');
-            }
-        });
-    }
-    ```
-
-### wepy.component Class
-
-组件基类
-
- **属性**
-
-* `$name:String`: 组件名称。
-* `$isComponent:Boolean`：是否是组件，如果是页面，此值为false。
-* `$wxpage:Object`: 小程序原生page。
-* `$parent:Page|App`：组件的父组件，如果当前是组件是Page对象，那么$parent的值为App对象。
-* `$root:Page`: 组件所在的Page对象，如果当前组件是Page对象，那么$root的值就是自己本身。
-* `$coms:List<Component>`：组件的子组件列表。
-* `$mixins:Array[Mixin]`：组件所注入的Mixin对象。
-* `data:Object`: 组件需要绑定的数据。
-* `methods:List<Function>`：组件需要响应的事件列表。
-* `props:List<Props>`：组件允许传递的props列表。
-* `events:List<Function>`：组件通信时所需要的事件表现。
-
-**方法**
-
-* `setData(key:String|Object, [value:Object])`：对原有小程序的`setData`的封装。
-
-    因为WePY的脏查检流程会自动执行setData操作，所以通常情况下不需要使用此方法。
-
-    使用方法如下:
-
-    ```javascript
-    this.setData('list', ['apple', 'pen']);
-    this.setData({
-        list: ['apple', 'pen']
-    });
-    ```
-
-* `getCurrentPages()`：相当于全局方法`getCurrentPages()`。
-* `$getComponent(com:String)`：通过组件名称路径查找组件对象。
-
-    使用方法如下:
-
-    ```javascript
-    this.$getComponent('./coma/comb');
-    this.$getComponent('../comc');
-    ```
-
-* `$invoke(com:String|Component)`：调用另一组件的方法。
-
-    优先调用methods中方法，如果方法不存在，则调用组件的自定义方法，调用自定义方法时，不会传递事件$event。
-
-    使用方法如下:
-
-    ```javascript
-    // coma.js
-    this.$invoke('./ComB', 'func1', 'p1', 'p2');
-    this.$invoke('./ComB', 'func2', 'p1', 'p2');
-
-    // comb.js
-    export class ComB extends wepy.component {
-        methods = {
-            func1 (p1, p2, evt) {}
-        },
-        func2 (p1, p2) {}
-    }
-    ```
-
-* `$broadcast(eventName:String, [args])`：组件发起一个广播事件。
-
-    向所有子组件发起一个广播事件，事件会依次传播直至所有子组件遍历完毕或者事件被手动终止传播。
-
-    使用方法如下:
-
-    ```javascript
-    // page1.js
-    components = { ComA };
-    this.$broadcast('broadcast-event', 'p1', 'p2');
-
-    // coma.js
-    events = {
-        'broadcast-event': (p1, p2, event) {}
-    }
-    ```
-
-* `$emit(eventName:String, [args])`：组件发起一个冒泡事件。
-
-    向父组件发起一个冒泡事件，事件会向上冒泡直至Page或者者事件被手动终止传播。
-
-    使用方法如下:
-
-    ```javascript
-    // coma.js
-    this.$emit('emit-event', 'p1', 'p2');
-
-    // page1.js
-    components = { ComA };
-    events = {
-        'emit-event': (p1, p2, event) => {}
-    }
-    ```
-
-* `$apply([func:Function])`：组件发起脏检查。
-
-    正常流程下，改变数据后，组件会在流程结束时自动触发脏检查。
-    在异步或者回调流程中改变数据时，需要手动调用`$apply`方法。
-
-    使用方法如下:
-
-    ```javascript
-    this.userName = 'Gcaufy';
-    this.$apply();
-
-    this.$apply(() => {
-        this.userName = 'Gcaufy';
-    });
-    ```
-
-### wepy.page Class
-
-页面类，继承自`wepy.component`，拥有页面所有的属性与方法。
-
- **属性**
-
-全部属性继承自`wepy.component`。
-
- **方法**
-
-* `$preload(key:String|Object, [value:Object])`：给页面加载preload数据
-
-    加载preload数据后，跳转至另一个页面时，在onLoad方法中可以获取到上个页面的preload数据。
-
-    使用方法如下：
-
-    ```javascript
-    // page1.js
-    this.$preload('userName': 'Gcaufy');
-    this.$redirect('./page2');
-
-    // page2.js
-    onLoad (params, data) {
-        console.log(data.preload.userName);
-    }
-    ```
-
-* `$redirect(url:String|Object, [params:Object])`：`wx.redirectTo`的封装方法。
-
-    使用方法如下：
-
-    ```javascript
-    this.$redirect('./page2', {a: 1, b: 2});
-    this.$redirect({
-        url: './pages?a=1&b=2'
-    });
-    ```
-
-* `$navigate(url:String|Object, [params:Object])`：`wx.navigateTo`的封装方法
-* `$switch(url:String|Object)`：`wx.switchTab`的封装方法
-
-
-
-
-### wepy.event Class
-
-小程序事件封装类
-
-```javascript
-new wepy.event(name:String, source:Component, type:String)
-```
-
- **属性**
-
-* `name(String)`: 事件名称
-
-    当事件为小程序原生事件时，如`tap`，`change`等，name值为`system`。
-    当事件为用户自定事件或者组件通信事件时，如`$emit`，`$broadcast`等，name值为自定事件的名称。
-
-* `source(Component)`：事件来源组件
-
-    无论是小程序原生事件还是自定事件，都会有对应的事件来源组件。
-
-* `type(String)`: 事件类型
-
-    `$emit`事件中，type值为`emit`。`bindtap`事件中，type值为`tap`。
-
-
- **方法**
-
-* `$destroy()`：终止事件传播
-
-    在`$emit`或者`$broadcast`事件中，调用`$destroy`事件终止事件的传播。
-
-* `$transfor(wxevent:Object)`：将内部小程序事件的属性传递到当前事件。
-
-### wepy.mixin Class
-
-Mixin基类，用于复用不同组件中的相同功能。
-
-```javascript
-// mymixn.js
-export class MyMixin extends wepy.mixin {
-    // my logic here
-}
-
-// mycom.js
-import MyMixin from './mymixin';
-export class MyCom extends wepy.component {
-    mixins = [MyMixin];
-}
-```
-
diff --git a/docs/md/changelog.md b/docs/md/changelog.md
deleted file mode 100644
index 5e3ee74ed..000000000
--- a/docs/md/changelog.md
+++ /dev/null
@@ -1,245 +0,0 @@
-## 1.6.0 (2017-10-25) 
-* `F` 修复了`@import scss`编译出错的问题。[ISSUE 303](https://github.com/wepyjs/wepy/issues/303)
-* `F` 修复了在repeat中使用静态传值不生效的问题。[ISSUE 204](https://github.com/wepyjs/wepy/issues/204)
-* `F` 修复了使用绝对路径跳转时，`onPrefetch`没被调用的问题。[ISSUE 244](https://github.com/wepyjs/wepy/issues/244)
-* `F` 修复了在组件中没有`<style>`节点报错的BUG。[ISSUE 160](https://github.com/wepyjs/wepy/issues/160)
-* `F` 修复了repeat中for变量为null或者undefined报错的问题。[PR 353](https://github.com/wepyjs/wepy/pull/353)
-* `A` 添加了computed的watch和sync功能。[ISSUE 318](https://github.com/wepyjs/wepy/issues/318)
-* `F` 修复了`--watch`模式下，修复外链文件可能不会触发编译的问题。
-* `F` 修复了repeat中传多个参数无效的BUG。[ISSUE 348](https://github.com/wepyjs/wepy/issues/348)
-* `D` 弃用babel-preset-2015。[ISSUE 407](https://github.com/wepyjs/wepy/issues/407)
-* `F` 修复引用第三方私有NPM组件编译报错的问题。[PR 398](https://github.com/wepyjs/wepy/pull/398)
-* `F` 修复getCurrentPages调用错误的问题。[PR 396](https://github.com/wepyjs/wepy/pull/396)
-* `F` 修复使用repeat时，默认数据为空引发的BUG。[PR 411](https://github.com/wepyjs/wepy/pull/411)
-* `F` 修复了使用第三方组件时，修改ouput属性导致引用错乱的BUG。[ISSUE 415](https://github.com/wepyjs/wepy/pull/415)
-* `A` 添加了`resolve`, `alias`的功能
-* `F` 修复了生成JSON时没有通过plugins处理的问题。[ISSUE 403](https://github.com/wepyjs/wepy/pull/403)
-* `F` 修复了组件中引用相对路径在某些情况下不准确的问题。[ISSUE 345](https://github.com/wepyjs/wepy/pull/345)
-* `F` 修复了repeat使用驼峰命名组件出现问题的BUG。[ISSUE 397](https://github.com/wepyjs/wepy/pull/397)
-* `F` 修复绑定多个事件传参时，参数混乱的问题。[ISSUE 385](https://github.com/wepyjs/wepy/pull/385)
-
-
-## 1.5.8 (2017-08-05)
-* `A` 添加了`appConfig`字段。[ISSUE 199](https://github.com/wepyjs/wepy/issues/199)
-* `F` 修复了使用缩进的`sass`语法时编译报错的问题。[ISSUE 208](https://github.com/wepyjs/wepy/issues/208)
-* `F` 修复了使用PUG编译时，首行不能缩进的问题。[ISSUE 211](https://github.com/wepyjs/wepy/issues/211)
-* `A` 添加组件 kebab-case 写法支持。[ISSUE 242](https://github.com/wepyjs/wepy/issues/242)
-* `F` 修复了当项目文件夹存在空文件时编译会卡死的问题。[ISSUE 253](https://github.com/wepyjs/wepy/issues/253)
-* `A` 添加了组件对`class`的支持。[ISSUE 255](https://github.com/wepyjs/wepy/issues/255)
-* `F` 修复了页面中使用`:class`无效的BUG。[ISSUE 257](https://github.com/wepyjs/wepy/issues/257)
-
-## 1.5.7 (2017-06-15)
-* `F` 修复了`App`中的`this`指向问题。
-* `F` 修复了`component`不支持mixin的onLoad的问题。[ISSUE 177](https://github.com/wepyjs/wepy/issues/177)
-* `F` 修复了引用第三方组件时，样式引用路径不对的问题。
-* `F` 修复了使用`pug`时，`props`不生效的问题。[ISSUE 186](https://github.com/wepyjs/wepy/issues/186)
-* `F` 修复了使用扩展运算符`...`时，编译不正确的问题。[ISSUE 190](https://github.com/wepyjs/wepy/issues/190)
-* `F` 修复了目录中包含src时，第三方组件编译路径不正确的问题。[ISSUE 183](https://github.com/wepyjs/wepy/issues/183)
-* `A` 添加数据的`watch`支持。[ISSUE 155](https://github.com/wepyjs/wepy/issues/155)
-
-## 1.5.6 (2017-05-22)
-* `F` 修复了特殊情况下require路径编译出错的问题。[ISSUE 128](https://github.com/wepyjs/wepy/issues/128)
-* `F` 修复了`wepy.createVideoContext`调用报错的问题。[ISSUE 133](https://github.com/wepyjs/wepy/issues/133)
-* `F` 修复了`should not change the protected attribute __wxWebviewId__`的warning。[ISSUE 143](https://github.com/wepyjs/wepy/issues/143)
-* `F` 修复了`output`参数不生效的问题。[ISSUE 145](https://github.com/wepyjs/wepy/issues/145)
-* `A` 添加了对`npm`的`scope`的支持，如`import sth from '@scoped/sth';`
-
-## 1.5.4 (2017-05-05)
-* `A` 添加`:class`标签支持，如`:class="{className: mycondition > 1}"`。[ISSUE #99](https://github.com/wepyjs/wepy/issues/99)
-* `F` 修复了在使用slot时，添加注释会导致编译报错的BUG。
-* `F` 修复了属性值中使用`>`会导致属性编译出错的BUG。[ISSUE #118](https://github.com/wepyjs/wepy/issues/118)
-* `F` 修复了在`onLoad`中使用`this.$redirect`报错的BUG。
-* `F` 修复了外链样式时，import路径错乱的BUG。
-* `F` 修复了空`<template>`节点编译报错的BUG。
-* `F` 修复了`<template>`中只有两个`component`时，只会显示一个的BUG。[ISSUE #123](https://github.com/wepyjs/wepy/issues/123)
-
-## 1.5.2 (2017-04-17)
-* `A` style标签添加了scoped属性的支持。[ISSUE #79](https://github.com/wepyjs/wepy/issues/79)
-* `F` 修改了项目外层有`src`目录会导致编译文件目录错乱的BUG。[ISSUE #91](https://github.com/wepyjs/wepy/issues/91)
-* `A` 添加了redux支持，使用`wepy new demo --redux`生成带有redux示例的DEMO。[PR #93](https://github.com/wepyjs/wepy/pull/93)
-* `F` 修复了手动删除dist目录时，不会自动生成`npm`文件的问题。
-
-
-
-## 1.5.1 (2017-03-27) 
-* `F` 修复了`onUnload`中直接赋值导致赋值失效的BUG。
-* `A` 添加了`wepy-compiler-babel`的sourceMap支持。
-* `A` 事件绑定优化，对于非原生事件，添加`.user`后缀也可识别。[PR #76](https://github.com/wepyjs/wepy/pull/76)
-* `A` 添加`page.$preload`方法，扩展`onLoad`的第二个参数为`preloadData`。
-* `A` 添加了`eslint`支持。[PR #80](https://github.com/wepyjs/wepy/pull/80)
-
-**感谢@dolymood的贡献**
-
-
-## 1.4.8 (2017-03-16)
-* `F` 修复了在data中的数据存在undefined的情况下会出现异常的BUG。
-* `F` 统一修复`$invoke`，`$broadcast`，`$emit`事件在执行完成时会出发`$apply`。
-* `A` 添加了`@`符号来代替`bind`和`catch`。[ISSUE #71](https://github.com/wepyjs/wepy/issues/71)
-* `A` 添加了组件自定义事件，如`@doSomething="someFunc"`。参考文档[组件自定义事件](https://github.com/wepyjs/wepy#组件自定义事件)。
-* `F` 修复demo默认使用`@`符。
-
-
-## 1.4.7 (2017-03-15)
-* `F` 修复1.4.6版本中只一个`props`生效的BUG。[ISSUE #68](https://github.com/wepyjs/wepy/issues/68)
-* `F` 修复了使用引用类型作为双向绑定不会触发父组件脏检查的BUG。
-* `F` 修复了在`template`的`root`元素为自定义组件会导致编译报错的BUG。[ISSUE #67](https://github.com/wepyjs/wepy/issues/67)
-
-
-## 1.4.6 (2017-03-14)
-* `F` 移除了编译过程中自动生成的`xmlns:wx`属性。
-* `F` 修改自带demo并发10个请求报错的BUG。
-* `F` 修复了项目在没有安装NPM资源，时使用wepy报错的BUG。
-* `A` 添加了repeat标签，代替`<block wx:for></block>`。
-* `F` 修复了在`wx:for`中使用自定义组件时，使用props无法取值的BUG。
-* `A` 在默认demo中添加了repeat示例。
-* `F` 修复了使用pug出错时的错误提示。
-
-## 1.4.5 (2017-03-07)
-* `F` 修复了组件未定义`methods`时，使用`$invoke`报错的BUG。
-* `F` 使用空template报错的BUG。
-* `A` 添加了`computed`属性。
-* `A` 添加了`onRoute`事件。
-* `A` `wepy-cli`添加了`--empty`选项，`wepy new demo --empty`用于生成空项目。
-
-
-## 1.4.4 (2017-02-28)
-* `F` 修复`$invoke`事件`event`参数错误的BUG。[PR #50](https://github.com/wepyjs/wepy/issues/50)
-* `F` 修复`onShareAppMessage`报错的问题。[PR #52](https://github.com/wepyjs/wepy/issues/52)
-* `F` 修复了在没有申明`data`时使用`props`报错的BUG。[PR #54](https://github.com/wepyjs/wepy/issues/54)
-
-## 1.4.3 (2017-02-22)
-* `F` 修复调用原生api参数报错的BUG。
-* `A` 添加wepy-plugin-replace插件。
-* `F` 修复了Mixin事件中，event丢失的BUG。[PR #40](https://github.com/wepyjs/wepy/pull/40)
-* `F` 修复了IOS 1.10.2 中Promise.resolve没被调用的BUG。
-* `F` 修复了Mixin的自定义事件无效的BUG。[ISSUE #44](https://github.com/wepyjs/wepy/issues/44)
-* `F` 修复了SASS和SCSS编译混乱的BUG。[ISSUE #43](https://github.com/wepyjs/wepy/issues/43)
-* `A` 解决了不支持`moment.js`的问题。[ISSUE #45](https://github.com/wepyjs/wepy/issues/45)
-* `F` 优化了wepy使用async/await的方式，不再依赖`babel-polyfill`。
-* `F` 生成DEMO默认使用`async/await`。
-* `A` 组件支持`'hidden', 'wx:if', 'wx:elif', 'wx:else'`四个属性。[PR #47](https://github.com/wepyjs/wepy/pull/47)
-
-**感谢@shenqihui的贡献**
-
-## 1.4.2 (2017-02-09)
-* 添加slot支持，参看[slot说明](https://github.com/wepyjs/wepy#组件内容分发slot)。
-* 更新最新template支持slot。
-
-## 1.4.1 (2017-01-26)
-* 修复了`onShareAppMessage`在所有页面都生效的问题。
-* 修改了`bind/catch`事件的传参机制，支持传入非String类型参数。
-* 修改了页面响应事件和组件通讯事件的参数顺序，改为默认最后一个参数为$event。
-* 不再会重写wx原有API，例如使用wepy.request代替wx.request。
-* 添加了两个API：app.use()，app.intercept()，参看[拦截器说明](https://github.com/wepyjs/wepy#拦截器)。
-* 不再默认添加Promise polyfill支持，需要手动import，然后使用`app.use('promisify')`。
-* 不再默认处理request并发问题，需要手动调用`app.use('requestfix')`。
-* 不再默认支持async/await，需要手动引入`babel-polyfill`。
-* 将默认npm目录压缩后的大小由170kb减少至23kb。
-
-**以上改动将不向下兼容，升级前请查看[迁移指南](https://github.com/wepyjs/wepy/wiki/%E5%8D%87%E7%BA%A7%E6%8C%87%E5%8D%97#13x---141)**
-
-
-## 1.3.11 (2017-01-16)
-* 页面和组件均添加`$wxapp`和`$wxpage`属性
-* 添加了`wepy-plugin-filemin`，可以压缩`wxml`和`json`文件。
-* 修复了`onShareAppMessage` API 不生效的问题。
-* 修复了组件template使用pug时不会编译的问题。
-* 加入了node版本检测功能，低于Node版本低于5时提示更新Node版本。
-
-## 1.3.10 (2017-01-10)
-* 修复了less文件中使用import找不到路径的BUG。
-* 修复了prop默认值混乱的BUG。
-* 修复了prop默认值不会触发coerce的BUG。
-* 优化编译过程中的一个报错提示。
-
-## 1.3.9 (2017-01-05)
-* 修复了wx.createCanvasContext在prmoise下报错的问题。
-* 添加了`.wepyignore`忽略编译一些非必要文件。[ISSUE 12](https://github.com/wepyjs/wepy/issues/12)。
-* 添加了typescript支持，wepy-compile-typescript。
-* 添加了stylus支持，wepy-compile-stylus。
-
-## 1.3.8 (2016-12-30)
-* 修改组件原属性`name`，`prefix`为`$name`，`$prefix`。防止命名冲突的问题，参见[Issue](https://github.com/wepyjs/wepy/issues/8)。
-* 修复了编译过程中的日志错误的问题。
-* 简化语法，可以使用`:myprop`代替`v-bind:myprop`。
-* 使用props时，添加了`once`和`sync`关键字，`:myprop.once="data"`：当父组件data改变时，不会修改子组件的myprop的值，除非将`once`改为`sync`关键字。默认为`once`
-* 子组件申明props时，添加了`twoWay`选项，为false时，子组件数据变更不影响父组件。为true时，同步到父组件。
-* 1.3.6版本后props默认父子互相不影响，除非加上`sync`和`twoWay`的属性。
-* 编译时加入了版本检测，cli如果检测到wepy不符合版本要求会自动更新wepy版本。
-
-## 1.3.5 (2016-12-23)
-* 修复了升级1.3.3导致旧项目报`id is not defined`的错误。
-* 发布过程中加入了LF强制转换逻辑，确保MAC在更新后不会出现`env: node\r: No such file or directory`的错误。
-* 修复了用`<component>`时，导致样式丢失的问题。
-* 修复了用`<component>`时，props不工作的问题。
-* 更新了`wepy-wechat-demo`使用自定义component与props，并添加toast组件。
-
-## 1.3.3 (2016-12-22)
-* 修复了config使用单引号导致解析出错的问题。感谢[@Lxxyx]()
-* 支持自定义组件标签，`<component id="mycom" path="mycom"></component>` 优化为 `<mycom></mycom>`。
-* 新增props传值功能，支持静态传值如 `num="50"` 或者绑定传值如 `v-bind:num="parentnum"`，使用方式基于与[Vue Props传值](https://vuejs.org.cn/guide/components.html#Props)一致。
-* 修复了组件支持事件传参，但页面不支持的问题。
-
-
-## 1.3.2 (2016-12-19)
-* 修复wx:else, scroll-x等boolean属性报warning的[问题](https://github.com/wepyjs/wepy/issues/5)。
-* 修复了组件method不存在时，mixin的method不会被注册的BUG。感谢[@huike1989]()。
-* 修复了引用第三方组件路径报错的BUG。感谢[@huike1989]()。
-
-## 1.3.1 (2016-12-16)
-* 新增对第三方Compiler的支持。
-* 新增pug编译器。
-* 重新整理代码结构，使用lerna维护不同的NPM包。
-* 重新处理Plugins，同样交由第三方包处理。
-* 添加了编译时检测依赖的Compiler或者Plugins是否缺失的逻辑，如果缺失会自行安装。
-* 添加了cli工具版本检测的功能。
-
-*老版本在升级1.3.1版本时，要修改`wepy.config.js`并且添加compilers属性，并且安装对应的编译器方可使用。[参考这里](https://github.com/wepyjs/wepy#wepyconfigjs-配置文件说明)*
-
-
-## 1.1.9 (2016-12-14)
-* 新增了wepy upgrade命令升级wepyjs版本。
-* 新增对第三方组件的支持。
-* 新增第三方组件[wepy-com-toast](https://github.com/wepyjs/wepy-com-toast)。
-* 模板中添加toast组件测试。
-
-
-## 1.1.8 (2016-12-08)
-* 修复了script使用src外链报错的BUG。
-* 修复了LESS编译会调用到SASS的BUG。
-* 优化了事件传参数，支持直接传参。详情[参考文档](https://github.com/wepyjs/wepy#2-优化事件参数传递)。
-* 加入了Travis-CI以及Coveralls。
-* 修复其它细节BUG问题
-
-## 1.1.7 (2016-12-06)
-* script/template/style的属性同时支持type和lang。
-* 添加mixins支持，详情请[参考文档](https://github.com/wepyjs/wepy#混合)。
-
-## 1.1.6 (2016-12-02)
-* 修复了组件ID大写导致无法识别的问题。
-* 添加了对小程序页面所有响应事件的支持。
-* 修改wepy.config.js支持plugins。
-* 添加UglifyJsPlugin，在编译时对生成的所有JS文件进行压缩。
-* 添加ImageMinPlugin(不推荐使用，处理大图片时还有问题)，
-* 添加`wepy build --no-cache`参数，编译时会重新编译所有依赖文件。
-* `wepy new demo`时，由在当前目录下生成项目改为创建demo目录，然后再生成项目。
-* 更新生成demo支持最新功能。
-
-## 1.1.4 (2016-12-01)
-
-* 添加了小程序其它页面事件的支持
-* 修改默认配置文件.wepyrc为wepy.config.js，方便以后功能扩展。（兼容老配置文件）
-
-## 1.1.3 (2016-11-28)
-
-* 修复SASS编译异常导致watch结束的BUG
-* 修复子组件修改时不会触发父组件更新的BUG
-* 修复`$invoke('../')`的BUG
-* 修复页面onLoad事件中传参的BUG
-
-## 1.1.1 (2016-11-23)
-
-* 添加了对sass/scss的编译支持
-* .wepyrc中加入对less/sass的配置支持
-* .wepyrc中添加`wpyExt`选项
-* 更新生成模板
diff --git a/docs/md/doc.md b/docs/md/doc.md
deleted file mode 100644
index 4c724c0bb..000000000
--- a/docs/md/doc.md
+++ /dev/null
@@ -1,1436 +0,0 @@
-# 微信小程序组件化开发框架WePY官方文档
-
-## 快速入门指南
-
-### WePY项目的创建与使用
-
-WePY的安装或更新都通过`npm`进行。
-
-**全局安装或更新WePY命令行工具**
-
-```bash
-npm install wepy-cli -g
-```
-
-**在开发目录中生成Demo开发项目**
-
-```bash
-wepy new myproject
-```
-
-**切换至项目目录**
-
-```bash
-cd myproject
-```
-
-**开启实时编译**
-
-```bash
-wepy build --watch
-```
-
-### WePY项目的目录结构
-
-```
-├── dist                   微信开发者工具指定的目录（该目录由WePY的build指令自动编译生成，请不要直接修改该目录下的文件）
-├── node_modules           
-├── src                    代码编写的目录（该目录为使用WePY后的开发目录）
-|   ├── components         WePY组件目录（组件不属于完整页面，仅供完整页面或其他组件引用）
-|   |   ├── com_a.wpy      可复用的WePY组件a
-|   |   └── com_b.wpy      可复用的WePY组件b
-|   ├── pages              WePY页面目录（属于完整页面）
-|   |   ├── index.wpy      index页面（经build后，会在dist目录下的pages目录生成index.js、index.json、index.wxml和index.wxss文件）
-|   |   └── other.wpy      other页面（经build后，会在dist目录下的pages目录生成other.js、other.json、other.wxml和other.wxss文件）
-|   └── app.wpy            小程序配置项（全局数据、样式、声明钩子等；经build后，会在dist目录下生成app.js、app.json和app.wxss文件）
-└── package.json           项目的package配置
-```
-
-### 参考建议
-
-1. WePY借鉴了Vue.js（后文简称Vue）的语法风格和功能特性，如果你之前从未接触过Vue，建议先阅读Vue的[官方文档](https://cn.vuejs.org/v2/guide/)，以熟悉相关概念，否则在阅读WePY文档以及使用WePY进行开发的过程中，将会遇到比较多的障碍。
-
-2. 开发建议使用第三方成熟IDE或编辑器(具体请参看后文的`代码高亮`部分)，`微信开发者工具`仅用于实时预览和调试。
-
-### 重要提醒
-
-1. 使用`微信开发者工具`-->`添加项目`，`项目目录`请选择`dist`目录。
-
-2. `微信开发者工具`-->`项目`-->`关闭ES6转ES5`。 <font style="color:red">重要：漏掉此项会运行报错。</font>
-
-3. `微信开发者工具`-->`项目`-->`关闭上传代码时样式自动补全`。 <font style="color:red">重要：某些情况下漏掉此项也会运行报错。</font>
-
-4. `微信开发者工具`-->`项目`-->`关闭代码压缩上传`。 <font style="color:red">重要：开启后，会导致真机computed, props.sync 等等属性失效。</font>（注：压缩功能可使用WePY提供的build指令代替，详见后文相关介绍以及Demo项目根目录中的`wepy.config.js`和`package.json`文件。）
-
-5. 本地项目根目录运行`wepy build --watch`，开启实时编译。（注：如果同时在`微信开发者工具`-->`设置`-->`编辑器`中勾选了`文件保存时自动编译小程序`，将可以实时预览，非常方便。）
-
-### 代码高亮
-
-文件后缀为`.wpy`，可共用`Vue`的高亮规则，但需要手动设置。下面提供一些常见IDE或编辑器中实现代码高亮的相关设置步骤以供参考(也可通过更改文件后缀名的方式来实现高亮，详见后文相关介绍)。
-
-- **Sublime**
-
-&emsp;&emsp;1. 打开`Sublime->Preferences->Browse Packages..`进入用户包文件夹。
-
-&emsp;&emsp;2. 在此文件夹下打开cmd，运行`git clone git@github.com:vuejs/vue-syntax-highlight.git`，无GIT用户可以直接下载[zip包](https://github.com/vuejs/vue-syntax-highlight/archive/master.zip)解压至当前文件夹。
-
-&emsp;&emsp;3. 关闭`.wpy`文件重新打开即可高亮。
-
-- **WebStorm/PhpStorm**
-
-&emsp;&emsp;1. 打开`Settings`，搜索`Plugins`，搜索`Vue.js`插件并安装。
-
-&emsp;&emsp;2. 打开`Settings`，搜索`File Types`，找到`Vue.js Template`，在`Registered Patterns`添加`*.wpy`，即可高亮。
-
-- **Atom**
-
-&emsp;&emsp;1. 在Atom里先安装Vue的语法高亮 - `language-vue`，如果装过了就忽略这一步。
-
-&emsp;&emsp;2. 打开`Atom -> Config`菜单。在`core`键下添加：
-
-```javascript
-customFileTypes:
-   "text.html.vue": [
-      "wpy"
-   ]
-```
-
-- **VS Code**
-
-&emsp;&emsp;1. 在 Code 里先安装 Vue 的语法高亮插件 `Vetur`。
-
-&emsp;&emsp;2. 打开任意 `.wpy` 文件。
-
-&emsp;&emsp;3. 点击右下角的选择语言模式，默认为`纯文本`。
-
-&emsp;&emsp;4. 在弹出的窗口中选择 `.wpy 的配置文件关联...`。
-
-&emsp;&emsp;5. 在`选择要与 .wpy 关联的语言模式` 中选择 `Vue`。
-
-- **VIM**
-
-&emsp;&emsp;1. 安装 `Vue` 的 VIM 高亮插件，例如 [posva/vim-vue](https://github.com/posva/vim-vue)。
-
-&emsp;&emsp;2. 配置 `.wpy` 后缀名的文件使用 `Vue` 语法高亮。
-
-    ```vim
-    au BufRead,BufNewFile *.wpy setlocal filetype=vue.html.javascript.css
-    ```
-
-### 代码规范
-
-1. 变量与方法尽量使用驼峰式命名，并且注意避免使用`$`开头。
-   以`$`开头的标识符为WePY框架的内建属性和方法，可在JavaScript脚本中以`this.`的方式直接使用，具体请[参考API文档](#api)。
-   
-2. 小程序入口、页面、组件文件名的后缀为`.wpy`；外链的文件可以是其它后缀。
-   具体请参考[wpy文件说明](#wpy文件说明)。
-   
-3. 使用ES6语法开发。
-   框架在ES6下开发，因此也需要使用ES6开发小程序，ES6中有大量的语法糖可以让我们的代码更加简洁高效。
-   
-4. 使用Promise。
-   框架默认对小程序提供的API全都进行了 Promise 处理，甚至可以直接使用`async/await`等新特性进行开发（注意：WePY 1.4.1以后的版本默认不支持async/await语法，因为可能导致iOS 10.0.1崩溃，如果不在意该问题可手动开启，具体可参看[这里](https://github.com/wepyjs/wepy/wiki/wepy%E9%A1%B9%E7%9B%AE%E4%B8%AD%E4%BD%BF%E7%94%A8async-await)）。
-   
-5. 事件绑定语法使用优化语法代替。
-   原`bindtap="click"`替换为`@tap="click"`，原`catchtap="click"`替换为`@tap.stop="click"`。更多`@`符用法，参见[组件自定义事件](https://github.com/wepyjs/wepy#组件自定义事件)。
-   
-6. 事件传参使用优化后语法代替。
-   原`bindtap="click" data-index={{index}}`替换为`@tap="click({{index}})"`。
-   
-7. 自定义组件命名应避开微信原生组件名称以及功能标签`<repeat>`。
-   不可以使用`input、button、view、repeat`等微信小程序原生组件名称命名自定义组件；另外也不要使用WePY框架定义的辅助标签`repeat`命名。有关`repeat`的详细信息，请参见[循环列表组件引用](https://github.com/wepyjs/wepy#循环列表组件引用)。
-
-
-## 主要功能特性
-
-### 开发模式转换
-
-WePY框架在开发过程中参考了Vue等现有框架的一些语法风格和功能特性，对原生小程序的开发模式进行了再次封装，更贴近于MVVM架构模式。以下是使用WePY前后的代码对比。
-
-原生代码：
-
-```javascript
-//index.js
-
-//获取应用实例
-var app = getApp()
-
-//通过Page构造函数创建页面逻辑
-Page({
-    //可用于页面模板绑定的数据
-    data: {
-        motto: 'Hello World',
-        userInfo: {}
-    },
-    
-    //事件处理函数
-    bindViewTap: function() {
-        console.log('button clicked')
-    },
-    
-    //页面的生命周期函数
-    onLoad: function () {
-        console.log('onLoad')
-    }
-})
-```
-
-基于WePY的代码：
-
-```javascript
-//index.wpy中的<script>部分
-
-import wepy from 'wepy';
-
-//通过继承自wepy.page的类创建页面逻辑
-export default class Index extends wepy.page {
-    //可用于页面模板绑定的数据
-    data = {
-        motto: 'Hello World',
-        userInfo: {}
-    };
-    
-    //事件处理函数(集中保存在methods对象中)
-    methods = {
-        bindViewTap () {
-            console.log('button clicked');
-        }
-    };
-    
-    //页面的生命周期函数
-    onLoad() {
-        console.log('onLoad');
-    };
-}
-```
-
-### 支持组件化开发
-
-参见章节：[组件](#组件)
-
-示例代码：
-
-```html
-// index.wpy
-
-<template>
-    <view>
-        <panel>
-            <h1 slot="title"></h1>
-        </panel>
-        <counter1 :num="myNum"></counter1>
-        <counter2 :num.sync="syncNum"></counter2>
-        <list :item="items"></list>
-    </view>
-</template>
-
-<script>
-import wepy from 'wepy';
-//引入List、Panel和Counter组件
-import List from '../components/list';
-import Panel from '../components/panel';
-import Counter from '../components/counter';
-
-export default class Index extends wepy.page {
-    //页面配置
-    config = {
-        "navigationBarTitleText": "test"
-    };
-   
-    //声明页面中将要使用到的组件
-    components = {
-        panel: Panel,
-        counter1: Counter,
-        counter2: Counter,
-        list: List
-    };
-   
-    //可用于页面模板中绑定的数据
-    data = {
-        myNum: 50,
-        syncNum: 100,
-        items: [1, 2, 3, 4]
-    }
-}
-</script>
-```
-
-### 支持加载外部NPM包
-
-在编译过程当中，会递归遍历代码中的`require`然后将对应依赖文件从node_modules当中拷贝出来，并且修改`require`为相对路径，从而实现对外部NPM包的支持。如下图：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554645/482b0f64-b198-11e6-8d4e-70c92326004f.png">
-</p>
-
-### 单文件模式，目录结构更清晰，开发更方便
-
-原生小程序要求app实例必须有3个文件：`app.js`、`app.json`、`app.wxss`，而page页面则一般有4个文件：`page.js`、`page.json`、`page.wxml`、`page.wxss`，并且还要求app实例的3个文件以及page页面的4个文件除后缀名外必须同名，具体可参看<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/framework/structure.html?t=20161107" target="_blank">官方目录结构</a>。
-
-而在WePY中则使用了单文件模式，将原生小程序app实例的3个文件统一为`app.wpy`，page页面的4个文件统一为`page.wpy`。使用WePY开发前后的开发目录结构对比如下：
-
-原生小程序的目录结构：
-
-```
-project
-├── pages
-|   ├── index
-|   |   ├── index.js    index 页面逻辑
-|   |   ├── index.json  index 页面配置
-|   |   ├── index.wxml  index 页面结构
-|   |   └── index.wxss  index 页面样式
-|   └── log
-|       ├── log.js      log 页面逻辑
-|       ├── log.json    log 页面配置
-|       ├── log.wxml    log 页面结构
-|       └── log.wxss    log 页面样式
-├── app.js              小程序逻辑
-├── app.json            小程序公共配置
-└── app.wxss            小程序公共样式
-```
-
-使用WePY框架后的开发目录结构(主要为src目录的结构，dist目录除外)：
-```
-    注：dist目录为WePY通过build指令生成的目录，除额外增加的npm目录外，其目录结构与原生小程序的目录结构类似。
-```
-
-```
-project
-└── src
-    ├── pages
-    |   ├── index.wpy    index 页面逻辑、配置、结构、样式
-    |   └── log.wpy      log 页面逻辑、配置、结构、样式
-    └──app.wpy           小程序逻辑、公共配置、公共样式
-```
-
-### 默认使用babel编译，支持ES6/7的一些新特性
-
-用户可以通过修改`wepy.config.js`(老版本使用`.wepyrc`)配置文件，配置自己熟悉的babel环境进行开发。默认开启使用了一些新的特性如`promise`、`async/await`（自WePY 1.4.1开始必须手动开启，原因参见前文`代码规范`一节中的介绍）等等。
-
-示例代码：
-
-```javascript
-import wepy from 'wepy';
-
-export default class Index extends wepy.page {
-    getData() {
-        return new Promise((resolve, reject) => {
-            setTimeout(() => {
-                resolve({data: 123});
-            }, 3000);
-        });
-    };
-    
-    async onLoad() {
-        let data = await this.getData();
-        console.log(data.data);
-    };
-}
-```
-
-### 针对原生API进行优化
-
-对小程序原生API进行promise处理，同时修复了一些原生API的缺陷，比如：wx.request的并发问题等。
-
-原生代码：
-
-```javascript
-onLoad = function () {
-    var self = this;
-    wx.login({
-        success: function (data) {
-            wx.getUserInfo({
-                success: function (userinfo) {
-                    self.setData({userInfo: userinfo});
-                }
-            });
-        }
-    });
-}
-```
-
-基于WePY的代码：
-
-```javascript
-import wepy from 'wepy';
-
-async onLoad() {
-    await wepy.login();
-    this.userInfo = await wepy.getUserInfo();
-}
-```
-
-在同时并发10个request请求测试时：
-
-不使用WePY:
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554651/5185f740-b198-11e6-88f8-45e359090dc3.png" alt="2 small">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554886/c30e802a-b199-11e6-927d-08cd4e5ed0b0.png" alt="2 small">
-</p>
-
-使用WePY后：
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554663/65704c2e-b198-11e6-8277-abb77e0c7b3e.png">
-</p>
-
-## 进阶介绍
-
-### wepy.config.js配置文件说明
-
-执行`wepy new demo`后，会生成类似下面这样的配置文件。
-
-```javascript
-
-let prod = process.env.NODE_ENV === 'production';
-
-module.exports = {
-    'output': 'dist',
-    'source': 'src',
-    'wpyExt': '.wpy',
-    'compilers': {
-        less: {
-            'compress': true
-        },
-        /*sass: {
-            'outputStyle': 'compressed'
-        },*/
-        babel: {
-            'presets': [
-                'es2015',
-                'stage-1'
-            ],
-            'plugins': [
-                'transform-export-extensions',
-                'syntax-export-extensions',
-                'transform-runtime'
-            ]
-        }
-    },
-    'plugins': {
-    }
-};
-
-if (prod) {
-    // 压缩sass
-    module.exports.compilers['sass'] = {'outputStyle': 'compressed'};
-
-    // 压缩less
-    module.exports.compilers['less'] = {'compress': true};
-
-    // 压缩js
-    module.exports.plugins = {
-        'uglifyjs': {
-            filter: /\.js$/,
-            config: {
-            }
-        },
-        'imagemin': {
-            filter: /\.(jpg|png|jpeg)$/,
-            config: {
-                'jpg': {
-                    quality: 80
-                },
-                'png': {
-                    quality: 80
-                }
-            }
-        }
-    };
-}
-```
-
-**wpyExt：** 缺省值为'.wpy'，IDE默认情况下不会对此文件类型进行高亮处理，这种情况下，除了按照前文`代码高亮`部分的介绍进行设置之外，还可以直接将相关文件的后缀名由`.wpy`修改为`.vue`(因为与Vue的高亮规则一样)，然后将此选项修改为`.vue`，也能解决部分IDE中代码高亮的问题。
-
-**compilers：** compilers为`1.3.1`版本之后的功能，如果需要使用其它语法，请先配置`compilers`，然后再安装相应的compilers。目前支持`wepy-compiler-less`，`wepy-compiler-sass`、`wepy-compiler-babel`、`wepy-compiler-pug`，其他compiler持续开发中......
-
-对应各compiler请参考各自文档：
-
-> **sass：** sass编译配置，参见<a href="https://github.com/sass/node-sass" target="_blank">这里</a>。
-
-> **less：** less编译配置，参见<a href="http://lesscss.org/#using-less-usage-in-code" target="_blank">这里</a>。
-
-> **stylus：** stylus编译配置，参见<a href="http://www.zhangxinxu.com/jq/stylus/js.php" target="_blank">这里</a>。
-
-> **babel：** babel编译配置，参见<a href="http://babeljs.io/docs/usage/options/" target="_blank">这里</a>。
-
-> **typescript：** typescript编译配置，参见<a href="https://www.tslang.cn/docs/home.html" target="_blank">这里</a>。
-
-**plugins：** plugins为`1.1.6`版本之后的功能，目前支持js压缩`wepy-plugin-ugliyjs`、图片压缩`wepy-plugin-imagemin`，其他plugin持续开发中......
-
-### 关于compilers和plugins
-
-1.3.1版本新功能，文档建设中...
-
-### .wpy文件说明
-
-`.wpy`文件的编译过程过下：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/22774706/422375b0-eee3-11e6-9046-04d9cd3aa429.png" alt="5 small">
-</p>
-
-一个`.wpy`文件可分为三大部分，各自对应于一个标签：
-
-1. 脚本部分，即`<script></script>`标签中的内容，又可分为两个部分：
-
-&emsp;&emsp;&emsp;&emsp;逻辑部分，除了config对象之外的部分，对应于原生的`.js`文件；
-
-&emsp;&emsp;&emsp;&emsp;配置部分，即config对象，对应于原生的`.json`文件。
-
-2. 结构部分，即`<template></template>`模板部分，对应于原生的`.wxml`文件。
-
-3. 样式部分，即`<style></style>`样式部分，对应于原生的`.wxss`文件。
-
-其中，小程序入口文件`app.wpy`不需要`template`，所以编译时会被忽略。`.wpy`文件中的`script`、`template`、`style`这三个标签都支持`lang`和`src`属性，`lang`决定了其代码编译过程，`src`决定是否外联代码，存在`src`属性且有效时，会忽略内联代码。
-
-示例如下：
-
-```Html
-<style lang="less" src="page1.less"></style>
-<template lang="wxml" src="page1.wxml"></template>
-<script>
-    // some code
-</script>
-```
-
-各标签对应的`lang`值如下表所示：
-
-| 标签       | lang默认值 | lang支持值                      |
-| -------- | ------- | ---------------------------- |
-| style    | `css`   | `css`、`less`、`sass`、`stylus` |
-| template | `wxml`  | `wxml`、`xml`、`pug(原jade)`    |
-| script   | `babel` | `babel`、`TypeScript`         |
-
-### 脚本部分介绍
-
-#### 小程序入口app.wpy
-
-```html
-<script>
-import wepy from 'wepy';
-export default class extends wepy.app {
-    config = {
-        "pages":[
-            "pages/index/index"
-        ],
-        "window":{
-            "backgroundTextStyle": "light",
-            "navigationBarBackgroundColor": "#fff",
-            "navigationBarTitleText": "WeChat",
-            "navigationBarTextStyle": "black"
-        }
-    };
-    onLaunch() {
-        console.log(this);
-    }
-}
-</script>
-
-<style lang="less">
-/** less **/
-</style>
-```
-
-入口文件`app.wpy`中所声明的小程序实例继承自`wepy.app`类，包含一个`config`属性和其它全局属性、方法、事件。其中`config`属性对应原生的`app.json`文件，build编译时会根据`config`属性自动生成`app.json`文件，如果需要修改`config`中的内容，请使用微信提供的相关API。
-
-#### 页面page.wpy
-
-```html
-<script>
-import wepy from 'wepy';
-import Counter from '../components/counter';
-   
-export default class Page extends wepy.page {
-    config = {};
-    components = {counter1: Counter};
-
-    data = {};
-    methods = {};
-
-    events = {};
-    onLoad() {};
-    // Other properties
-}
-</script>
-
-<template lang="wxml">
-    <view>
-    </view>
-    <counter1></counter1>
-</template>
-
-<style lang="less">
-/** less **/
-</style>
-```
-
-页面文件`page.wpy`中所声明的页面实例继承自`wepy.page`类，该类的主要属性介绍如下：
-
-| 属性         | 说明                                       |
-| ---------- | ---------------------------------------- |
-| config     | 页面配置对象，对应于原生的`page.json`文件，类似于`app.wpy`中的config |
-| components | 页面组件列表对象，声明页面所引入的组件列表                               |
-| data       | 页面渲染数据对象，存放可用于页面模板绑定的渲染数据                                |
-| methods    | wxml事件处理函数对象，存放响应wxml中所捕获到的事件的函数，如`bindtap`、`bindchange`        |
-| events     | WePY组件事件处理函数对象，存放响应组件之间通过`$broadcast`、`$emit`、`$invoke`所传递的事件的函数            |
-| 其它         | 小程序页面生命周期函数，如`onLoad`、`onReady`等，以及其它自定义的方法与属性    |
-
-#### 组件com.wpy
-
-```html
-<template lang="wxml">
-    <view>  </view>
-</template>
-
-<script>
-import wepy from 'wepy';
-export default class Com extends wepy.component {
-    components = {};
-
-    data = {};
-    methods = {};
-
-    events = {};
-    // Other properties
-}
-</script>
-
-<style lang="less">
-/** less **/
-</style>
-```
-
-组件文件`com.wpy`中所声明的组件实例继承自`wepy.component`类，除了不需要`config`配置以及页面特有的一些生命周期函数之外，其属性与页面属性大致相同。
-
-### 实例
-
-通过前文的介绍可知，在 WePY 中，小程序被分为三个实例：小程序实例`App`、页面实例`Page`、组件实例`Component`。其中`Page`实例继承自`Component`。各自的声明方式如下：
-
-```javascript
-import wepy from 'wepy';
-
-// 声明一个App小程序实例
-export default class MyAPP extends wepy.app {
-}
-
-// 声明一个Page页面实例
-export default class IndexPage extends wepy.page {
-}
-
-// 声明一个Component组件实例
-export default class MyComponent extends wepy.component {
-}
-```
-
-#### App小程序实例
-
-App小程序实例中主要包含小程序生命周期函数、config配置对象、globalData全局数据对象，以及其他自定义方法与属性。
-
-```javascript
-import wepy from 'wepy';
-
-export default class MyAPP extends wepy.app {
-    customData = {};
-
-    customFunction ()　{ }
-
-    onLaunch () {}
-
-    onShow () {}
-
-    config = {}  // 对应 app.json 文件
-    
-    globalData = {}
-}
-```
-
-在Page页面实例中，可以通过`this.$parent`来访问App实例。
-
-
-#### Page页面实例和Component组件实例
-
-由于Page页面实际上继承自Component组件，即Page也是组件。除扩展了页面所特有的`config`配置以及特有的页面生命周期函数之外，其它属性和方法与Component一致，因此这里以Page页面为例进行介绍。
-
-
-```javascript
-import wepy from 'wepy';
-
-// export default class MyPage extends wepy.page {
-export default class MyComponent extends wepy.component {
-    customData = {}  // 自定义数据
-
-    customFunction ()　{}  //自定义方法
-
-    onLoad () {}  // 在Page和Component共用的生命周期函数
-
-    onShow () {}  // 只在Page中存在的页面生命周期函数
-
-    config = {};  // 只在Page实例中存在的配置数据，对应于原生的page.json文件
-    
-    data = {};  // 页面所需数据均需在这里声明，可用于模板数据绑定
-
-    components = {};  // 声明页面中所引用的组件，或声明组件中所引用的子组件
-
-    mixins = [];  // 声明页面所引用的Mixin实例
-
-    computed = {};  // 声明计算属性（详见后文介绍）
-
-    watch = {};  // 声明数据watcher（详见后文介绍）
-
-    methods = {};  // 声明页面wxml中标签的事件处理函数。注意，此处只用于声明页面wxml中标签的bind、catch事件，自定义方法需以自定义方法的方式声明
-
-    events = {};  // 声明组件之间的事件处理函数
-}
-```
-
-注意，对于WePY中的methods属性，因为与Vue中的使用习惯不一致，非常容易造成误解，这里需要特别强调一下：WePY中的methods属性只能声明页面wxml标签的bind、catch事件，不能声明自定义方法，这与Vue中的用法是不一致的。示例如下：
-
-```javascript
-// 错误示例
-
-import wepy from 'wepy';
-
-export default class MyComponent extends wepy.component {
-    methods = {
-        bindtap () {
-            let rst = this.commonFunc();
-            // doSomething
-        },
-        
-        bindinput () {
-            let rst = this.commonFunc();
-            // doSomething
-        },
-        
-        //错误：普通自定义方法不能放在methods对象中
-        customFunction () {
-            return 'sth.';
-        }
-    };
-
-}
-
-
-// 正确示例
-
-import wepy from 'wepy';
-
-export default class MyComponent extends wepy.component {
-    methods = {
-        bindtap () {
-            let rst = this.commonFunc();
-            // doSomething
-        },
-        
-        bindinput () {
-            let rst = this.commonFunc();
-            // doSomething
-        },
-    }
-
-    //正确：普通自定义方法在methods对象外声明，与methods平级
-    customFunction () {
-        return 'sth.';
-    }
-
-}
-```
-
-### 组件
-
-原生小程序支持js<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/framework/app-service/module.html?t=20161107" target="_blank">模块化</a>，但彼此独立，业务代码与交互事件仍需在页面处理。无法实现组件化的松耦合与复用的效果。
-
-例如模板A中绑定一个`bindtap="myclick"`，模板B中同样绑定一样`bindtap="myclick"`，那么就会影响同一个页面事件。对于数据同样如此。因此，只有通过改变变量或者事件方法，或者给其加不同前缀才能实现绑定不同事件或者不同数据。当页面复杂之后就十分不利于开发维护。
-
-因此，在WePY中实现了小程序的组件化开发，组件的所有业务与功能在组件本身实现，组件与组件之间彼此隔离，上述例子在WePY的组件化开发过程中，A组件只会影响到A所绑定的`myclick`，B也如此。
-
-WePY编译组件的过程如下：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/22774767/8f090dd6-eee3-11e6-942b-1591a6379ad3.png">
-</p>
-
-#### 普通组件引用
-
-当页面需要引入组件或组件需要引入子组件时，必须在`.wpy`文件的`<script>`脚本部分先import组件文件，然后在`components`对象中给组件声明唯一的组件ID，接着在`<template>`模板部分中添加以`components`对象中所声明的组件ID进行命名的自定义标签以插入组件。如：
-
-```html
-/**
-project
-└── src
-    ├── components
-    |   └── child.wpy
-    ├── pages
-    |   ├── index.wpy    index 页面配置、结构、样式、逻辑
-    |   └── log.wpy      log 页面配置、结构、样式、逻辑
-    └──app.wpy           小程序配置项（全局公共配置、公共样式、声明钩子等）
-**/
-
-// index.wpy
-
-<template>
-    <!-- 以`<script>`脚本部分中所声明的组件ID为名命名自定义标签，从而在`<template>`模板部分中插入组件 -->
-    <child></child>
-</template>
-
-<script>
-    import wepy from 'wepy';
-    //引入组件文件
-    import Child from '../components/child';
-   
-    export default class Index extends wepy.component {
-        //声明组件，分配组件id为child
-        components = {
-            child: Child
-        };
-    }
-</script>
-```
-
-需要注意的是，WePY中的组件都是静态组件，是以组件ID作为唯一标识的，每一个ID都对应一个组件实例，当页面引入两个相同ID的组件时，这两个组件共用同一个实例与数据，当其中一个组件数据变化时，另外一个也会一起变化。
-
-如果需要避免这个问题，则需要分配多个组件ID和实例。代码如下：
-
-```html
-<template>
-    <view class="child1">
-        <child></child>
-    </view>
-   
-    <view class="child2">
-        <anotherchild></anotherchild>
-    </view>
-</template>
-
-
-<script>
-    import wepy from 'wepy';
-    import Child from '../components/child';
-   
-    export default class Index extends wepy.component {
-        components = {
-            //为两个相同组件的不同实例分配不同的组件ID，从而避免数据同步变化的问题
-            child: Child,
-            anotherchild: Child
-        };
-    }
-</script>
-```
-
-*注意*：WePY中，在父组件`template`模板部分插入驼峰式命名的子组件标签时，不能将驼峰式命名转换成短横杆式命名(比如将`childCom`转换成`child-com`)，这与Vue中的习惯是不一致。
-
-
-#### 组件的循环渲染
-
-*1.4.6新增*
-
-当需要循环渲染WePY组件时(类似于通过`wx:for`循环渲染原生的wxml标签)，必须使用WePY定义的辅助标签`<repeat>`，代码如下：
-
-```Html
-/**
-project
-└── src
-    ├── components
-    |   └── child.wpy
-    ├── pages
-    |   ├── index.wpy    index 页面配置、结构、样式、逻辑
-    |   └── log.wpy      log 页面配置、结构、样式、逻辑
-    └──app.wpy           小程序配置项（全局样式配置、声明钩子等）
-**/
-
-// index.wpy
-
-<template>
-    <!-- 注意，使用for属性，而不是使用wx:for属性 -->
-    <repeat for="{{list}}" key="index" index="index" item="item">
-        <!-- 插入<script>脚本部分所声明的child组件，同时传入item -->
-        <child :item="item"></child>
-    </repeat>
-</template>
-
-<script>
-    import wepy from 'wepy';
-    // 引入child组件文件
-    import Child from '../components/child';
-   
-    export default class Index extends wepy.component {
-        components = {
-            // 声明页面中要使用到的Child组件的ID为child
-            child: Child
-        }
-   
-        data = {
-            list: [{id: 1, title: 'title1'}, {id: 2, title: 'title2'}]
-        }
-    }
-</script>
-```
-
-页面可以引入组件，而组件还可以引入子组件。一个页面引入若干组件后，组件结构如下图：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554681/796da1ae-b198-11e6-91ab-e90f485c594d.png">
-</p>
-
-如上图所示，Page_Index页面引入了ComA、ComB、ComC三个组件，同时ComA组件和ComB组件又有自己的子组件ComD、ComE、ComF、ComG、ComH。
-
-#### computed 计算属性
-
-* **类型**: `{ [key: string]: Function }`
-
-* **详细**：
-
-`computed`计算属性，是一个有返回值的函数，可直接被当作绑定数据来使用。因此类似于`data`属性，代码中可通过`this.计算属性名`来引用，模板中也可通过`{{ 计算属性名 }}`来绑定数据。
-
-需要注意的是，只要是组件中有任何数据发生了改变，那么所有计算属性就都会被重新计算。
-
-* **示例**：
-
-    ```javascript
-    data = {
-        a: 1
-    }
-
-    // 计算属性aPlus，在脚本中可通过this.aPlus来引用，在模板中可通过{{ aPlus }}来插值
-    computed = {
-        aPlus () {
-            return this.a + 1
-        }
-    }
-    ```
-
-#### watcher 监听器
-
-* **类型**: `{ [key: string]: Function }`
-
-* **详细**：
-
-通过监听器`watcher`能够监听到任何数值属性的数值更新。监听器在`watch`对象中声明，类型为函数，函数名与需要被监听的`data`对象中的数值属性同名，每当被监听的数值属性改变一次，监听器函数就会被自动调用执行一次。
-
-监听器适用于当数值属性改变时需要进行某些额外处理的情形。
-
-* **示例**：
-
-    ```javascript
-    data = {
-        num: 1
-    }
-
-    // 监听器函数名必须跟需要被监听的data对象中的数值属性num同名，
-    // 其参数中的newValue为数值属性改变后的新值，oldValue为改变前的旧值
-    watch = {
-        num (newValue, oldValue) {
-            console.log(`num value: ${oldValue} -> ${newValue}`)
-        }
-    }
-
-    // 每当被监听的数值属性num改变一次，对应的同名监听器函数num()就被自动调用执行一次
-    onLoad () {
-        setInterval(() => {
-            this.num++;
-            this.$apply();
-        }, 1000)
-    }
-    ```
-
-
-#### props 传值
-
-props传值在WePY中属于父子组件之间传值的一种机制，包括静态传值与动态传值。
-
-在props对象中声明需要传递的值，静态传值与动态传值的声明略有不同，具体可参看下面的示例代码。
-
-**静态传值**
-
-静态传值为父组件向子组件传递常量数据，因此只能传递String字符串类型。
-
-
-在父组件`template`模板部分的组件标签中，使用子组件props对象中所声明的属性名作为其属性名来接收父组件传递的值。
-
-```Javascript
-<child title="mytitle"></child>
-
-// child.wpy
-props = {
-    title: String
-};
-
-onLoad () {
-    console.log(this.title); // mytitle
-}
-```
-
-**动态传值**
-
-
-动态传值是指父组件向子组件传递动态数据内容，父子组件数据完全独立互不干扰。但可以通过使用`.sync`修饰符来达到父组件数据绑定至子组件的效果，也可以通过设置子组件props的`twoWay: true`来达到子组件数据绑定至父组件的效果。那如果即使用`.sync`修饰符，同时子组件`props`中添加的`twoWay: true`时，就可以实现数据的双向绑定了。
-
-*注意*：下文示例中的`twoWay`为`true`时，表示子组件向父组件单向动态传值，而`twoWay`为`false`(默认值，可不写)时，则表示子组件不向父组件传值。这是与Vue不一致的地方，而这里之所以仍然使用`twoWay`，只是为了尽可能保持与Vue在标识符命名上的一致性。
-
-在父组件`template`模板部分所插入的子组件标签中，使用`:prop`属性（等价于Vue中的`v-bind:prop`属性）来进行动态传值。
-
-```Javascript
-// parent.wpy
-
-<child :title="parentTitle" :syncTitle.sync="parentTitle" :twoWayTitle="parentTitle"></child>
-
-data = {
-    parentTitle: 'p-title'
-};
-
-
-// child.wpy
-
-props = {
-    // 静态传值
-    title: String,
-    
-    // 父向子单向动态传值
-    syncTitle: {
-        type: String,
-        default: 'null'
-    },
-    
-    twoWayTitle: {
-        type: Number,
-        default: 50,
-        twoWay: true
-    }
-};
-
-onLoad () {
-    console.log(this.title); // p-title
-    console.log(this.syncTitle); // p-title
-    console.log(this.twoWayTitle); // 50
-
-    this.title = 'c-title';
-    console.log(this.$parent.parentTitle); // p-title.
-    this.twoWayTitle = 60;
-    this.$apply();
-    console.log(this.$parent.parentTitle); // 60.  --- twoWay为true时，子组件props中的属性值改变时，会同时改变父组件对应的值
-    this.$parent.parentTitle = 'p-title-changed';
-    this.$parent.$apply();
-    console.log(this.title); // 'p-title';
-    console.log(this.syncTitle); // 'p-title-changed' --- 有.sync修饰符的props属性值，当在父组件中改变时，会同时改变子组件对应的值。
-}
-```
-
-#### 组件通信与交互
-
-`wepy.component`基类提供`$broadcast`、`$emit`、`$invoke`三个方法用于组件之间的通信和交互，如：
-
-```javascript
-this.$emit('some-event', 1, 2, 3, 4);
-```
-
-用于监听组件之间的通信与交互事件的事件处理函数需要写在组件和页面的`events`对象中，如：
-
-```javascript
-import wepy from 'wepy'
-
-export default class Com extends wepy.component {
-    components = {};
-
-    data = {};
-    
-    methods = {};
-
-    // events对象中所声明的函数为用于监听组件之间的通信与交互事件的事件处理函数
-    events = {
-        'some-event': (p1, p2, p3, $event) => {
-               console.log(`${this.name} receive ${$event.name} from ${$event.source.name}`);
-        }
-    };
-    // Other properties
-}
-```
-
-**$broadcast**
-
-`$broadcast`事件是由父组件发起，所有子组件都会收到此广播事件，除非事件被手动取消。事件广播的顺序为广度优先搜索顺序，如上图，如果页面`Page_Index`发起一个`$broadcast`事件，那么按先后顺序依次接收到该事件的组件为：ComA、ComB、ComC、ComD、ComE、ComF、ComG、ComH。如下图：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554688/800089e6-b198-11e6-84c5-352d2d0e2f7e.png">
-</p>
-
-**$emit**
-
-`$emit`与`$broadcast`正好相反，事件发起组件的所有祖先组件会依次接收到`$emit`事件。如果组件ComE发起一个`$emit`事件，那么接收到事件的先后顺序为：组件ComA、页面Page_Index。如下图：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554704/9997932c-b198-11e6-9840-3edae2194f47.png">
-</p>
-
-**$invoke**
-
-`$invoke`是一个页面或组件对另一个组件中的方法的直接调用，通过传入组件路径找到相应的组件，然后再调用其方法。
-
-比如，想在页面`Page_Index`中调用组件ComA的某个方法：
-
-```Javascript
-this.$invoke('ComA', 'someMethod', 'someArgs');
-```
-
-如果想在组件ComA中调用组件ComG的某个方法：
-
-```Javascript
-this.$invoke('./../ComB/ComG', 'someMethod', 'someArgs');
-```
-
-#### 组件自定义事件处理函数
-
-*1.4.8新增*
-
-可以通过使用`.user`修饰符为自定义组件绑定事件，如：`@customEvent.user="myFn"`
-
-其中，`@`表示事件修饰符，`customEvent` 表示事件名称，`.user`表示事件后缀。
-
-目前总共有三种事件后缀：
-
-- `.default`: 绑定小程序冒泡型事件，如`bindtap`，`.default`后缀可省略不写；
-
-- `.stop`: 绑定小程序捕获型事，如`catchtap`；
-
-- `.user`: 绑定用户自定义组件事件，通过`$emit`触发。
-
-示例如下：
-
-```Html
-// index.wpy
-
-<template>
-    <child @childFn.user="parentFn"></child>
-</template>
-
-<script>
-    import wepy from 'wepy'
-    import Child from '../components/child'
-   
-    export default class Index extends wepy.page {
-        components = {
-            child: Child
-        }
-
-        methods = {
-            parentFn (num, evt) {
-                console.log('parent received emit event, number is: ' + num)
-            }
-        }
-    }
-</script>
-
-
-// child.wpy
-
-<template>
-    <view @tap="tap">Click me</view>
-</template>
-
-<script>
-    import wepy from 'wepy'
-   
-    export default class Child extends wepy.component {
-        methods = {
-            tap () {
-                console.log('child is clicked')
-                this.$emit('childFn', 100)
-            }
-        }
-    }
-</script>
-```
-
-
-#### slot 组件内容分发插槽
-
-WePY中的`slot`插槽作为内容分发标签的空间占位标签，便于在父组件中通过对相当于扩展板卡的内容分发标签的“插拔”，更为灵活、方便地对子组件进行内容分发。
-
-具体使用方法是，首先在子组件`template`模板部分中声明`slot`标签作为内容插槽，同时必须在其`name`属性中指定插槽名称，还可设置默认的标签内容；然后在引入了该带有插槽的子组件的父组件`template`模板部分中声明用于“插拔”的内容分发标签。
-
-注意，这些父组件中的内容分发标签必须具有`slot`属性，并且其值为子组件中对应的插槽名称，这样父组件内容分发标签中的内容会覆盖掉子组件对应插槽中的默认内容。
-
-另外，要特别注意的是，父组件中一旦声明了对应于子组件插槽的内容分发标签，即便没有内容，子组件插槽中的默认内容也不会显示出来，只有删除了父组件中对应的内容分发标签，才能显示出来。
-
-
-示例：
-
-在`Panel`组件中有以下模板：
-
-```html
-<view class="panel">
-    <slot name="title">默认标题</slot>
-    <slot name="content">默认内容</slot>
-</view>
-```
-
-在父组件中使用`Pannel`子组件时，可以这样使用：
-
-```html
-<panel>
-    <view slot="title">新的标题</view>
-    <view slot="content">
-        <text>新的内容</text>
-    </view>
-</panel>
-```
-
-### 第三方组件
-
-WePY允许使用基于WePY开发的第三方组件，开发第三方组件规范请参考<a href="https://github.com/wepyjs/wepy-com-toast" target="_blank">wepy-com-toast</a>。
-
-
-### 混合
-
-混合可以将组之间的可复用部分抽离，从而在组件中使用混合时，可以将混合的数据，事件以及方法注入到组件之中。混合分分为两种：
-
-* 默认式混合
-* 兼容式混合
-
-#### 默认式混合
-
-对于组件`data`数据，`components`组件，`events`事件以及其它自定义方法采用**默认式混合**，即如果组件未声明该数据，组件，事件，自定义方法等，那么将混合对象中的选项将注入组件这中。对于组件已声明的选项将不受影响。
-
-```Javascript
-// mixins/test.js
-import wepy from 'wepy';
-
-export default class TestMixin extends wepy.mixin {
-    data = {
-        foo: 'foo defined by page',
-        bar: 'bar defined by testMix'
-    };
-    methods: {
-    tap () {
-      console.log('mix tap');
-    }
-  }
-}
-
-// pages/index.wpy
-import wepy from 'wepy';
-import TestMixin from './mixins/test';
-
-export default class Index extends wepy.page {
-    data = {
-        foo: 'foo defined by index'
-    };
-    mixins = [TestMixin ];
-    onShow() {
-        console.log(this.foo); // foo defined by index.
-        console.log(this.bar); // foo defined by testMix.
-    }
-}
-```
-
-
-#### 兼容式混合
-
-对于组件`methods`响应事件，以及小程序页面事件将采用**兼容式混合**，即先响应组件本身响应事件，然后再响应混合对象中响应事件。
-
-```Javascript
-// mixins/test.js
-import wepy from 'wepy';
-
-export default class TestMixin extends wepy.mixin {
-    methods = {
-        tap () {
-            console.log('mix tap');
-        }
-    };
-    onShow() {
-        console.log('mix onshow');
-    }
-}
-
-// pages/index.wpy
-import wepy from 'wepy';
-import TestMixin from './mixins/test';
-
-export default class Index extends wepy.page {
-
-    mixins = [TestMixin];
-    methods = {
-        tap () {
-            console.log('index tap');
-        }
-    };
-    onShow() {
-        console.log('index onshow');
-    }
-}
-
-
-// index onshow
-// mix onshow
-// ----- when tap
-// index tap
-// mix tap
-```
-
-### 拦截器
-
-可以使用全域拦截器配置API的config、fail、success、complete方法，参考示例：
-
-```javascript
-import wepy from 'wepy';
-
-export default class extends wepy.app {
-
-    constructor () {
-        this.intercept('request', {
-            config (p) {
-                p.timestamp = +new Date();
-                return p;
-            },
-            success (p) {
-                console.log('request success');
-                return p;
-            },
-            fail (p) {
-                console.log('request error');
-                return p;
-            }
-        });
-    }
-}
-```
-
-
-### 数据绑定
-
-#### 小程序数据绑定方式
-小程序通过`Page`提供的`setData`方法去绑定数据，如：
-
-```Javascript
-this.setData({title: 'this is title'});
-```
-
-因为小程序架构本身原因，页面渲染层和JS逻辑层分开的，setData操作实际就是JS逻辑层与页面渲染层之间的通信，那么如果在同一次运行周期内多次执行`setData`操作时，那么通信的次数是一次还是多次呢？这个取决于API本身的设计。
-
-#### WePY数据绑定方式
-WePY使用脏数据检查对setData进行封装，在函数运行周期结束时执行脏数据检查，一来可以不用关心页面多次setData是否会有性能上的问题，二来可以更加简洁去修改数据实现绑定，不用重复去写setData方法。代码如下：
-
-```javascript
-this.title = 'this is title';
-```
-
-但需注意，在函数运行周期之外的函数里去修改数据需要手动调用`$apply`方法。如：
-
-```javascript
-setTimeout(() => {
-    this.title = 'this is title';
-    this.$apply();
-}, 3000);
-```
-
-#### WePY脏数据检查流程
-在执行脏数据检查时，会通过`this.$$phase`标识当前检查状态，并且会保证在并发的流程当中，只会有一个脏数据检查流程在运行，以下是执行脏数据检查的流程图：
-
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/2182004/20554709/a0d8b1e8-b198-11e6-9034-0997b33bdf95.png">
-</p>
-
-### 其它优化细节
-
-#### 1. wx.request 接收参数修改
-点这里查看<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html?t=20161122" target="_blank">官方文档</a>
-
-```javascript
-// 官方
-wx.request({
-    url: 'xxx',
-    success: function (data) {
-        console.log(data);
-    }
-});
-
-// WePY 使用方式
-wepy.request('xxxx').then((d) => console.log(d));
-```
-
-#### 2. 优化事件参数传递
-点这里查看<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/event.html?t=20161122" target="_blank">官方文档</a>
-
-```javascript
-// 官方
-<view data-id="{{index}}" data-title="wepy" data-other="otherparams" bindtap="tapName"> Click me! </view>
-Page({
-  tapName: function(event) {
-    console.log(event.currentTarget.dataset.id)// output: 1
-    console.log(event.currentTarget.dataset.title)// output: wepy
-    console.log(event.currentTarget.dataset.other)// output: otherparams
-  }
-});
-
-// WePY 1.1.8以后的版本，只允许传string。
-<view bindtap="tapName({{index}}, 'wepy', 'otherparams')"> Click me! </view>
-
-methods: {
-    tapName (id, title, other, event) {
-        console.log(id, title, other)// output: 1, wepy, otherparams
-    }
-}
-```
-
-#### 3. 改变数据绑定方式
-保留setData方法，但不建议使用setData执行绑定，修复传入`undefined`的bug，并且修改入参支持：
-`this.setData(target, value)`
-`this.setData(object)`
-
-点这里查看<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/template.html?t=20161122" target="_blank">官方文档</a>
-
-```html
-// 官方
-<view> {{ message }} </view>
-
-onLoad: function () {
-    this.setData({message: 'hello world'});
-}
-
-
-// WePY
-<view> {{ message }} </view>
-
-onLoad () {
-    this.message = 'hello world';
-}
-```
-
-#### 4. 组件代替模板和模块
-
-点这里查看<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/data.html?t=20161122" target="_blank">官方文档</a>
-
-```html
-// 官方
-<!-- item.wxml -->
-<template name="item">
-  <text>{{text}}</text>
-</template>
-
-<!-- index.wxml -->
-<import src="item.wxml"/>
-<template is="item" data="{{text: 'forbar'}}"/>
-
-<!-- index.js -->
-var item = require('item.js')
-
-
-
-
-// WePY
-<!-- /components/item.wpy -->
- <text>{{text}}</text>
-
-<!-- index.wpy -->
-<template>
-    <component id="item"></component>
-</template>
-<script>
-    import wepy from 'wepy';
-    import Item from '../components/item';
-    export default class Index extends wepy.page {
-        components = { Item }
-    }
-</script>
-```
-
diff --git a/docs/server.js b/docs/server.js
deleted file mode 100644
index e0d91ab49..000000000
--- a/docs/server.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var serveStatic = require('serve-static');
-var http = require('http');
-var fs = require('fs');
-
-http.createServer(function (req, res) {
-  serveStatic('.')(req, res, function () {
-    res.writeHead(404, { 'Content-Type': 'text/html' })
-    console.log(req);
-    res.end(fs.readFileSync('./index.html'))
-  })
-}).listen(3030, '0.0.0.0')
-
-console.log(`\nListening at http://0.0.0.0:3030\n`)
diff --git a/gulpfile.js b/gulpfile.js
deleted file mode 100644
index bbba160c4..000000000
--- a/gulpfile.js
+++ /dev/null
@@ -1,118 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-var fs      = require('fs');
-var path    = require("path");
-var watch = require("gulp-watch");
-var newer = require('gulp-newer');
-var lec = require('gulp-line-ending-corrector');
-var plumber = require("gulp-plumber");
-var babel   = require("gulp-babel");
-var gutil   = require("gulp-util");
-var through = require("through2");
-var gulp    = require("gulp");
-var chalk   = require("chalk");
-var gulpif = require('gulp-if');
-var mkdirp = require('mkpath');
-
-// for docs
-var gulp = require('gulp'),
-    less = require('gulp-less');
-
-var scripts = ['./packages/*/src/**/*.js', './packages/wepy-web/src/components/*.vue', './packages/wepy-web/src/apis/*.vue', './packages/wepy-web/src/apis/*.js', './packages/wepy-web/src/components/styles/*/*.less'];
-var docs = ['docs/less/**/*.less'];
-var bins = "./packages/*/bin/**/*";
-var srcEx, libFragment;
-
-
-if (path.win32 === path) {
-    srcEx = /(packages\\[^\\]+)\\src\\/;
-    libFragment = "$1\\lib\\";
-} else {
-    srcEx = new RegExp("(packages/[^/]+)/src/");
-    libFragment = "$1/lib/";
-}
-
-
-var mapToDest = function (path) { return path.replace(srcEx, libFragment); };
-var dest = "packages";
-
-gulp.task("default", ["build"]);
-
-gulp.task('lec', function () {
-    return gulp.src(bins, { base: "./" }).pipe(lec({eolc: 'LF', encoding:'utf8'})).pipe(gulp.dest('.'));
-});
-
-gulp.task("build", ['lec'], function () {
-  return gulp.src(scripts)
-    .pipe(plumber({
-        errorHandler: function (err) {
-            gutil.log(err.stack);
-        }
-    }))
-    .pipe(newer({map: mapToDest}))
-    .pipe(through.obj(function (file, enc, callback) {
-        file._path = file.path;
-        file.path = file.path.replace(srcEx, libFragment);
-        callback(null, file);
-    }))
-    .pipe(gulpif((file) => !/\.vue|\.less/.test(path.parse(file.path).ext), through.obj(function (file, enc, callback) {
-        gutil.log("Compiling", "'" + chalk.cyan(file.path) + "'...");
-        callback(null, file);
-    })))
-    // If it's vue, then copy only, else babel it.
-    .pipe(gulpif((file) => /\.vue|\.less/.test(path.parse(file.path).ext), through.obj(function (file, enc, callback) {
-        gutil.log("Copy Vue Component", "'" + chalk.cyan(file._path) + "'...");
-        mkdirp.sync(path.parse(file.path).dir);
-        fs.createReadStream(file._path).pipe(fs.createWriteStream(file.path));
-        callback(null, file);
-    }), babel()))
-    .pipe(gulp.dest(dest));
-});
-
-gulp.task('doc-watch', function () {
-    gulp.src(['docs/less/main.less', 'docs/less/donate.less'])
-    .pipe(less())
-    .pipe(gulp.dest('docs/css'));
-})
-gulp.task("build-watch", function () {
-    return gulp.src(scripts)
-        .pipe(plumber({
-            errorHandler: function (err) {
-                gutil.log(err.stack);
-            }
-        }))
-        .pipe(through.obj(function (file, enc, callback) {
-            file._path = file.path;
-            file.path = file.path.replace(srcEx, libFragment);
-            callback(null, file);
-        }))
-        .pipe(newer(dest))
-        .pipe(gulpif((file) => !/\.vue|\.less/.test(path.parse(file.path).ext), through.obj(function (file, enc, callback) {
-            gutil.log("Compiling", "'" + chalk.cyan(file._path) + "'...");
-            callback(null, file);
-        })))
-        // If it's vue, then copy only, else babel it.
-        .pipe(gulpif((file) => /\.vue|\.less/.test(path.parse(file.path).ext), through.obj(function (file, enc, callback) {
-            gutil.log("Copy Vue Component", "'" + chalk.cyan(file._path) + "'...");
-            mkdirp.sync(path.parse(file.path).dir);
-            fs.createReadStream(file._path).pipe(fs.createWriteStream(file.path));
-            callback(null, file);
-        }), babel()))
-        .pipe(gulp.dest(dest));
-});
-
-gulp.task("watch", ['build-watch', 'doc-watch'], function (callback) {
-    watch(scripts, {debounceDelay: 200}, function () {
-        gulp.start("build-watch");
-    });
-    watch(docs, {debounceDelay: 200}, function () {
-        gulp.start("doc-watch");
-    });
-});
\ No newline at end of file
diff --git a/lerna.json b/lerna.json
index c76b903d7..cdecd8b37 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,7 +1,14 @@
 {
-  "lerna": "2.0.0-beta.31",
   "packages": [
     "packages/*"
   ],
-  "version": "1.5.9"
+  "version": "2.1.0",
+  "message": "chore(release): publish",
+  "command": {
+    "publish": {
+      "commitHooks": false,
+      "conventionalCommits": true,
+      "message": "chore(release): publish %s"
+    }
+  }
 }
diff --git a/package-lock.json b/package-lock.json
index 195e3fa9e..e68b862a3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,5537 +1,15015 @@
 {
   "name": "wepy",
-  "version": "1.1.8",
+  "version": "0.0.0",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
-    "JSV": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz",
-      "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c=",
-      "dev": true
-    },
-    "abbrev": {
-      "version": "1.0.9",
-      "resolved": "http://registry.npm.taobao.org/abbrev/download/abbrev-1.0.9.tgz",
-      "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=",
-      "dev": true
-    },
-    "accord": {
-      "version": "0.27.3",
-      "resolved": "https://registry.npmjs.org/accord/-/accord-0.27.3.tgz",
-      "integrity": "sha1-f7kSlwkoXK6oTrNyxOiCAxtxOOg=",
-      "dev": true,
-      "requires": {
-        "convert-source-map": "1.5.0",
-        "glob": "7.1.2",
-        "indx": "0.2.3",
-        "lodash.clone": "4.5.0",
-        "lodash.defaults": "4.2.0",
-        "lodash.flatten": "4.4.0",
-        "lodash.merge": "4.6.0",
-        "lodash.partialright": "4.2.1",
-        "lodash.pick": "4.4.0",
-        "lodash.uniq": "4.5.0",
-        "resolve": "1.4.0",
-        "semver": "5.4.1",
-        "uglify-js": "2.8.29",
-        "when": "3.7.8"
+    "@babel/code-frame": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
+      "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+      "dev": true,
+      "requires": {
+        "@babel/highlight": "^7.8.3"
+      }
+    },
+    "@babel/core": {
+      "version": "7.9.0",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz",
+      "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.8.3",
+        "@babel/generator": "^7.9.0",
+        "@babel/helper-module-transforms": "^7.9.0",
+        "@babel/helpers": "^7.9.0",
+        "@babel/parser": "^7.9.0",
+        "@babel/template": "^7.8.6",
+        "@babel/traverse": "^7.9.0",
+        "@babel/types": "^7.9.0",
+        "convert-source-map": "^1.7.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.1",
+        "json5": "^2.1.2",
+        "lodash": "^4.17.13",
+        "resolve": "^1.3.2",
+        "semver": "^5.4.1",
+        "source-map": "^0.5.0"
       },
       "dependencies": {
-        "semver": {
-          "version": "5.4.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
-          "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "json5": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+          "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
           "dev": true
         }
       }
     },
-    "acorn": {
-      "version": "5.1.2",
-      "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-5.1.2.tgz",
-      "integrity": "sha1-kRy1PgNoB88Pp3jcXTcPvYZCRtc=",
-      "dev": true
-    },
-    "acorn-jsx": {
-      "version": "3.0.1",
-      "resolved": "http://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-3.0.1.tgz",
-      "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+    "@babel/generator": {
+      "version": "7.9.5",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz",
+      "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==",
       "dev": true,
       "requires": {
-        "acorn": "3.3.0"
+        "@babel/types": "^7.9.5",
+        "jsesc": "^2.5.1",
+        "lodash": "^4.17.13",
+        "source-map": "^0.5.0"
       },
       "dependencies": {
-        "acorn": {
-          "version": "3.3.0",
-          "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-3.3.0.tgz",
-          "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+        "jsesc": {
+          "version": "2.5.2",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
           "dev": true
         }
       }
     },
-    "ajv": {
-      "version": "4.11.8",
-      "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-4.11.8.tgz",
-      "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
+    "@babel/helper-function-name": {
+      "version": "7.9.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz",
+      "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==",
       "dev": true,
       "requires": {
-        "co": "4.6.0",
-        "json-stable-stringify": "1.0.1"
+        "@babel/helper-get-function-arity": "^7.8.3",
+        "@babel/template": "^7.8.3",
+        "@babel/types": "^7.9.5"
       }
     },
-    "ajv-keywords": {
-      "version": "1.5.1",
-      "resolved": "http://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-1.5.1.tgz",
-      "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=",
-      "dev": true
-    },
-    "align-text": {
-      "version": "0.1.4",
-      "resolved": "http://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz",
-      "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+    "@babel/helper-get-function-arity": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
+      "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
       "dev": true,
       "requires": {
-        "kind-of": "3.2.2",
-        "longest": "1.0.1",
-        "repeat-string": "1.6.1"
+        "@babel/types": "^7.8.3"
       }
     },
-    "amdefine": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz",
-      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
-      "dev": true
-    },
-    "ansi-escapes": {
-      "version": "1.4.0",
-      "resolved": "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-1.4.0.tgz",
-      "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=",
-      "dev": true
-    },
-    "ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-      "dev": true
-    },
-    "ansi-styles": {
-      "version": "2.2.1",
-      "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz",
-      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-      "dev": true
-    },
-    "anymatch": {
-      "version": "1.3.2",
-      "resolved": "http://registry.npm.taobao.org/anymatch/download/anymatch-1.3.2.tgz",
-      "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=",
+    "@babel/helper-member-expression-to-functions": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz",
+      "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==",
       "dev": true,
       "requires": {
-        "micromatch": "2.3.11",
-        "normalize-path": "2.1.1"
+        "@babel/types": "^7.8.3"
       }
     },
-    "archy": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/archy/download/archy-1.0.0.tgz",
-      "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
-      "dev": true
-    },
-    "argparse": {
-      "version": "1.0.9",
-      "resolved": "http://registry.npm.taobao.org/argparse/download/argparse-1.0.9.tgz",
-      "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
+    "@babel/helper-module-imports": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz",
+      "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==",
       "dev": true,
       "requires": {
-        "sprintf-js": "1.0.3"
+        "@babel/types": "^7.8.3"
       }
     },
-    "arr-diff": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/arr-diff/download/arr-diff-2.0.0.tgz",
-      "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+    "@babel/helper-module-transforms": {
+      "version": "7.9.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz",
+      "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==",
       "dev": true,
       "requires": {
-        "arr-flatten": "1.1.0"
+        "@babel/helper-module-imports": "^7.8.3",
+        "@babel/helper-replace-supers": "^7.8.6",
+        "@babel/helper-simple-access": "^7.8.3",
+        "@babel/helper-split-export-declaration": "^7.8.3",
+        "@babel/template": "^7.8.6",
+        "@babel/types": "^7.9.0",
+        "lodash": "^4.17.13"
       }
     },
-    "arr-flatten": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz",
-      "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=",
-      "dev": true
-    },
-    "array-differ": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/array-differ/download/array-differ-1.0.0.tgz",
-      "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
-      "dev": true
-    },
-    "array-each": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/array-each/download/array-each-1.0.1.tgz",
-      "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
-      "dev": true
-    },
-    "array-find-index": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/array-find-index/download/array-find-index-1.0.2.tgz",
-      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
-      "dev": true
-    },
-    "array-from": {
-      "version": "2.1.1",
-      "resolved": "http://registry.npm.taobao.org/array-from/download/array-from-2.1.1.tgz",
-      "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=",
-      "dev": true
-    },
-    "array-slice": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/array-slice/download/array-slice-1.0.0.tgz",
-      "integrity": "sha1-5zA08A3MH0CHYAj9IP6ud71LfC8=",
-      "dev": true
-    },
-    "array-union": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/array-union/download/array-union-1.0.2.tgz",
-      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+    "@babel/helper-optimise-call-expression": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz",
+      "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==",
       "dev": true,
       "requires": {
-        "array-uniq": "1.0.3"
+        "@babel/types": "^7.8.3"
       }
     },
-    "array-uniq": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/array-uniq/download/array-uniq-1.0.3.tgz",
-      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
-      "dev": true
-    },
-    "array-unique": {
-      "version": "0.2.1",
-      "resolved": "http://registry.npm.taobao.org/array-unique/download/array-unique-0.2.1.tgz",
-      "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
-      "dev": true
-    },
-    "arrify": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/arrify/download/arrify-1.0.1.tgz",
-      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
-      "dev": true
-    },
-    "asap": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
-      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
-      "dev": true,
-      "optional": true
-    },
-    "asn1": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
-      "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
-      "dev": true,
-      "optional": true
-    },
-    "assert-plus": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
-      "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
-      "dev": true,
-      "optional": true
-    },
-    "async": {
-      "version": "1.5.2",
-      "resolved": "http://registry.npm.taobao.org/async/download/async-1.5.2.tgz",
-      "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
-      "dev": true
-    },
-    "async-each": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/async-each/download/async-each-1.0.1.tgz",
-      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
-      "dev": true
-    },
-    "asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
-      "dev": true,
-      "optional": true
-    },
-    "aws-sign2": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
-      "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
-      "dev": true,
-      "optional": true
-    },
-    "aws4": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
-      "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
-      "dev": true,
-      "optional": true
-    },
-    "babel": {
-      "version": "6.23.0",
-      "resolved": "http://registry.npm.taobao.org/babel/download/babel-6.23.0.tgz",
-      "integrity": "sha1-0NHn2APpdHZb7qMjLU4VPA77kPQ=",
-      "dev": true
-    },
-    "babel-cli": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-cli/download/babel-cli-6.26.0.tgz",
-      "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=",
+    "@babel/helper-replace-supers": {
+      "version": "7.8.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz",
+      "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==",
       "dev": true,
       "requires": {
-        "babel-core": "6.26.0",
-        "babel-polyfill": "6.26.0",
-        "babel-register": "6.26.0",
-        "babel-runtime": "6.26.0",
-        "chokidar": "1.7.0",
-        "commander": "2.11.0",
-        "convert-source-map": "1.5.0",
-        "fs-readdir-recursive": "1.0.0",
-        "glob": "7.1.2",
-        "lodash": "4.17.4",
-        "output-file-sync": "1.1.2",
-        "path-is-absolute": "1.0.1",
-        "slash": "1.0.0",
-        "source-map": "0.5.7",
-        "v8flags": "2.1.1"
+        "@babel/helper-member-expression-to-functions": "^7.8.3",
+        "@babel/helper-optimise-call-expression": "^7.8.3",
+        "@babel/traverse": "^7.8.6",
+        "@babel/types": "^7.8.6"
       }
     },
-    "babel-code-frame": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-code-frame/download/babel-code-frame-6.26.0.tgz",
-      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+    "@babel/helper-simple-access": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz",
+      "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==",
       "dev": true,
       "requires": {
-        "chalk": "1.1.3",
-        "esutils": "2.0.2",
-        "js-tokens": "3.0.2"
-      }
-    },
-    "babel-core": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-core/download/babel-core-6.26.0.tgz",
-      "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=",
-      "dev": true,
-      "requires": {
-        "babel-code-frame": "6.26.0",
-        "babel-generator": "6.26.0",
-        "babel-helpers": "6.24.1",
-        "babel-messages": "6.23.0",
-        "babel-register": "6.26.0",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0",
-        "babylon": "6.18.0",
-        "convert-source-map": "1.5.0",
-        "debug": "2.6.8",
-        "json5": "0.5.1",
-        "lodash": "4.17.4",
-        "minimatch": "3.0.4",
-        "path-is-absolute": "1.0.1",
-        "private": "0.1.7",
-        "slash": "1.0.0",
-        "source-map": "0.5.7"
+        "@babel/template": "^7.8.3",
+        "@babel/types": "^7.8.3"
       }
     },
-    "babel-eslint": {
-      "version": "7.2.3",
-      "resolved": "http://registry.npm.taobao.org/babel-eslint/download/babel-eslint-7.2.3.tgz",
-      "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=",
+    "@babel/helper-split-export-declaration": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
+      "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
       "dev": true,
       "requires": {
-        "babel-code-frame": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0",
-        "babylon": "6.18.0"
+        "@babel/types": "^7.8.3"
       }
     },
-    "babel-generator": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-generator/download/babel-generator-6.26.0.tgz",
-      "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=",
+    "@babel/helper-validator-identifier": {
+      "version": "7.9.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz",
+      "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==",
+      "dev": true
+    },
+    "@babel/helpers": {
+      "version": "7.9.2",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz",
+      "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==",
       "dev": true,
       "requires": {
-        "babel-messages": "6.23.0",
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0",
-        "detect-indent": "4.0.0",
-        "jsesc": "1.3.0",
-        "lodash": "4.17.4",
-        "source-map": "0.5.7",
-        "trim-right": "1.0.1"
+        "@babel/template": "^7.8.3",
+        "@babel/traverse": "^7.9.0",
+        "@babel/types": "^7.9.0"
       }
     },
-    "babel-helper-bindify-decorators": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-bindify-decorators/download/babel-helper-bindify-decorators-6.24.1.tgz",
-      "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=",
+    "@babel/highlight": {
+      "version": "7.9.0",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
+      "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0"
+        "@babel/helper-validator-identifier": "^7.9.0",
+        "chalk": "^2.0.0",
+        "js-tokens": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
-    "babel-helper-builder-binary-assignment-operator-visitor": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-builder-binary-assignment-operator-visitor/download/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
-      "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+    "@babel/parser": {
+      "version": "7.9.4",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
+      "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==",
+      "dev": true
+    },
+    "@babel/template": {
+      "version": "7.8.6",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
+      "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
       "dev": true,
       "requires": {
-        "babel-helper-explode-assignable-expression": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
+        "@babel/code-frame": "^7.8.3",
+        "@babel/parser": "^7.8.6",
+        "@babel/types": "^7.8.6"
       }
     },
-    "babel-helper-call-delegate": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-call-delegate/download/babel-helper-call-delegate-6.24.1.tgz",
-      "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+    "@babel/traverse": {
+      "version": "7.9.5",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz",
+      "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==",
       "dev": true,
       "requires": {
-        "babel-helper-hoist-variables": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0"
+        "@babel/code-frame": "^7.8.3",
+        "@babel/generator": "^7.9.5",
+        "@babel/helper-function-name": "^7.9.5",
+        "@babel/helper-split-export-declaration": "^7.8.3",
+        "@babel/parser": "^7.9.0",
+        "@babel/types": "^7.9.5",
+        "debug": "^4.1.0",
+        "globals": "^11.1.0",
+        "lodash": "^4.17.13"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "globals": {
+          "version": "11.12.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+          "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
       }
     },
-    "babel-helper-define-map": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-define-map/download/babel-helper-define-map-6.26.0.tgz",
-      "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+    "@babel/types": {
+      "version": "7.9.5",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
+      "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
       "dev": true,
       "requires": {
-        "babel-helper-function-name": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0",
-        "lodash": "4.17.4"
+        "@babel/helper-validator-identifier": "^7.9.5",
+        "lodash": "^4.17.13",
+        "to-fast-properties": "^2.0.0"
+      },
+      "dependencies": {
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
       }
     },
-    "babel-helper-explode-assignable-expression": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-explode-assignable-expression/download/babel-helper-explode-assignable-expression-6.24.1.tgz",
-      "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
+    "@evocateur/libnpmaccess": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npm.taobao.org/@evocateur/libnpmaccess/download/@evocateur/libnpmaccess-3.1.2.tgz",
+      "integrity": "sha1-7Pf2zmsATp+UKwmNkiAL5KSxyEU=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0"
+        "@evocateur/npm-registry-fetch": "^4.0.0",
+        "aproba": "^2.0.0",
+        "figgy-pudding": "^3.5.1",
+        "get-stream": "^4.0.0",
+        "npm-package-arg": "^6.1.0"
+      },
+      "dependencies": {
+        "aproba": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/aproba/download/aproba-2.0.0.tgz",
+          "integrity": "sha1-UlILiuW1aSFbNU78DKo/4eRaitw=",
+          "dev": true
+        }
       }
     },
-    "babel-helper-explode-class": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-explode-class/download/babel-helper-explode-class-6.24.1.tgz",
-      "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=",
-      "dev": true,
-      "requires": {
-        "babel-helper-bindify-decorators": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0"
+    "@evocateur/libnpmpublish": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npm.taobao.org/@evocateur/libnpmpublish/download/@evocateur/libnpmpublish-1.2.2.tgz",
+      "integrity": "sha1-Vd8J0tyhNq+6nIjHWconIZjbnxo=",
+      "dev": true,
+      "requires": {
+        "@evocateur/npm-registry-fetch": "^4.0.0",
+        "aproba": "^2.0.0",
+        "figgy-pudding": "^3.5.1",
+        "get-stream": "^4.0.0",
+        "lodash.clonedeep": "^4.5.0",
+        "normalize-package-data": "^2.4.0",
+        "npm-package-arg": "^6.1.0",
+        "semver": "^5.5.1",
+        "ssri": "^6.0.1"
+      },
+      "dependencies": {
+        "aproba": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/aproba/download/aproba-2.0.0.tgz",
+          "integrity": "sha1-UlILiuW1aSFbNU78DKo/4eRaitw=",
+          "dev": true
+        }
       }
     },
-    "babel-helper-function-name": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-function-name/download/babel-helper-function-name-6.24.1.tgz",
-      "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+    "@evocateur/npm-registry-fetch": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npm.taobao.org/@evocateur/npm-registry-fetch/download/@evocateur/npm-registry-fetch-4.0.0.tgz",
+      "integrity": "sha1-jEw4dm2NMtMgD8sKg/BktXNl7WY=",
       "dev": true,
       "requires": {
-        "babel-helper-get-function-arity": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0"
+        "JSONStream": "^1.3.4",
+        "bluebird": "^3.5.1",
+        "figgy-pudding": "^3.4.1",
+        "lru-cache": "^5.1.1",
+        "make-fetch-happen": "^5.0.0",
+        "npm-package-arg": "^6.1.0",
+        "safe-buffer": "^5.1.2"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz",
+          "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz",
+          "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=",
+          "dev": true
+        }
       }
     },
-    "babel-helper-get-function-arity": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-get-function-arity/download/babel-helper-get-function-arity-6.24.1.tgz",
-      "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+    "@evocateur/pacote": {
+      "version": "9.6.5",
+      "resolved": "https://registry.npm.taobao.org/@evocateur/pacote/download/@evocateur/pacote-9.6.5.tgz",
+      "integrity": "sha1-M94yuiELbxfCDrq01JfvxnVfSuU=",
+      "dev": true,
+      "requires": {
+        "@evocateur/npm-registry-fetch": "^4.0.0",
+        "bluebird": "^3.5.3",
+        "cacache": "^12.0.3",
+        "chownr": "^1.1.2",
+        "figgy-pudding": "^3.5.1",
+        "get-stream": "^4.1.0",
+        "glob": "^7.1.4",
+        "infer-owner": "^1.0.4",
+        "lru-cache": "^5.1.1",
+        "make-fetch-happen": "^5.0.0",
+        "minimatch": "^3.0.4",
+        "minipass": "^2.3.5",
+        "mississippi": "^3.0.0",
+        "mkdirp": "^0.5.1",
+        "normalize-package-data": "^2.5.0",
+        "npm-package-arg": "^6.1.0",
+        "npm-packlist": "^1.4.4",
+        "npm-pick-manifest": "^3.0.0",
+        "osenv": "^0.1.5",
+        "promise-inflight": "^1.0.1",
+        "promise-retry": "^1.1.1",
+        "protoduck": "^5.0.1",
+        "rimraf": "^2.6.3",
+        "safe-buffer": "^5.2.0",
+        "semver": "^5.7.0",
+        "ssri": "^6.0.1",
+        "tar": "^4.4.10",
+        "unique-filename": "^1.1.1",
+        "which": "^1.3.1"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz",
+          "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz?cache=0&sync_timestamp=1581257110269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz",
+          "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz",
+          "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=",
+          "dev": true
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz",
+          "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=",
+          "dev": true
+        }
+      }
+    },
+    "@istanbuljs/load-nyc-config": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz",
+      "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
+        "camelcase": "^5.3.1",
+        "find-up": "^4.1.0",
+        "js-yaml": "^3.13.1",
+        "resolve-from": "^5.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+          "dev": true
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
+        "resolve-from": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+          "dev": true
+        }
       }
     },
-    "babel-helper-hoist-variables": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-hoist-variables/download/babel-helper-hoist-variables-6.24.1.tgz",
-      "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+    "@istanbuljs/schema": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz",
+      "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==",
+      "dev": true
+    },
+    "@lerna/add": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/add/download/@lerna/add-3.21.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40lerna%2Fadd%2Fdownload%2F%40lerna%2Fadd-3.21.0.tgz",
+      "integrity": "sha1-JwB73nHMewopaas8LwrkFXi0V3s=",
+      "dev": true,
+      "requires": {
+        "@evocateur/pacote": "^9.6.3",
+        "@lerna/bootstrap": "3.21.0",
+        "@lerna/command": "3.21.0",
+        "@lerna/filter-options": "3.20.0",
+        "@lerna/npm-conf": "3.16.0",
+        "@lerna/validation-error": "3.13.0",
+        "dedent": "^0.7.0",
+        "npm-package-arg": "^6.1.0",
+        "p-map": "^2.1.0",
+        "semver": "^6.2.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        }
+      }
+    },
+    "@lerna/bootstrap": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/bootstrap/download/@lerna/bootstrap-3.21.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40lerna%2Fbootstrap%2Fdownload%2F%40lerna%2Fbootstrap-3.21.0.tgz",
+      "integrity": "sha1-vNG2Ub5bCXCyDY+uBMhkVIEjrtY=",
+      "dev": true,
+      "requires": {
+        "@lerna/command": "3.21.0",
+        "@lerna/filter-options": "3.20.0",
+        "@lerna/has-npm-version": "3.16.5",
+        "@lerna/npm-install": "3.16.5",
+        "@lerna/package-graph": "3.18.5",
+        "@lerna/pulse-till-done": "3.13.0",
+        "@lerna/rimraf-dir": "3.16.5",
+        "@lerna/run-lifecycle": "3.16.2",
+        "@lerna/run-topologically": "3.18.5",
+        "@lerna/symlink-binary": "3.17.0",
+        "@lerna/symlink-dependencies": "3.17.0",
+        "@lerna/validation-error": "3.13.0",
+        "dedent": "^0.7.0",
+        "get-port": "^4.2.0",
+        "multimatch": "^3.0.0",
+        "npm-package-arg": "^6.1.0",
+        "npmlog": "^4.1.2",
+        "p-finally": "^1.0.0",
+        "p-map": "^2.1.0",
+        "p-map-series": "^1.0.0",
+        "p-waterfall": "^1.0.0",
+        "read-package-tree": "^5.1.6",
+        "semver": "^6.2.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        }
+      }
+    },
+    "@lerna/changed": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/changed/download/@lerna/changed-3.21.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40lerna%2Fchanged%2Fdownload%2F%40lerna%2Fchanged-3.21.0.tgz",
+      "integrity": "sha1-EI4V9nm/4HevUA9YJIxjTxBE6gs=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
+        "@lerna/collect-updates": "3.20.0",
+        "@lerna/command": "3.21.0",
+        "@lerna/listable": "3.18.5",
+        "@lerna/output": "3.13.0"
       }
     },
-    "babel-helper-optimise-call-expression": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-optimise-call-expression/download/babel-helper-optimise-call-expression-6.24.1.tgz",
-      "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+    "@lerna/check-working-tree": {
+      "version": "3.16.5",
+      "resolved": "https://registry.npm.taobao.org/@lerna/check-working-tree/download/@lerna/check-working-tree-3.16.5.tgz",
+      "integrity": "sha1-tPiuYbtFI1Yd+5+PjYdN1Gu0S6o=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
+        "@lerna/collect-uncommitted": "3.16.5",
+        "@lerna/describe-ref": "3.16.5",
+        "@lerna/validation-error": "3.13.0"
       }
     },
-    "babel-helper-regex": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-regex/download/babel-helper-regex-6.26.0.tgz",
-      "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+    "@lerna/child-process": {
+      "version": "3.16.5",
+      "resolved": "https://registry.npm.taobao.org/@lerna/child-process/download/@lerna/child-process-3.16.5.tgz",
+      "integrity": "sha1-OPo8GAZKpKwHVK2AEUd2p7NqabI=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0",
-        "lodash": "4.17.4"
+        "chalk": "^2.3.1",
+        "execa": "^1.0.0",
+        "strong-log-transformer": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz",
+          "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1591687070184&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz",
+          "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz",
+          "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
-    "babel-helper-remap-async-to-generator": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-remap-async-to-generator/download/babel-helper-remap-async-to-generator-6.24.1.tgz",
-      "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
+    "@lerna/clean": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/clean/download/@lerna/clean-3.21.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40lerna%2Fclean%2Fdownload%2F%40lerna%2Fclean-3.21.0.tgz",
+      "integrity": "sha1-wLRrUwDMPa4s2jvsFLgDCC2jhW0=",
       "dev": true,
       "requires": {
-        "babel-helper-function-name": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0"
+        "@lerna/command": "3.21.0",
+        "@lerna/filter-options": "3.20.0",
+        "@lerna/prompt": "3.18.5",
+        "@lerna/pulse-till-done": "3.13.0",
+        "@lerna/rimraf-dir": "3.16.5",
+        "p-map": "^2.1.0",
+        "p-map-series": "^1.0.0",
+        "p-waterfall": "^1.0.0"
       }
     },
-    "babel-helper-replace-supers": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-replace-supers/download/babel-helper-replace-supers-6.24.1.tgz",
-      "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+    "@lerna/cli": {
+      "version": "3.18.5",
+      "resolved": "https://registry.npm.taobao.org/@lerna/cli/download/@lerna/cli-3.18.5.tgz",
+      "integrity": "sha1-yQxGFUL801ttWwFaKQ+w2/tB0kI=",
       "dev": true,
       "requires": {
-        "babel-helper-optimise-call-expression": "6.24.1",
-        "babel-messages": "6.23.0",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0"
+        "@lerna/global-options": "3.13.0",
+        "dedent": "^0.7.0",
+        "npmlog": "^4.1.2",
+        "yargs": "^14.2.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz",
+          "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz",
+          "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz",
+          "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=",
+          "dev": true
+        },
+        "cliui": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-5.0.0.tgz?cache=0&sync_timestamp=1573943292170&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-5.0.0.tgz",
+          "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=",
+          "dev": true,
+          "requires": {
+            "string-width": "^3.1.0",
+            "strip-ansi": "^5.2.0",
+            "wrap-ansi": "^5.1.0"
+          }
+        },
+        "get-caller-file": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz",
+          "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=",
+          "dev": true
+        },
+        "require-main-filename": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz",
+          "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz",
+          "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz",
+          "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
+        "which-module": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+          "dev": true
+        },
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          }
+        },
+        "yargs": {
+          "version": "14.2.3",
+          "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-14.2.3.tgz",
+          "integrity": "sha1-Ghw+3O0a+yov6jNgS8bR2NaIpBQ=",
+          "dev": true,
+          "requires": {
+            "cliui": "^5.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^3.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^15.0.1"
+          }
+        },
+        "yargs-parser": {
+          "version": "15.0.1",
+          "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-15.0.1.tgz?cache=0&sync_timestamp=1590107599564&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-15.0.1.tgz",
+          "integrity": "sha1-VHhq9AuCDcsvuAJbEbTWWddjI7M=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
       }
     },
-    "babel-helpers": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helpers/download/babel-helpers-6.24.1.tgz",
-      "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+    "@lerna/collect-uncommitted": {
+      "version": "3.16.5",
+      "resolved": "https://registry.npm.taobao.org/@lerna/collect-uncommitted/download/@lerna/collect-uncommitted-3.16.5.tgz",
+      "integrity": "sha1-pJTWGqwxzceuxLvlLJZVAnQTLmM=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0"
+        "@lerna/child-process": "3.16.5",
+        "chalk": "^2.3.1",
+        "figgy-pudding": "^3.5.1",
+        "npmlog": "^4.1.2"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz",
+          "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1591687070184&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz",
+          "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz",
+          "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
-    "babel-messages": {
-      "version": "6.23.0",
-      "resolved": "http://registry.npm.taobao.org/babel-messages/download/babel-messages-6.23.0.tgz",
-      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+    "@lerna/collect-updates": {
+      "version": "3.20.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/collect-updates/download/@lerna/collect-updates-3.20.0.tgz",
+      "integrity": "sha1-YvnXa6IaJbfZ+/McAt6IdEpWS9E=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0"
+        "@lerna/child-process": "3.16.5",
+        "@lerna/describe-ref": "3.16.5",
+        "minimatch": "^3.0.4",
+        "npmlog": "^4.1.2",
+        "slash": "^2.0.0"
+      },
+      "dependencies": {
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/slash/download/slash-2.0.0.tgz",
+          "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q=",
+          "dev": true
+        }
       }
     },
-    "babel-plugin-check-es2015-constants": {
-      "version": "6.22.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-check-es2015-constants/download/babel-plugin-check-es2015-constants-6.22.0.tgz",
-      "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+    "@lerna/command": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/command/download/@lerna/command-3.21.0.tgz",
+      "integrity": "sha1-miODdZ3HtwDaz6iiKy86bhkBIfc=",
+      "dev": true,
+      "requires": {
+        "@lerna/child-process": "3.16.5",
+        "@lerna/package-graph": "3.18.5",
+        "@lerna/project": "3.21.0",
+        "@lerna/validation-error": "3.13.0",
+        "@lerna/write-log-file": "3.13.0",
+        "clone-deep": "^4.0.1",
+        "dedent": "^0.7.0",
+        "execa": "^1.0.0",
+        "is-ci": "^2.0.0",
+        "npmlog": "^4.1.2"
+      }
+    },
+    "@lerna/conventional-commits": {
+      "version": "3.22.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/conventional-commits/download/@lerna/conventional-commits-3.22.0.tgz",
+      "integrity": "sha1-J5j0iB7i70V72uAnq30L8K9vHgk=",
+      "dev": true,
+      "requires": {
+        "@lerna/validation-error": "3.13.0",
+        "conventional-changelog-angular": "^5.0.3",
+        "conventional-changelog-core": "^3.1.6",
+        "conventional-recommended-bump": "^5.0.0",
+        "fs-extra": "^8.1.0",
+        "get-stream": "^4.0.0",
+        "lodash.template": "^4.5.0",
+        "npm-package-arg": "^6.1.0",
+        "npmlog": "^4.1.2",
+        "pify": "^4.0.1",
+        "semver": "^6.2.0"
+      },
+      "dependencies": {
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz",
+          "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
+        },
+        "lodash._reinterpolate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+          "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+          "dev": true
+        },
+        "lodash.template": {
+          "version": "4.5.0",
+          "resolved": "https://registry.npm.taobao.org/lodash.template/download/lodash.template-4.5.0.tgz",
+          "integrity": "sha1-+XYZXPPzR9DV9SSDVp/oAxzM6Ks=",
+          "dev": true,
+          "requires": {
+            "lodash._reinterpolate": "^3.0.0",
+            "lodash.templatesettings": "^4.0.0"
+          }
+        },
+        "lodash.templatesettings": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npm.taobao.org/lodash.templatesettings/download/lodash.templatesettings-4.2.0.tgz",
+          "integrity": "sha1-5IExDwSdPPbUfpEq0JMTsVTw+zM=",
+          "dev": true,
+          "requires": {
+            "lodash._reinterpolate": "^3.0.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        }
+      }
+    },
+    "@lerna/create": {
+      "version": "3.22.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/create/download/@lerna/create-3.22.0.tgz",
+      "integrity": "sha1-1rvQN8PcW0Jf5fbRuBcFfCePdhk=",
+      "dev": true,
+      "requires": {
+        "@evocateur/pacote": "^9.6.3",
+        "@lerna/child-process": "3.16.5",
+        "@lerna/command": "3.21.0",
+        "@lerna/npm-conf": "3.16.0",
+        "@lerna/validation-error": "3.13.0",
+        "camelcase": "^5.0.0",
+        "dedent": "^0.7.0",
+        "fs-extra": "^8.1.0",
+        "globby": "^9.2.0",
+        "init-package-json": "^1.10.3",
+        "npm-package-arg": "^6.1.0",
+        "p-reduce": "^1.0.0",
+        "pify": "^4.0.1",
+        "semver": "^6.2.0",
+        "slash": "^2.0.0",
+        "validate-npm-package-license": "^3.0.3",
+        "validate-npm-package-name": "^3.0.0",
+        "whatwg-url": "^7.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz",
+          "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=",
+          "dev": true
+        },
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz",
+          "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/slash/download/slash-2.0.0.tgz",
+          "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q=",
+          "dev": true
+        }
+      }
+    },
+    "@lerna/create-symlink": {
+      "version": "3.16.2",
+      "resolved": "https://registry.npm.taobao.org/@lerna/create-symlink/download/@lerna/create-symlink-3.16.2.tgz",
+      "integrity": "sha1-QSy45Zpy9afZRj5ORyGtIHAUmWc=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0"
+        "@zkochan/cmd-shim": "^3.1.0",
+        "fs-extra": "^8.1.0",
+        "npmlog": "^4.1.2"
+      },
+      "dependencies": {
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz",
+          "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
+        }
       }
     },
-    "babel-plugin-syntax-async-functions": {
-      "version": "6.13.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-async-functions/download/babel-plugin-syntax-async-functions-6.13.0.tgz",
-      "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
-      "dev": true
+    "@lerna/describe-ref": {
+      "version": "3.16.5",
+      "resolved": "https://registry.npm.taobao.org/@lerna/describe-ref/download/@lerna/describe-ref-3.16.5.tgz",
+      "integrity": "sha1-ozjCWq7YN9PccLinLER8XGY0asA=",
+      "dev": true,
+      "requires": {
+        "@lerna/child-process": "3.16.5",
+        "npmlog": "^4.1.2"
+      }
     },
-    "babel-plugin-syntax-async-generators": {
-      "version": "6.13.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-async-generators/download/babel-plugin-syntax-async-generators-6.13.0.tgz",
-      "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=",
-      "dev": true
+    "@lerna/diff": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/diff/download/@lerna/diff-3.21.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40lerna%2Fdiff%2Fdownload%2F%40lerna%2Fdiff-3.21.0.tgz",
+      "integrity": "sha1-5t8Ni5kWFn/1pJ/LAqwGQkKApo0=",
+      "dev": true,
+      "requires": {
+        "@lerna/child-process": "3.16.5",
+        "@lerna/command": "3.21.0",
+        "@lerna/validation-error": "3.13.0",
+        "npmlog": "^4.1.2"
+      }
     },
-    "babel-plugin-syntax-class-constructor-call": {
-      "version": "6.18.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-class-constructor-call/download/babel-plugin-syntax-class-constructor-call-6.18.0.tgz",
-      "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=",
-      "dev": true
+    "@lerna/exec": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/exec/download/@lerna/exec-3.21.0.tgz",
+      "integrity": "sha1-F/B1M4k8uRihe0G8xWbcQ3AW2yY=",
+      "dev": true,
+      "requires": {
+        "@lerna/child-process": "3.16.5",
+        "@lerna/command": "3.21.0",
+        "@lerna/filter-options": "3.20.0",
+        "@lerna/profiler": "3.20.0",
+        "@lerna/run-topologically": "3.18.5",
+        "@lerna/validation-error": "3.13.0",
+        "p-map": "^2.1.0"
+      }
     },
-    "babel-plugin-syntax-class-properties": {
-      "version": "6.13.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-class-properties/download/babel-plugin-syntax-class-properties-6.13.0.tgz",
-      "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=",
-      "dev": true
+    "@lerna/filter-options": {
+      "version": "3.20.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/filter-options/download/@lerna/filter-options-3.20.0.tgz",
+      "integrity": "sha1-Dw9dWkeDhW7s5CBHCMyQLLyK9Zs=",
+      "dev": true,
+      "requires": {
+        "@lerna/collect-updates": "3.20.0",
+        "@lerna/filter-packages": "3.18.0",
+        "dedent": "^0.7.0",
+        "figgy-pudding": "^3.5.1",
+        "npmlog": "^4.1.2"
+      }
     },
-    "babel-plugin-syntax-decorators": {
-      "version": "6.13.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-decorators/download/babel-plugin-syntax-decorators-6.13.0.tgz",
-      "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=",
-      "dev": true
+    "@lerna/filter-packages": {
+      "version": "3.18.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/filter-packages/download/@lerna/filter-packages-3.18.0.tgz",
+      "integrity": "sha1-ano3bShSCNsDqClYz7gXLhebTnA=",
+      "dev": true,
+      "requires": {
+        "@lerna/validation-error": "3.13.0",
+        "multimatch": "^3.0.0",
+        "npmlog": "^4.1.2"
+      }
     },
-    "babel-plugin-syntax-dynamic-import": {
-      "version": "6.18.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-dynamic-import/download/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
-      "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=",
-      "dev": true
+    "@lerna/get-npm-exec-opts": {
+      "version": "3.13.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/get-npm-exec-opts/download/@lerna/get-npm-exec-opts-3.13.0.tgz",
+      "integrity": "sha1-0bVSywCIGZ/D5+Em+RTjmgjfnqU=",
+      "dev": true,
+      "requires": {
+        "npmlog": "^4.1.2"
+      }
     },
-    "babel-plugin-syntax-exponentiation-operator": {
-      "version": "6.13.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-exponentiation-operator/download/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
-      "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
-      "dev": true
-    },
-    "babel-plugin-syntax-export-extensions": {
-      "version": "6.13.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-export-extensions/download/babel-plugin-syntax-export-extensions-6.13.0.tgz",
-      "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=",
-      "dev": true
-    },
-    "babel-plugin-syntax-object-rest-spread": {
-      "version": "6.13.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-object-rest-spread/download/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
-      "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
-      "dev": true
-    },
-    "babel-plugin-syntax-trailing-function-commas": {
-      "version": "6.22.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-trailing-function-commas/download/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
-      "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
-      "dev": true
-    },
-    "babel-plugin-transform-async-generator-functions": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-async-generator-functions/download/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
-      "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
+    "@lerna/get-packed": {
+      "version": "3.16.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/get-packed/download/@lerna/get-packed-3.16.0.tgz",
+      "integrity": "sha1-GzFrcG3O6Gx7qlXlCwh5WUR4Uv8=",
       "dev": true,
       "requires": {
-        "babel-helper-remap-async-to-generator": "6.24.1",
-        "babel-plugin-syntax-async-generators": "6.13.0",
-        "babel-runtime": "6.26.0"
+        "fs-extra": "^8.1.0",
+        "ssri": "^6.0.1",
+        "tar": "^4.4.8"
+      },
+      "dependencies": {
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz",
+          "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
+        }
       }
     },
-    "babel-plugin-transform-async-to-generator": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-async-to-generator/download/babel-plugin-transform-async-to-generator-6.24.1.tgz",
-      "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
+    "@lerna/github-client": {
+      "version": "3.22.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/github-client/download/@lerna/github-client-3.22.0.tgz",
+      "integrity": "sha1-XYFqpPdnR+1zauZP+WK48Vw1TZU=",
       "dev": true,
       "requires": {
-        "babel-helper-remap-async-to-generator": "6.24.1",
-        "babel-plugin-syntax-async-functions": "6.13.0",
-        "babel-runtime": "6.26.0"
+        "@lerna/child-process": "3.16.5",
+        "@octokit/plugin-enterprise-rest": "^6.0.1",
+        "@octokit/rest": "^16.28.4",
+        "git-url-parse": "^11.1.2",
+        "npmlog": "^4.1.2"
       }
     },
-    "babel-plugin-transform-class-constructor-call": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-class-constructor-call/download/babel-plugin-transform-class-constructor-call-6.24.1.tgz",
-      "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=",
+    "@lerna/gitlab-client": {
+      "version": "3.15.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/gitlab-client/download/@lerna/gitlab-client-3.15.0.tgz",
+      "integrity": "sha1-kfTsjGl7WsV/fyW9UP5lnSSqlqY=",
       "dev": true,
       "requires": {
-        "babel-plugin-syntax-class-constructor-call": "6.18.0",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0"
+        "node-fetch": "^2.5.0",
+        "npmlog": "^4.1.2",
+        "whatwg-url": "^7.0.0"
       }
     },
-    "babel-plugin-transform-class-properties": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-class-properties/download/babel-plugin-transform-class-properties-6.24.1.tgz",
-      "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=",
+    "@lerna/global-options": {
+      "version": "3.13.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/global-options/download/@lerna/global-options-3.13.0.tgz",
+      "integrity": "sha1-IXZiKQ2watnPLEnY4xAO4o6uuuE=",
+      "dev": true
+    },
+    "@lerna/has-npm-version": {
+      "version": "3.16.5",
+      "resolved": "https://registry.npm.taobao.org/@lerna/has-npm-version/download/@lerna/has-npm-version-3.16.5.tgz",
+      "integrity": "sha1-q4OVbyEdiSPqav6bl5s4zHOxUyY=",
       "dev": true,
       "requires": {
-        "babel-helper-function-name": "6.24.1",
-        "babel-plugin-syntax-class-properties": "6.13.0",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0"
+        "@lerna/child-process": "3.16.5",
+        "semver": "^6.2.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        }
       }
     },
-    "babel-plugin-transform-decorators": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-decorators/download/babel-plugin-transform-decorators-6.24.1.tgz",
-      "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=",
+    "@lerna/import": {
+      "version": "3.22.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/import/download/@lerna/import-3.22.0.tgz",
+      "integrity": "sha1-Gl8DlPOOI8T2QqEj5eFRfnDQaNI=",
       "dev": true,
       "requires": {
-        "babel-helper-explode-class": "6.24.1",
-        "babel-plugin-syntax-decorators": "6.13.0",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-types": "6.26.0"
+        "@lerna/child-process": "3.16.5",
+        "@lerna/command": "3.21.0",
+        "@lerna/prompt": "3.18.5",
+        "@lerna/pulse-till-done": "3.13.0",
+        "@lerna/validation-error": "3.13.0",
+        "dedent": "^0.7.0",
+        "fs-extra": "^8.1.0",
+        "p-map-series": "^1.0.0"
+      },
+      "dependencies": {
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz",
+          "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
+        }
       }
     },
-    "babel-plugin-transform-es2015-arrow-functions": {
-      "version": "6.22.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-arrow-functions/download/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
-      "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+    "@lerna/info": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/info/download/@lerna/info-3.21.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40lerna%2Finfo%2Fdownload%2F%40lerna%2Finfo-3.21.0.tgz",
+      "integrity": "sha1-dmlrZ2/bDzXUjIPGPB4yu143gU8=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0"
+        "@lerna/command": "3.21.0",
+        "@lerna/output": "3.13.0",
+        "envinfo": "^7.3.1"
       }
     },
-    "babel-plugin-transform-es2015-block-scoped-functions": {
-      "version": "6.22.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-block-scoped-functions/download/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
-      "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+    "@lerna/init": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/init/download/@lerna/init-3.21.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40lerna%2Finit%2Fdownload%2F%40lerna%2Finit-3.21.0.tgz",
+      "integrity": "sha1-HoEJNNyL9OU4bAMQQYgdO0CWqlw=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0"
+        "@lerna/child-process": "3.16.5",
+        "@lerna/command": "3.21.0",
+        "fs-extra": "^8.1.0",
+        "p-map": "^2.1.0",
+        "write-json-file": "^3.2.0"
+      },
+      "dependencies": {
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz",
+          "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
+        }
       }
     },
-    "babel-plugin-transform-es2015-block-scoping": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-block-scoping/download/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
-      "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+    "@lerna/link": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/link/download/@lerna/link-3.21.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40lerna%2Flink%2Fdownload%2F%40lerna%2Flink-3.21.0.tgz",
+      "integrity": "sha1-i+aP8MzuEEsXS1u9YGMCwvBunZs=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0",
-        "lodash": "4.17.4"
+        "@lerna/command": "3.21.0",
+        "@lerna/package-graph": "3.18.5",
+        "@lerna/symlink-dependencies": "3.17.0",
+        "p-map": "^2.1.0",
+        "slash": "^2.0.0"
+      },
+      "dependencies": {
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/slash/download/slash-2.0.0.tgz",
+          "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q=",
+          "dev": true
+        }
       }
     },
-    "babel-plugin-transform-es2015-classes": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-classes/download/babel-plugin-transform-es2015-classes-6.24.1.tgz",
-      "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+    "@lerna/list": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/list/download/@lerna/list-3.21.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40lerna%2Flist%2Fdownload%2F%40lerna%2Flist-3.21.0.tgz",
+      "integrity": "sha1-Qvdvr6Vt6hO2keyMqxODJpHWHaI=",
       "dev": true,
       "requires": {
-        "babel-helper-define-map": "6.26.0",
-        "babel-helper-function-name": "6.24.1",
-        "babel-helper-optimise-call-expression": "6.24.1",
-        "babel-helper-replace-supers": "6.24.1",
-        "babel-messages": "6.23.0",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0"
+        "@lerna/command": "3.21.0",
+        "@lerna/filter-options": "3.20.0",
+        "@lerna/listable": "3.18.5",
+        "@lerna/output": "3.13.0"
       }
     },
-    "babel-plugin-transform-es2015-computed-properties": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-computed-properties/download/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
-      "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+    "@lerna/listable": {
+      "version": "3.18.5",
+      "resolved": "https://registry.npm.taobao.org/@lerna/listable/download/@lerna/listable-3.18.5.tgz",
+      "integrity": "sha1-6CeYQFte2PxRhDyO8eeg5Jc4iho=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0"
+        "@lerna/query-graph": "3.18.5",
+        "chalk": "^2.3.1",
+        "columnify": "^1.5.4"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz",
+          "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1591687070184&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz",
+          "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz",
+          "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
-    "babel-plugin-transform-es2015-destructuring": {
-      "version": "6.23.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-destructuring/download/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
-      "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+    "@lerna/log-packed": {
+      "version": "3.16.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/log-packed/download/@lerna/log-packed-3.16.0.tgz",
+      "integrity": "sha1-+DmRBB7neySVY04URwtCJZ/SvBY=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0"
+        "byte-size": "^5.0.1",
+        "columnify": "^1.5.4",
+        "has-unicode": "^2.0.1",
+        "npmlog": "^4.1.2"
       }
     },
-    "babel-plugin-transform-es2015-duplicate-keys": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-duplicate-keys/download/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
-      "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+    "@lerna/npm-conf": {
+      "version": "3.16.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/npm-conf/download/@lerna/npm-conf-3.16.0.tgz",
+      "integrity": "sha1-HBComuL2wu6WliVXc4aFMA03aCc=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
+        "config-chain": "^1.1.11",
+        "pify": "^4.0.1"
       }
     },
-    "babel-plugin-transform-es2015-for-of": {
-      "version": "6.23.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-for-of/download/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
-      "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+    "@lerna/npm-dist-tag": {
+      "version": "3.18.5",
+      "resolved": "https://registry.npm.taobao.org/@lerna/npm-dist-tag/download/@lerna/npm-dist-tag-3.18.5.tgz",
+      "integrity": "sha1-nvmrt8EEB3sx9vqyLMc7MU1UrFU=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0"
+        "@evocateur/npm-registry-fetch": "^4.0.0",
+        "@lerna/otplease": "3.18.5",
+        "figgy-pudding": "^3.5.1",
+        "npm-package-arg": "^6.1.0",
+        "npmlog": "^4.1.2"
       }
     },
-    "babel-plugin-transform-es2015-function-name": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-function-name/download/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
-      "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+    "@lerna/npm-install": {
+      "version": "3.16.5",
+      "resolved": "https://registry.npm.taobao.org/@lerna/npm-install/download/@lerna/npm-install-3.16.5.tgz",
+      "integrity": "sha1-1r/cFvgShdpmUVrkeSTW4njWN9M=",
       "dev": true,
       "requires": {
-        "babel-helper-function-name": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
+        "@lerna/child-process": "3.16.5",
+        "@lerna/get-npm-exec-opts": "3.13.0",
+        "fs-extra": "^8.1.0",
+        "npm-package-arg": "^6.1.0",
+        "npmlog": "^4.1.2",
+        "signal-exit": "^3.0.2",
+        "write-pkg": "^3.1.0"
+      },
+      "dependencies": {
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz",
+          "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
+        }
       }
     },
-    "babel-plugin-transform-es2015-literals": {
-      "version": "6.22.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-literals/download/babel-plugin-transform-es2015-literals-6.22.0.tgz",
-      "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+    "@lerna/npm-publish": {
+      "version": "3.18.5",
+      "resolved": "https://registry.npm.taobao.org/@lerna/npm-publish/download/@lerna/npm-publish-3.18.5.tgz",
+      "integrity": "sha1-JA5AOZWf2YFrScWwdCHhG1ywAK8=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0"
+        "@evocateur/libnpmpublish": "^1.2.2",
+        "@lerna/otplease": "3.18.5",
+        "@lerna/run-lifecycle": "3.16.2",
+        "figgy-pudding": "^3.5.1",
+        "fs-extra": "^8.1.0",
+        "npm-package-arg": "^6.1.0",
+        "npmlog": "^4.1.2",
+        "pify": "^4.0.1",
+        "read-package-json": "^2.0.13"
+      },
+      "dependencies": {
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz",
+          "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
+        }
       }
     },
-    "babel-plugin-transform-es2015-modules-amd": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-amd/download/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
-      "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+    "@lerna/npm-run-script": {
+      "version": "3.16.5",
+      "resolved": "https://registry.npm.taobao.org/@lerna/npm-run-script/download/@lerna/npm-run-script-3.16.5.tgz",
+      "integrity": "sha1-nC7IJFOibAtG7cC7fBWBbIIfXBU=",
       "dev": true,
       "requires": {
-        "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0"
+        "@lerna/child-process": "3.16.5",
+        "@lerna/get-npm-exec-opts": "3.13.0",
+        "npmlog": "^4.1.2"
       }
     },
-    "babel-plugin-transform-es2015-modules-commonjs": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-commonjs/download/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz",
-      "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=",
+    "@lerna/otplease": {
+      "version": "3.18.5",
+      "resolved": "https://registry.npm.taobao.org/@lerna/otplease/download/@lerna/otplease-3.18.5.tgz",
+      "integrity": "sha1-t3uOdgtAq62fdljZiPPqd9T9AjE=",
       "dev": true,
       "requires": {
-        "babel-plugin-transform-strict-mode": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-types": "6.26.0"
+        "@lerna/prompt": "3.18.5",
+        "figgy-pudding": "^3.5.1"
       }
     },
-    "babel-plugin-transform-es2015-modules-systemjs": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-systemjs/download/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
-      "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+    "@lerna/output": {
+      "version": "3.13.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/output/download/@lerna/output-3.13.0.tgz",
+      "integrity": "sha1-Pe18yQiyephyIopjDZUK7a56SYk=",
       "dev": true,
       "requires": {
-        "babel-helper-hoist-variables": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0"
+        "npmlog": "^4.1.2"
       }
     },
-    "babel-plugin-transform-es2015-modules-umd": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-umd/download/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
-      "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+    "@lerna/pack-directory": {
+      "version": "3.16.4",
+      "resolved": "https://registry.npm.taobao.org/@lerna/pack-directory/download/@lerna/pack-directory-3.16.4.tgz",
+      "integrity": "sha1-Pq5fkb31rP4DhFEO1T+t3EwHRpM=",
       "dev": true,
       "requires": {
-        "babel-plugin-transform-es2015-modules-amd": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0"
+        "@lerna/get-packed": "3.16.0",
+        "@lerna/package": "3.16.0",
+        "@lerna/run-lifecycle": "3.16.2",
+        "figgy-pudding": "^3.5.1",
+        "npm-packlist": "^1.4.4",
+        "npmlog": "^4.1.2",
+        "tar": "^4.4.10",
+        "temp-write": "^3.4.0"
       }
     },
-    "babel-plugin-transform-es2015-object-super": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-object-super/download/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
-      "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+    "@lerna/package": {
+      "version": "3.16.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/package/download/@lerna/package-3.16.0.tgz",
+      "integrity": "sha1-fgpG5Gl+2LipwU1Zx/iQ4NOLoTw=",
       "dev": true,
       "requires": {
-        "babel-helper-replace-supers": "6.24.1",
-        "babel-runtime": "6.26.0"
+        "load-json-file": "^5.3.0",
+        "npm-package-arg": "^6.1.0",
+        "write-pkg": "^3.1.0"
       }
     },
-    "babel-plugin-transform-es2015-parameters": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-parameters/download/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
-      "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+    "@lerna/package-graph": {
+      "version": "3.18.5",
+      "resolved": "https://registry.npm.taobao.org/@lerna/package-graph/download/@lerna/package-graph-3.18.5.tgz",
+      "integrity": "sha1-x0Di6jV40FnlUWM+lQaQgxuUH2s=",
       "dev": true,
       "requires": {
-        "babel-helper-call-delegate": "6.24.1",
-        "babel-helper-get-function-arity": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0"
+        "@lerna/prerelease-id-from-version": "3.16.0",
+        "@lerna/validation-error": "3.13.0",
+        "npm-package-arg": "^6.1.0",
+        "npmlog": "^4.1.2",
+        "semver": "^6.2.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        }
       }
     },
-    "babel-plugin-transform-es2015-shorthand-properties": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-shorthand-properties/download/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
-      "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+    "@lerna/prerelease-id-from-version": {
+      "version": "3.16.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/prerelease-id-from-version/download/@lerna/prerelease-id-from-version-3.16.0.tgz",
+      "integrity": "sha1-skv6eJ9eG6q5FNewi6rpt719g6E=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
+        "semver": "^6.2.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        }
       }
     },
-    "babel-plugin-transform-es2015-spread": {
-      "version": "6.22.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-spread/download/babel-plugin-transform-es2015-spread-6.22.0.tgz",
-      "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+    "@lerna/profiler": {
+      "version": "3.20.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/profiler/download/@lerna/profiler-3.20.0.tgz",
+      "integrity": "sha1-D23CNvTqj56l81jGcDMFpPMq0FE=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0"
+        "figgy-pudding": "^3.5.1",
+        "fs-extra": "^8.1.0",
+        "npmlog": "^4.1.2",
+        "upath": "^1.2.0"
+      },
+      "dependencies": {
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz",
+          "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
+        }
       }
     },
-    "babel-plugin-transform-es2015-sticky-regex": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-sticky-regex/download/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
-      "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
-      "dev": true,
-      "requires": {
-        "babel-helper-regex": "6.26.0",
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
+    "@lerna/project": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/project/download/@lerna/project-3.21.0.tgz?cache=0&sync_timestamp=1589331988000&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40lerna%2Fproject%2Fdownload%2F%40lerna%2Fproject-3.21.0.tgz",
+      "integrity": "sha1-XXhNLRDFYaAPIDILzbBAmXwQUC0=",
+      "dev": true,
+      "requires": {
+        "@lerna/package": "3.16.0",
+        "@lerna/validation-error": "3.13.0",
+        "cosmiconfig": "^5.1.0",
+        "dedent": "^0.7.0",
+        "dot-prop": "^4.2.0",
+        "glob-parent": "^5.0.0",
+        "globby": "^9.2.0",
+        "load-json-file": "^5.3.0",
+        "npmlog": "^4.1.2",
+        "p-map": "^2.1.0",
+        "resolve-from": "^4.0.0",
+        "write-json-file": "^3.2.0"
+      },
+      "dependencies": {
+        "glob-parent": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz",
+          "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "is-extglob": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz",
+          "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^2.1.1"
+          }
+        },
+        "resolve-from": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz",
+          "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=",
+          "dev": true
+        }
       }
     },
-    "babel-plugin-transform-es2015-template-literals": {
-      "version": "6.22.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-template-literals/download/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
-      "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0"
+    "@lerna/prompt": {
+      "version": "3.18.5",
+      "resolved": "https://registry.npm.taobao.org/@lerna/prompt/download/@lerna/prompt-3.18.5.tgz",
+      "integrity": "sha1-YozVRfIliH0GBJGrld+JnPxSGKE=",
+      "dev": true,
+      "requires": {
+        "inquirer": "^6.2.0",
+        "npmlog": "^4.1.2"
+      }
+    },
+    "@lerna/publish": {
+      "version": "3.22.1",
+      "resolved": "https://registry.npm.taobao.org/@lerna/publish/download/@lerna/publish-3.22.1.tgz?cache=0&sync_timestamp=1591666526479&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40lerna%2Fpublish%2Fdownload%2F%40lerna%2Fpublish-3.22.1.tgz",
+      "integrity": "sha1-tPfOP7oemvsovkofPYgiImm6lRk=",
+      "dev": true,
+      "requires": {
+        "@evocateur/libnpmaccess": "^3.1.2",
+        "@evocateur/npm-registry-fetch": "^4.0.0",
+        "@evocateur/pacote": "^9.6.3",
+        "@lerna/check-working-tree": "3.16.5",
+        "@lerna/child-process": "3.16.5",
+        "@lerna/collect-updates": "3.20.0",
+        "@lerna/command": "3.21.0",
+        "@lerna/describe-ref": "3.16.5",
+        "@lerna/log-packed": "3.16.0",
+        "@lerna/npm-conf": "3.16.0",
+        "@lerna/npm-dist-tag": "3.18.5",
+        "@lerna/npm-publish": "3.18.5",
+        "@lerna/otplease": "3.18.5",
+        "@lerna/output": "3.13.0",
+        "@lerna/pack-directory": "3.16.4",
+        "@lerna/prerelease-id-from-version": "3.16.0",
+        "@lerna/prompt": "3.18.5",
+        "@lerna/pulse-till-done": "3.13.0",
+        "@lerna/run-lifecycle": "3.16.2",
+        "@lerna/run-topologically": "3.18.5",
+        "@lerna/validation-error": "3.13.0",
+        "@lerna/version": "3.22.1",
+        "figgy-pudding": "^3.5.1",
+        "fs-extra": "^8.1.0",
+        "npm-package-arg": "^6.1.0",
+        "npmlog": "^4.1.2",
+        "p-finally": "^1.0.0",
+        "p-map": "^2.1.0",
+        "p-pipe": "^1.2.0",
+        "semver": "^6.2.0"
+      },
+      "dependencies": {
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz",
+          "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        }
       }
     },
-    "babel-plugin-transform-es2015-typeof-symbol": {
-      "version": "6.23.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-typeof-symbol/download/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
-      "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+    "@lerna/pulse-till-done": {
+      "version": "3.13.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/pulse-till-done/download/@lerna/pulse-till-done-3.13.0.tgz",
+      "integrity": "sha1-yOnOW6+vENkwpn1+0My12Vj+ARA=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0"
+        "npmlog": "^4.1.2"
       }
     },
-    "babel-plugin-transform-es2015-unicode-regex": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-unicode-regex/download/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
-      "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+    "@lerna/query-graph": {
+      "version": "3.18.5",
+      "resolved": "https://registry.npm.taobao.org/@lerna/query-graph/download/@lerna/query-graph-3.18.5.tgz",
+      "integrity": "sha1-30gwu1FVJzADvzXo3aHDLQknvYY=",
       "dev": true,
       "requires": {
-        "babel-helper-regex": "6.26.0",
-        "babel-runtime": "6.26.0",
-        "regexpu-core": "2.0.0"
+        "@lerna/package-graph": "3.18.5",
+        "figgy-pudding": "^3.5.1"
       }
     },
-    "babel-plugin-transform-exponentiation-operator": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-exponentiation-operator/download/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
-      "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+    "@lerna/resolve-symlink": {
+      "version": "3.16.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/resolve-symlink/download/@lerna/resolve-symlink-3.16.0.tgz",
+      "integrity": "sha1-N/xwlfq9vPMXwm63Tg0L3o79I4Y=",
       "dev": true,
       "requires": {
-        "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1",
-        "babel-plugin-syntax-exponentiation-operator": "6.13.0",
-        "babel-runtime": "6.26.0"
+        "fs-extra": "^8.1.0",
+        "npmlog": "^4.1.2",
+        "read-cmd-shim": "^1.0.1"
+      },
+      "dependencies": {
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz",
+          "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
+        }
       }
     },
-    "babel-plugin-transform-export-extensions": {
-      "version": "6.22.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-export-extensions/download/babel-plugin-transform-export-extensions-6.22.0.tgz",
-      "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=",
+    "@lerna/rimraf-dir": {
+      "version": "3.16.5",
+      "resolved": "https://registry.npm.taobao.org/@lerna/rimraf-dir/download/@lerna/rimraf-dir-3.16.5.tgz",
+      "integrity": "sha1-BDFqtf/SkJZXqvOI6lAsuMLyCgk=",
       "dev": true,
       "requires": {
-        "babel-plugin-syntax-export-extensions": "6.13.0",
-        "babel-runtime": "6.26.0"
+        "@lerna/child-process": "3.16.5",
+        "npmlog": "^4.1.2",
+        "path-exists": "^3.0.0",
+        "rimraf": "^2.6.2"
+      },
+      "dependencies": {
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz?cache=0&sync_timestamp=1581257110269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz",
+          "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
       }
     },
-    "babel-plugin-transform-object-rest-spread": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-object-rest-spread/download/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
-      "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
+    "@lerna/run": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/run/download/@lerna/run-3.21.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40lerna%2Frun%2Fdownload%2F%40lerna%2Frun-3.21.0.tgz",
+      "integrity": "sha1-KjXshJeeTW5CR0/hSNMuXeHKyJE=",
       "dev": true,
       "requires": {
-        "babel-plugin-syntax-object-rest-spread": "6.13.0",
-        "babel-runtime": "6.26.0"
+        "@lerna/command": "3.21.0",
+        "@lerna/filter-options": "3.20.0",
+        "@lerna/npm-run-script": "3.16.5",
+        "@lerna/output": "3.13.0",
+        "@lerna/profiler": "3.20.0",
+        "@lerna/run-topologically": "3.18.5",
+        "@lerna/timer": "3.13.0",
+        "@lerna/validation-error": "3.13.0",
+        "p-map": "^2.1.0"
       }
     },
-    "babel-plugin-transform-regenerator": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-regenerator/download/babel-plugin-transform-regenerator-6.26.0.tgz",
-      "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+    "@lerna/run-lifecycle": {
+      "version": "3.16.2",
+      "resolved": "https://registry.npm.taobao.org/@lerna/run-lifecycle/download/@lerna/run-lifecycle-3.16.2.tgz",
+      "integrity": "sha1-Z7KI+OqWTbnqT7H7x3FdW7sLzgA=",
       "dev": true,
       "requires": {
-        "regenerator-transform": "0.10.1"
+        "@lerna/npm-conf": "3.16.0",
+        "figgy-pudding": "^3.5.1",
+        "npm-lifecycle": "^3.1.2",
+        "npmlog": "^4.1.2"
       }
     },
-    "babel-plugin-transform-strict-mode": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-strict-mode/download/babel-plugin-transform-strict-mode-6.24.1.tgz",
-      "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+    "@lerna/run-topologically": {
+      "version": "3.18.5",
+      "resolved": "https://registry.npm.taobao.org/@lerna/run-topologically/download/@lerna/run-topologically-3.18.5.tgz",
+      "integrity": "sha1-PNY52iDpZ9dnLLiNsPdWuS8v38M=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
+        "@lerna/query-graph": "3.18.5",
+        "figgy-pudding": "^3.5.1",
+        "p-queue": "^4.0.0"
       }
     },
-    "babel-polyfill": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-polyfill/download/babel-polyfill-6.26.0.tgz",
-      "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
+    "@lerna/symlink-binary": {
+      "version": "3.17.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/symlink-binary/download/@lerna/symlink-binary-3.17.0.tgz",
+      "integrity": "sha1-j4AxswmGOBSIPT8AmHf4Ljiu9Fo=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "core-js": "2.5.1",
-        "regenerator-runtime": "0.10.5"
+        "@lerna/create-symlink": "3.16.2",
+        "@lerna/package": "3.16.0",
+        "fs-extra": "^8.1.0",
+        "p-map": "^2.1.0"
       },
       "dependencies": {
-        "regenerator-runtime": {
-          "version": "0.10.5",
-          "resolved": "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.10.5.tgz",
-          "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
-          "dev": true
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz",
+          "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
         }
       }
     },
-    "babel-preset-es2015": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-preset-es2015/download/babel-preset-es2015-6.24.1.tgz",
-      "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=",
+    "@lerna/symlink-dependencies": {
+      "version": "3.17.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/symlink-dependencies/download/@lerna/symlink-dependencies-3.17.0.tgz",
+      "integrity": "sha1-SNY2DphYZaDlbNi1GzCKUmMIeEo=",
       "dev": true,
       "requires": {
-        "babel-plugin-check-es2015-constants": "6.22.0",
-        "babel-plugin-transform-es2015-arrow-functions": "6.22.0",
-        "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
-        "babel-plugin-transform-es2015-block-scoping": "6.26.0",
-        "babel-plugin-transform-es2015-classes": "6.24.1",
-        "babel-plugin-transform-es2015-computed-properties": "6.24.1",
-        "babel-plugin-transform-es2015-destructuring": "6.23.0",
-        "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
-        "babel-plugin-transform-es2015-for-of": "6.23.0",
-        "babel-plugin-transform-es2015-function-name": "6.24.1",
-        "babel-plugin-transform-es2015-literals": "6.22.0",
-        "babel-plugin-transform-es2015-modules-amd": "6.24.1",
-        "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
-        "babel-plugin-transform-es2015-modules-systemjs": "6.24.1",
-        "babel-plugin-transform-es2015-modules-umd": "6.24.1",
-        "babel-plugin-transform-es2015-object-super": "6.24.1",
-        "babel-plugin-transform-es2015-parameters": "6.24.1",
-        "babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
-        "babel-plugin-transform-es2015-spread": "6.22.0",
-        "babel-plugin-transform-es2015-sticky-regex": "6.24.1",
-        "babel-plugin-transform-es2015-template-literals": "6.22.0",
-        "babel-plugin-transform-es2015-typeof-symbol": "6.23.0",
-        "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
-        "babel-plugin-transform-regenerator": "6.26.0"
+        "@lerna/create-symlink": "3.16.2",
+        "@lerna/resolve-symlink": "3.16.0",
+        "@lerna/symlink-binary": "3.17.0",
+        "fs-extra": "^8.1.0",
+        "p-finally": "^1.0.0",
+        "p-map": "^2.1.0",
+        "p-map-series": "^1.0.0"
+      },
+      "dependencies": {
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz",
+          "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
+        }
       }
     },
-    "babel-preset-stage-1": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-preset-stage-1/download/babel-preset-stage-1-6.24.1.tgz",
+    "@lerna/timer": {
+      "version": "3.13.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/timer/download/@lerna/timer-3.13.0.tgz",
+      "integrity": "sha1-vNCQRVHbFuCDZNbBjl4hYPyHB4E=",
+      "dev": true
+    },
+    "@lerna/validation-error": {
+      "version": "3.13.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/validation-error/download/@lerna/validation-error-3.13.0.tgz",
+      "integrity": "sha1-yGuPB8WrlTn3db2KVJdukm83WcM=",
+      "dev": true,
+      "requires": {
+        "npmlog": "^4.1.2"
+      }
+    },
+    "@lerna/version": {
+      "version": "3.22.1",
+      "resolved": "https://registry.npm.taobao.org/@lerna/version/download/@lerna/version-3.22.1.tgz",
+      "integrity": "sha1-mAWpJHpH7mLWuBvZ+l+3KLJLWeI=",
+      "dev": true,
+      "requires": {
+        "@lerna/check-working-tree": "3.16.5",
+        "@lerna/child-process": "3.16.5",
+        "@lerna/collect-updates": "3.20.0",
+        "@lerna/command": "3.21.0",
+        "@lerna/conventional-commits": "3.22.0",
+        "@lerna/github-client": "3.22.0",
+        "@lerna/gitlab-client": "3.15.0",
+        "@lerna/output": "3.13.0",
+        "@lerna/prerelease-id-from-version": "3.16.0",
+        "@lerna/prompt": "3.18.5",
+        "@lerna/run-lifecycle": "3.16.2",
+        "@lerna/run-topologically": "3.18.5",
+        "@lerna/validation-error": "3.13.0",
+        "chalk": "^2.3.1",
+        "dedent": "^0.7.0",
+        "load-json-file": "^5.3.0",
+        "minimatch": "^3.0.4",
+        "npmlog": "^4.1.2",
+        "p-map": "^2.1.0",
+        "p-pipe": "^1.2.0",
+        "p-reduce": "^1.0.0",
+        "p-waterfall": "^1.0.0",
+        "semver": "^6.2.0",
+        "slash": "^2.0.0",
+        "temp-write": "^3.4.0",
+        "write-json-file": "^3.2.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz",
+          "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1591687070184&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz",
+          "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/slash/download/slash-2.0.0.tgz",
+          "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz",
+          "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "@lerna/write-log-file": {
+      "version": "3.13.0",
+      "resolved": "https://registry.npm.taobao.org/@lerna/write-log-file/download/@lerna/write-log-file-3.13.0.tgz",
+      "integrity": "sha1-t42eTPwTSai+ZNkTJMTIGZ6CKiY=",
+      "dev": true,
+      "requires": {
+        "npmlog": "^4.1.2",
+        "write-file-atomic": "^2.3.0"
+      }
+    },
+    "@mrmlnc/readdir-enhanced": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npm.taobao.org/@mrmlnc/readdir-enhanced/download/@mrmlnc/readdir-enhanced-2.2.1.tgz",
+      "integrity": "sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4=",
+      "dev": true,
+      "requires": {
+        "call-me-maybe": "^1.0.1",
+        "glob-to-regexp": "^0.3.0"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npm.taobao.org/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz",
+      "integrity": "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=",
+      "dev": true
+    },
+    "@octokit/auth-token": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npm.taobao.org/@octokit/auth-token/download/@octokit/auth-token-2.4.2.tgz",
+      "integrity": "sha1-ENCul5sQD6a3L6Do5j4n5tDb/4o=",
+      "dev": true,
+      "requires": {
+        "@octokit/types": "^5.0.0"
+      }
+    },
+    "@octokit/endpoint": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npm.taobao.org/@octokit/endpoint/download/@octokit/endpoint-6.0.3.tgz",
+      "integrity": "sha1-3Qm1mWYtfhtmN0oXerYg2M33NIc=",
+      "dev": true,
+      "requires": {
+        "@octokit/types": "^5.0.0",
+        "is-plain-object": "^3.0.0",
+        "universal-user-agent": "^5.0.0"
+      },
+      "dependencies": {
+        "is-plain-object": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-3.0.0.tgz",
+          "integrity": "sha1-R7/F2htdUNZBEIBsGZNZSC51qSg=",
+          "dev": true,
+          "requires": {
+            "isobject": "^4.0.0"
+          }
+        },
+        "isobject": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-4.0.0.tgz",
+          "integrity": "sha1-PxyRVec7GSAiqAgZus0DQ3EWl7A=",
+          "dev": true
+        },
+        "universal-user-agent": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npm.taobao.org/universal-user-agent/download/universal-user-agent-5.0.0.tgz",
+          "integrity": "sha1-oxgqp1gGm/DnmVJXDKdX3jV5wdk=",
+          "dev": true,
+          "requires": {
+            "os-name": "^3.1.0"
+          }
+        }
+      }
+    },
+    "@octokit/plugin-enterprise-rest": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npm.taobao.org/@octokit/plugin-enterprise-rest/download/@octokit/plugin-enterprise-rest-6.0.1.tgz?cache=0&sync_timestamp=1579041100867&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40octokit%2Fplugin-enterprise-rest%2Fdownload%2F%40octokit%2Fplugin-enterprise-rest-6.0.1.tgz",
+      "integrity": "sha1-4HiWc5YY2rjafUB3xlgAN3X5VDc=",
+      "dev": true
+    },
+    "@octokit/plugin-paginate-rest": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npm.taobao.org/@octokit/plugin-paginate-rest/download/@octokit/plugin-paginate-rest-1.1.2.tgz",
+      "integrity": "sha1-AEFwrPjCvlNauiZyeGfWkve0iPw=",
+      "dev": true,
+      "requires": {
+        "@octokit/types": "^2.0.1"
+      },
+      "dependencies": {
+        "@octokit/types": {
+          "version": "2.16.2",
+          "resolved": "https://registry.npm.taobao.org/@octokit/types/download/@octokit/types-2.16.2.tgz",
+          "integrity": "sha1-TF+No8b+zz2hgRrvZ4/aA+2sNdI=",
+          "dev": true,
+          "requires": {
+            "@types/node": ">= 8"
+          }
+        }
+      }
+    },
+    "@octokit/plugin-request-log": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/@octokit/plugin-request-log/download/@octokit/plugin-request-log-1.0.0.tgz",
+      "integrity": "sha1-7vh6QxMA9hSMOaf3X4z+shiyVH4=",
+      "dev": true
+    },
+    "@octokit/plugin-rest-endpoint-methods": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npm.taobao.org/@octokit/plugin-rest-endpoint-methods/download/@octokit/plugin-rest-endpoint-methods-2.4.0.tgz?cache=0&sync_timestamp=1591816505300&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40octokit%2Fplugin-rest-endpoint-methods%2Fdownload%2F%40octokit%2Fplugin-rest-endpoint-methods-2.4.0.tgz",
+      "integrity": "sha1-Mojs9UgfaMSU3QYC/BVAeln69h4=",
+      "dev": true,
+      "requires": {
+        "@octokit/types": "^2.0.1",
+        "deprecation": "^2.3.1"
+      },
+      "dependencies": {
+        "@octokit/types": {
+          "version": "2.16.2",
+          "resolved": "https://registry.npm.taobao.org/@octokit/types/download/@octokit/types-2.16.2.tgz",
+          "integrity": "sha1-TF+No8b+zz2hgRrvZ4/aA+2sNdI=",
+          "dev": true,
+          "requires": {
+            "@types/node": ">= 8"
+          }
+        }
+      }
+    },
+    "@octokit/request": {
+      "version": "5.4.5",
+      "resolved": "https://registry.npm.taobao.org/@octokit/request/download/@octokit/request-5.4.5.tgz",
+      "integrity": "sha1-jfZb2BIEdSH36dtv8RjAa6hKwQs=",
+      "dev": true,
+      "requires": {
+        "@octokit/endpoint": "^6.0.1",
+        "@octokit/request-error": "^2.0.0",
+        "@octokit/types": "^5.0.0",
+        "deprecation": "^2.0.0",
+        "is-plain-object": "^3.0.0",
+        "node-fetch": "^2.3.0",
+        "once": "^1.4.0",
+        "universal-user-agent": "^5.0.0"
+      },
+      "dependencies": {
+        "@octokit/request-error": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npm.taobao.org/@octokit/request-error/download/@octokit/request-error-2.0.2.tgz",
+          "integrity": "sha1-Dna4P12P3aHbmQJ+pfYXwua6ntA=",
+          "dev": true,
+          "requires": {
+            "@octokit/types": "^5.0.1",
+            "deprecation": "^2.0.0",
+            "once": "^1.4.0"
+          }
+        },
+        "is-plain-object": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-3.0.0.tgz",
+          "integrity": "sha1-R7/F2htdUNZBEIBsGZNZSC51qSg=",
+          "dev": true,
+          "requires": {
+            "isobject": "^4.0.0"
+          }
+        },
+        "isobject": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-4.0.0.tgz",
+          "integrity": "sha1-PxyRVec7GSAiqAgZus0DQ3EWl7A=",
+          "dev": true
+        },
+        "universal-user-agent": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npm.taobao.org/universal-user-agent/download/universal-user-agent-5.0.0.tgz",
+          "integrity": "sha1-oxgqp1gGm/DnmVJXDKdX3jV5wdk=",
+          "dev": true,
+          "requires": {
+            "os-name": "^3.1.0"
+          }
+        }
+      }
+    },
+    "@octokit/request-error": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npm.taobao.org/@octokit/request-error/download/@octokit/request-error-1.2.1.tgz",
+      "integrity": "sha1-7eBxTHc/MjR1dsJWSdwBOuazGAE=",
+      "dev": true,
+      "requires": {
+        "@octokit/types": "^2.0.0",
+        "deprecation": "^2.0.0",
+        "once": "^1.4.0"
+      },
+      "dependencies": {
+        "@octokit/types": {
+          "version": "2.16.2",
+          "resolved": "https://registry.npm.taobao.org/@octokit/types/download/@octokit/types-2.16.2.tgz",
+          "integrity": "sha1-TF+No8b+zz2hgRrvZ4/aA+2sNdI=",
+          "dev": true,
+          "requires": {
+            "@types/node": ">= 8"
+          }
+        }
+      }
+    },
+    "@octokit/rest": {
+      "version": "16.43.1",
+      "resolved": "https://registry.npm.taobao.org/@octokit/rest/download/@octokit/rest-16.43.1.tgz",
+      "integrity": "sha1-OxHn0bGsK77rI7CKF98LIJR+2ms=",
+      "dev": true,
+      "requires": {
+        "@octokit/auth-token": "^2.4.0",
+        "@octokit/plugin-paginate-rest": "^1.1.1",
+        "@octokit/plugin-request-log": "^1.0.0",
+        "@octokit/plugin-rest-endpoint-methods": "2.4.0",
+        "@octokit/request": "^5.2.0",
+        "@octokit/request-error": "^1.0.2",
+        "atob-lite": "^2.0.0",
+        "before-after-hook": "^2.0.0",
+        "btoa-lite": "^1.0.0",
+        "deprecation": "^2.0.0",
+        "lodash.get": "^4.4.2",
+        "lodash.set": "^4.3.2",
+        "lodash.uniq": "^4.5.0",
+        "octokit-pagination-methods": "^1.1.0",
+        "once": "^1.4.0",
+        "universal-user-agent": "^4.0.0"
+      }
+    },
+    "@octokit/types": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npm.taobao.org/@octokit/types/download/@octokit/types-5.0.1.tgz",
+      "integrity": "sha1-VFnppenfhWXcxiwXo0SRkE1xlx4=",
+      "dev": true,
+      "requires": {
+        "@types/node": ">= 8"
+      }
+    },
+    "@types/color-name": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+      "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
+      "dev": true
+    },
+    "@types/glob": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npm.taobao.org/@types/glob/download/@types/glob-7.1.2.tgz?cache=0&sync_timestamp=1591314307851&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fglob%2Fdownload%2F%40types%2Fglob-7.1.2.tgz",
+      "integrity": "sha1-BsomUhNTpUXZSgrcdPOKWdIyyYc=",
+      "dev": true,
+      "requires": {
+        "@types/minimatch": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/minimatch": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npm.taobao.org/@types/minimatch/download/@types/minimatch-3.0.3.tgz",
+      "integrity": "sha1-PcoOPzOyAPx9ETnAzZbBJoyt/Z0=",
+      "dev": true
+    },
+    "@types/minimist": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/@types/minimist/download/@types/minimist-1.2.0.tgz",
+      "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=",
+      "dev": true
+    },
+    "@types/node": {
+      "version": "14.0.13",
+      "resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-14.0.13.tgz?cache=0&sync_timestamp=1591734888739&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-14.0.13.tgz",
+      "integrity": "sha1-7hEo6IG4dMNxN0wfciAYk2FkF8k=",
+      "dev": true
+    },
+    "@types/normalize-package-data": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+      "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
+      "dev": true
+    },
+    "@zkochan/cmd-shim": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npm.taobao.org/@zkochan/cmd-shim/download/@zkochan/cmd-shim-3.1.0.tgz",
+      "integrity": "sha1-KrjtgfW7VFKoXyV1jrm4aBmC/S4=",
+      "dev": true,
+      "requires": {
+        "is-windows": "^1.0.0",
+        "mkdirp-promise": "^5.0.1",
+        "mz": "^2.5.0"
+      }
+    },
+    "JSONStream": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npm.taobao.org/JSONStream/download/JSONStream-1.3.5.tgz",
+      "integrity": "sha1-MgjB8I06TZkmGrZPkjArwV4RHKA=",
+      "dev": true,
+      "requires": {
+        "jsonparse": "^1.2.0",
+        "through": ">=2.2.7 <3"
+      }
+    },
+    "JSV": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz",
+      "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c=",
+      "dev": true
+    },
+    "abbrev": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
+      "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=",
+      "dev": true
+    },
+    "accepts": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+      "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+      "dev": true,
+      "requires": {
+        "mime-types": "~2.1.24",
+        "negotiator": "0.6.2"
+      }
+    },
+    "acorn": {
+      "version": "7.3.1",
+      "resolved": "http://r.tnpm.oa.com/acorn/download/acorn-7.3.1.tgz",
+      "integrity": "sha1-hQEHVNtTw/uvO56j4IOqXF0Uf/0=",
+      "dev": true
+    },
+    "acorn-dynamic-import": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz",
+      "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==",
+      "dev": true
+    },
+    "acorn-jsx": {
+      "version": "5.2.0",
+      "resolved": "http://r.tnpm.oa.com/acorn-jsx/download/acorn-jsx-5.2.0.tgz",
+      "integrity": "sha1-TGYGkXPW/daO2FI5/CViJhgrLr4=",
+      "dev": true
+    },
+    "agent-base": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npm.taobao.org/agent-base/download/agent-base-4.3.0.tgz",
+      "integrity": "sha1-gWXwHENgCbzK0LHRIvBe13Dvxu4=",
+      "dev": true,
+      "requires": {
+        "es6-promisify": "^5.0.0"
+      }
+    },
+    "agentkeepalive": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npm.taobao.org/agentkeepalive/download/agentkeepalive-3.5.2.tgz?cache=0&sync_timestamp=1592194047498&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fagentkeepalive%2Fdownload%2Fagentkeepalive-3.5.2.tgz",
+      "integrity": "sha1-oROSTdP6JKC8O3gQjEUMKr7gD2c=",
+      "dev": true,
+      "requires": {
+        "humanize-ms": "^1.2.1"
+      }
+    },
+    "aggregate-error": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz",
+      "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==",
+      "dev": true,
+      "requires": {
+        "clean-stack": "^2.0.0",
+        "indent-string": "^4.0.0"
+      },
+      "dependencies": {
+        "indent-string": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+          "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+          "dev": true
+        }
+      }
+    },
+    "ajv": {
+      "version": "6.12.3",
+      "resolved": "http://r.tnpm.oa.com/ajv/download/ajv-6.12.3.tgz",
+      "integrity": "sha1-GMWvOKER3etPJpe9eNaKvByr1wY=",
+      "dev": true,
+      "requires": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "amdefine": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+      "dev": true,
+      "optional": true
+    },
+    "ansi-colors": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
+      "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==",
+      "dev": true
+    },
+    "ansi-escapes": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+      "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+      "dev": true
+    },
+    "ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+      "dev": true
+    },
+    "ansi-styles": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+      "dev": true
+    },
+    "any-promise": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+      "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=",
+      "dev": true
+    },
+    "anymatch": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-1.3.2.tgz",
+      "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "micromatch": "^2.1.5",
+        "normalize-path": "^2.0.0"
+      }
+    },
+    "append-transform": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz",
+      "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==",
+      "dev": true,
+      "requires": {
+        "default-require-extensions": "^3.0.0"
+      }
+    },
+    "aproba": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz",
+      "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=",
+      "dev": true
+    },
+    "archy": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+      "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
+      "dev": true
+    },
+    "are-we-there-yet": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npm.taobao.org/are-we-there-yet/download/are-we-there-yet-1.1.5.tgz",
+      "integrity": "sha1-SzXClE8GKov82mZBB2A1D+nd/CE=",
+      "dev": true,
+      "requires": {
+        "delegates": "^1.0.0",
+        "readable-stream": "^2.0.6"
+      }
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "requires": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "arr-diff": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/arr-diff/download/arr-diff-2.0.0.tgz",
+      "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "arr-flatten": "^1.0.1"
+      }
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+      "dev": true
+    },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+      "dev": true
+    },
+    "array-find-index": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+      "dev": true
+    },
+    "array-flatten": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+      "dev": true
+    },
+    "array-ify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
+      "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=",
+      "dev": true
+    },
+    "array-union": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+      "dev": true,
+      "requires": {
+        "array-uniq": "^1.0.1"
+      }
+    },
+    "array-uniq": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+      "dev": true
+    },
+    "array-unique": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npm.taobao.org/array-unique/download/array-unique-0.2.1.tgz",
+      "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+      "dev": true,
+      "optional": true
+    },
+    "arrify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+      "dev": true
+    },
+    "asap": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+      "dev": true
+    },
+    "asn1": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": "~2.1.0"
+      }
+    },
+    "assert-plus": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+      "dev": true
+    },
+    "assertion-error": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+      "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+      "dev": true
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+      "dev": true
+    },
+    "astral-regex": {
+      "version": "1.0.0",
+      "resolved": "http://r.tnpm.oa.com/astral-regex/download/astral-regex-1.0.0.tgz",
+      "integrity": "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k=",
+      "dev": true
+    },
+    "async": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+      "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+      "dev": true
+    },
+    "async-each": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/async-each/download/async-each-1.0.3.tgz",
+      "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=",
+      "dev": true,
+      "optional": true
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+      "dev": true
+    },
+    "atob": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+      "dev": true
+    },
+    "atob-lite": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz",
+      "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=",
+      "dev": true
+    },
+    "aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+      "dev": true
+    },
+    "aws4": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
+      "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==",
+      "dev": true
+    },
+    "babel": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel/-/babel-6.23.0.tgz",
+      "integrity": "sha1-0NHn2APpdHZb7qMjLU4VPA77kPQ=",
+      "dev": true
+    },
+    "babel-cli": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz",
+      "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=",
+      "dev": true,
+      "requires": {
+        "babel-core": "^6.26.0",
+        "babel-polyfill": "^6.26.0",
+        "babel-register": "^6.26.0",
+        "babel-runtime": "^6.26.0",
+        "chokidar": "^1.6.1",
+        "commander": "^2.11.0",
+        "convert-source-map": "^1.5.0",
+        "fs-readdir-recursive": "^1.0.0",
+        "glob": "^7.1.2",
+        "lodash": "^4.17.4",
+        "output-file-sync": "^1.1.2",
+        "path-is-absolute": "^1.0.1",
+        "slash": "^1.0.0",
+        "source-map": "^0.5.6",
+        "v8flags": "^2.1.1"
+      },
+      "dependencies": {
+        "chokidar": {
+          "version": "1.7.0",
+          "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-1.7.0.tgz?cache=0&sync_timestamp=1587911196018&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-1.7.0.tgz",
+          "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "anymatch": "^1.3.0",
+            "async-each": "^1.0.0",
+            "fsevents": "^1.0.0",
+            "glob-parent": "^2.0.0",
+            "inherits": "^2.0.1",
+            "is-binary-path": "^1.0.0",
+            "is-glob": "^2.0.0",
+            "path-is-absolute": "^1.0.0",
+            "readdirp": "^2.0.0"
+          }
+        }
+      }
+    },
+    "babel-code-frame": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.1.3",
+        "esutils": "^2.0.2",
+        "js-tokens": "^3.0.2"
+      }
+    },
+    "babel-core": {
+      "version": "6.26.3",
+      "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
+      "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "^6.26.0",
+        "babel-generator": "^6.26.0",
+        "babel-helpers": "^6.24.1",
+        "babel-messages": "^6.23.0",
+        "babel-register": "^6.26.0",
+        "babel-runtime": "^6.26.0",
+        "babel-template": "^6.26.0",
+        "babel-traverse": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "babylon": "^6.18.0",
+        "convert-source-map": "^1.5.1",
+        "debug": "^2.6.9",
+        "json5": "^0.5.1",
+        "lodash": "^4.17.4",
+        "minimatch": "^3.0.4",
+        "path-is-absolute": "^1.0.1",
+        "private": "^0.1.8",
+        "slash": "^1.0.0",
+        "source-map": "^0.5.7"
+      }
+    },
+    "babel-eslint": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz",
+      "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "^6.22.0",
+        "babel-traverse": "^6.23.1",
+        "babel-types": "^6.23.0",
+        "babylon": "^6.17.0"
+      }
+    },
+    "babel-generator": {
+      "version": "6.26.1",
+      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+      "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+      "dev": true,
+      "requires": {
+        "babel-messages": "^6.23.0",
+        "babel-runtime": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "detect-indent": "^4.0.0",
+        "jsesc": "^1.3.0",
+        "lodash": "^4.17.4",
+        "source-map": "^0.5.7",
+        "trim-right": "^1.0.1"
+      }
+    },
+    "babel-helper-bindify-decorators": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz",
+      "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-traverse": "^6.24.1",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-helper-builder-binary-assignment-operator-visitor": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
+      "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+      "dev": true,
+      "requires": {
+        "babel-helper-explode-assignable-expression": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-helper-call-delegate": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+      "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+      "dev": true,
+      "requires": {
+        "babel-helper-hoist-variables": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-traverse": "^6.24.1",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-helper-define-map": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+      "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "^6.24.1",
+        "babel-runtime": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "lodash": "^4.17.4"
+      }
+    },
+    "babel-helper-explode-assignable-expression": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
+      "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-traverse": "^6.24.1",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-helper-explode-class": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz",
+      "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=",
+      "dev": true,
+      "requires": {
+        "babel-helper-bindify-decorators": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-traverse": "^6.24.1",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-helper-function-name": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+      "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+      "dev": true,
+      "requires": {
+        "babel-helper-get-function-arity": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1",
+        "babel-traverse": "^6.24.1",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-helper-get-function-arity": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+      "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-helper-hoist-variables": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+      "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-helper-optimise-call-expression": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+      "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-helper-regex": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+      "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "lodash": "^4.17.4"
+      }
+    },
+    "babel-helper-remap-async-to-generator": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
+      "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1",
+        "babel-traverse": "^6.24.1",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-helper-replace-supers": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+      "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+      "dev": true,
+      "requires": {
+        "babel-helper-optimise-call-expression": "^6.24.1",
+        "babel-messages": "^6.23.0",
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1",
+        "babel-traverse": "^6.24.1",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-helpers": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+      "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1"
+      }
+    },
+    "babel-messages": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-plugin-check-es2015-constants": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+      "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-plugin-syntax-async-functions": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+      "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
+      "dev": true
+    },
+    "babel-plugin-syntax-async-generators": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
+      "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=",
+      "dev": true
+    },
+    "babel-plugin-syntax-class-constructor-call": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz",
+      "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=",
+      "dev": true
+    },
+    "babel-plugin-syntax-class-properties": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz",
+      "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=",
+      "dev": true
+    },
+    "babel-plugin-syntax-decorators": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz",
+      "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=",
+      "dev": true
+    },
+    "babel-plugin-syntax-dynamic-import": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
+      "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=",
+      "dev": true
+    },
+    "babel-plugin-syntax-exponentiation-operator": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+      "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
+      "dev": true
+    },
+    "babel-plugin-syntax-export-extensions": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz",
+      "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=",
+      "dev": true
+    },
+    "babel-plugin-syntax-object-rest-spread": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
+      "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
+      "dev": true
+    },
+    "babel-plugin-syntax-trailing-function-commas": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
+      "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
+      "dev": true
+    },
+    "babel-plugin-transform-async-generator-functions": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
+      "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
+      "dev": true,
+      "requires": {
+        "babel-helper-remap-async-to-generator": "^6.24.1",
+        "babel-plugin-syntax-async-generators": "^6.5.0",
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-plugin-transform-async-to-generator": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
+      "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
+      "dev": true,
+      "requires": {
+        "babel-helper-remap-async-to-generator": "^6.24.1",
+        "babel-plugin-syntax-async-functions": "^6.8.0",
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-plugin-transform-class-constructor-call": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz",
+      "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-class-constructor-call": "^6.18.0",
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1"
+      }
+    },
+    "babel-plugin-transform-class-properties": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz",
+      "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "^6.24.1",
+        "babel-plugin-syntax-class-properties": "^6.8.0",
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1"
+      }
+    },
+    "babel-plugin-transform-decorators": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz",
+      "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=",
+      "dev": true,
+      "requires": {
+        "babel-helper-explode-class": "^6.24.1",
+        "babel-plugin-syntax-decorators": "^6.13.0",
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-plugin-transform-es2015-arrow-functions": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+      "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-plugin-transform-es2015-block-scoped-functions": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+      "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-plugin-transform-es2015-block-scoping": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+      "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "babel-template": "^6.26.0",
+        "babel-traverse": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "lodash": "^4.17.4"
+      }
+    },
+    "babel-plugin-transform-es2015-classes": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+      "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+      "dev": true,
+      "requires": {
+        "babel-helper-define-map": "^6.24.1",
+        "babel-helper-function-name": "^6.24.1",
+        "babel-helper-optimise-call-expression": "^6.24.1",
+        "babel-helper-replace-supers": "^6.24.1",
+        "babel-messages": "^6.23.0",
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1",
+        "babel-traverse": "^6.24.1",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-plugin-transform-es2015-computed-properties": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+      "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1"
+      }
+    },
+    "babel-plugin-transform-es2015-destructuring": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+      "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-plugin-transform-es2015-duplicate-keys": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+      "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-plugin-transform-es2015-for-of": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+      "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-plugin-transform-es2015-function-name": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+      "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-plugin-transform-es2015-literals": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+      "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-amd": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+      "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-commonjs": {
+      "version": "6.26.2",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
+      "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-strict-mode": "^6.24.1",
+        "babel-runtime": "^6.26.0",
+        "babel-template": "^6.26.0",
+        "babel-types": "^6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-systemjs": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+      "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+      "dev": true,
+      "requires": {
+        "babel-helper-hoist-variables": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-umd": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+      "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1"
+      }
+    },
+    "babel-plugin-transform-es2015-object-super": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+      "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+      "dev": true,
+      "requires": {
+        "babel-helper-replace-supers": "^6.24.1",
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-plugin-transform-es2015-parameters": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+      "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+      "dev": true,
+      "requires": {
+        "babel-helper-call-delegate": "^6.24.1",
+        "babel-helper-get-function-arity": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1",
+        "babel-traverse": "^6.24.1",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-plugin-transform-es2015-shorthand-properties": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+      "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-plugin-transform-es2015-spread": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+      "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-plugin-transform-es2015-sticky-regex": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+      "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+      "dev": true,
+      "requires": {
+        "babel-helper-regex": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-plugin-transform-es2015-template-literals": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+      "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-plugin-transform-es2015-typeof-symbol": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+      "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-plugin-transform-es2015-unicode-regex": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+      "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+      "dev": true,
+      "requires": {
+        "babel-helper-regex": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "regexpu-core": "^2.0.0"
+      }
+    },
+    "babel-plugin-transform-exponentiation-operator": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
+      "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+      "dev": true,
+      "requires": {
+        "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
+        "babel-plugin-syntax-exponentiation-operator": "^6.8.0",
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-plugin-transform-export-extensions": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz",
+      "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-export-extensions": "^6.8.0",
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-plugin-transform-object-rest-spread": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
+      "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-object-rest-spread": "^6.8.0",
+        "babel-runtime": "^6.26.0"
+      }
+    },
+    "babel-plugin-transform-regenerator": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+      "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+      "dev": true,
+      "requires": {
+        "regenerator-transform": "^0.10.0"
+      }
+    },
+    "babel-plugin-transform-strict-mode": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+      "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-polyfill": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
+      "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "core-js": "^2.5.0",
+        "regenerator-runtime": "^0.10.5"
+      },
+      "dependencies": {
+        "regenerator-runtime": {
+          "version": "0.10.5",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+          "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
+          "dev": true
+        }
+      }
+    },
+    "babel-preset-es2015": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz",
+      "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-check-es2015-constants": "^6.22.0",
+        "babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
+        "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
+        "babel-plugin-transform-es2015-block-scoping": "^6.24.1",
+        "babel-plugin-transform-es2015-classes": "^6.24.1",
+        "babel-plugin-transform-es2015-computed-properties": "^6.24.1",
+        "babel-plugin-transform-es2015-destructuring": "^6.22.0",
+        "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1",
+        "babel-plugin-transform-es2015-for-of": "^6.22.0",
+        "babel-plugin-transform-es2015-function-name": "^6.24.1",
+        "babel-plugin-transform-es2015-literals": "^6.22.0",
+        "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+        "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
+        "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1",
+        "babel-plugin-transform-es2015-modules-umd": "^6.24.1",
+        "babel-plugin-transform-es2015-object-super": "^6.24.1",
+        "babel-plugin-transform-es2015-parameters": "^6.24.1",
+        "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1",
+        "babel-plugin-transform-es2015-spread": "^6.22.0",
+        "babel-plugin-transform-es2015-sticky-regex": "^6.24.1",
+        "babel-plugin-transform-es2015-template-literals": "^6.22.0",
+        "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0",
+        "babel-plugin-transform-es2015-unicode-regex": "^6.24.1",
+        "babel-plugin-transform-regenerator": "^6.24.1"
+      }
+    },
+    "babel-preset-stage-1": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz",
       "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=",
       "dev": true,
       "requires": {
-        "babel-plugin-transform-class-constructor-call": "6.24.1",
-        "babel-plugin-transform-export-extensions": "6.22.0",
-        "babel-preset-stage-2": "6.24.1"
+        "babel-plugin-transform-class-constructor-call": "^6.24.1",
+        "babel-plugin-transform-export-extensions": "^6.22.0",
+        "babel-preset-stage-2": "^6.24.1"
+      }
+    },
+    "babel-preset-stage-2": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz",
+      "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-dynamic-import": "^6.18.0",
+        "babel-plugin-transform-class-properties": "^6.24.1",
+        "babel-plugin-transform-decorators": "^6.24.1",
+        "babel-preset-stage-3": "^6.24.1"
+      }
+    },
+    "babel-preset-stage-3": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz",
+      "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
+        "babel-plugin-transform-async-generator-functions": "^6.24.1",
+        "babel-plugin-transform-async-to-generator": "^6.24.1",
+        "babel-plugin-transform-exponentiation-operator": "^6.24.1",
+        "babel-plugin-transform-object-rest-spread": "^6.22.0"
+      }
+    },
+    "babel-register": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
+      "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+      "dev": true,
+      "requires": {
+        "babel-core": "^6.26.0",
+        "babel-runtime": "^6.26.0",
+        "core-js": "^2.5.0",
+        "home-or-tmp": "^2.0.0",
+        "lodash": "^4.17.4",
+        "mkdirp": "^0.5.1",
+        "source-map-support": "^0.4.15"
+      }
+    },
+    "babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+      "dev": true,
+      "requires": {
+        "core-js": "^2.4.0",
+        "regenerator-runtime": "^0.11.0"
+      }
+    },
+    "babel-template": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+      "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "babel-traverse": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "babylon": "^6.18.0",
+        "lodash": "^4.17.4"
+      }
+    },
+    "babel-traverse": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "^6.26.0",
+        "babel-messages": "^6.23.0",
+        "babel-runtime": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "babylon": "^6.18.0",
+        "debug": "^2.6.8",
+        "globals": "^9.18.0",
+        "invariant": "^2.2.2",
+        "lodash": "^4.17.4"
+      }
+    },
+    "babel-types": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "esutils": "^2.0.2",
+        "lodash": "^4.17.4",
+        "to-fast-properties": "^1.0.3"
+      }
+    },
+    "babylon": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+      "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+      "dev": true
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+      "dev": true
+    },
+    "base": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+          "dev": true
+        }
+      }
+    },
+    "batch": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+      "dev": true
+    },
+    "bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+      "dev": true,
+      "requires": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
+    "before-after-hook": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/before-after-hook/download/before-after-hook-2.1.0.tgz",
+      "integrity": "sha1-tsA0h/ROJCAN0wyl5qGXnF0vtjU=",
+      "dev": true
+    },
+    "binary-extensions": {
+      "version": "1.13.1",
+      "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz?cache=0&sync_timestamp=1593261419324&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-1.13.1.tgz",
+      "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=",
+      "dev": true,
+      "optional": true
+    },
+    "bindings": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npm.taobao.org/bindings/download/bindings-1.5.0.tgz",
+      "integrity": "sha1-EDU8npRTNLwFEabZCzj7x8nFBN8=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "file-uri-to-path": "1.0.0"
+      }
+    },
+    "bluebird": {
+      "version": "3.7.2",
+      "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz",
+      "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=",
+      "dev": true
+    },
+    "body-parser": {
+      "version": "1.19.0",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+      "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+      "dev": true,
+      "requires": {
+        "bytes": "3.1.0",
+        "content-type": "~1.0.4",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "http-errors": "1.7.2",
+        "iconv-lite": "0.4.24",
+        "on-finished": "~2.3.0",
+        "qs": "6.7.0",
+        "raw-body": "2.4.0",
+        "type-is": "~1.6.17"
+      },
+      "dependencies": {
+        "qs": {
+          "version": "6.7.0",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+          "dev": true
+        }
+      }
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npm.taobao.org/braces/download/braces-1.8.5.tgz",
+      "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "expand-range": "^1.8.1",
+        "preserve": "^0.2.0",
+        "repeat-element": "^1.1.2"
+      }
+    },
+    "browser-stdout": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+      "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+      "dev": true
+    },
+    "btoa-lite": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz",
+      "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=",
+      "dev": true
+    },
+    "buble": {
+      "version": "0.19.8",
+      "resolved": "https://registry.npmjs.org/buble/-/buble-0.19.8.tgz",
+      "integrity": "sha512-IoGZzrUTY5fKXVkgGHw3QeXFMUNBFv+9l8a4QJKG1JhG3nCMHTdEX1DCOg8568E2Q9qvAQIiSokv6Jsgx8p2cA==",
+      "dev": true,
+      "requires": {
+        "acorn": "^6.1.1",
+        "acorn-dynamic-import": "^4.0.0",
+        "acorn-jsx": "^5.0.1",
+        "chalk": "^2.4.2",
+        "magic-string": "^0.25.3",
+        "minimist": "^1.2.0",
+        "os-homedir": "^2.0.0",
+        "regexpu-core": "^4.5.4"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "6.4.1",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
+          "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
+          "dev": true
+        },
+        "acorn-jsx": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
+          "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "jsesc": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+          "dev": true
+        },
+        "os-homedir": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-2.0.0.tgz",
+          "integrity": "sha512-saRNz0DSC5C/I++gFIaJTXoFJMRwiP5zHar5vV3xQ2TkgEw6hDCcU5F272JjUylpiVgBrZNQHnfjkLabTfb92Q==",
+          "dev": true
+        },
+        "regexpu-core": {
+          "version": "4.7.0",
+          "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz",
+          "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==",
+          "dev": true,
+          "requires": {
+            "regenerate": "^1.4.0",
+            "regenerate-unicode-properties": "^8.2.0",
+            "regjsgen": "^0.5.1",
+            "regjsparser": "^0.6.4",
+            "unicode-match-property-ecmascript": "^1.0.4",
+            "unicode-match-property-value-ecmascript": "^1.2.0"
+          }
+        },
+        "regjsgen": {
+          "version": "0.5.1",
+          "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz",
+          "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==",
+          "dev": true
+        },
+        "regjsparser": {
+          "version": "0.6.4",
+          "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
+          "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
+          "dev": true,
+          "requires": {
+            "jsesc": "~0.5.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "buffer-from": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+      "dev": true
+    },
+    "builtins": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
+      "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=",
+      "dev": true
+    },
+    "byline": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz",
+      "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=",
+      "dev": true
+    },
+    "byte-size": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npm.taobao.org/byte-size/download/byte-size-5.0.1.tgz",
+      "integrity": "sha1-S2UQOaXs2Wdn5xo9ftOA5IvtQZE=",
+      "dev": true
+    },
+    "bytes": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+      "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+      "dev": true
+    },
+    "cacache": {
+      "version": "12.0.4",
+      "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-12.0.4.tgz",
+      "integrity": "sha1-ZovL0QWutfHZL+JVcOyVJcj6pAw=",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.5.5",
+        "chownr": "^1.1.1",
+        "figgy-pudding": "^3.5.1",
+        "glob": "^7.1.4",
+        "graceful-fs": "^4.1.15",
+        "infer-owner": "^1.0.3",
+        "lru-cache": "^5.1.1",
+        "mississippi": "^3.0.0",
+        "mkdirp": "^0.5.1",
+        "move-concurrently": "^1.0.1",
+        "promise-inflight": "^1.0.1",
+        "rimraf": "^2.6.3",
+        "ssri": "^6.0.1",
+        "unique-filename": "^1.1.1",
+        "y18n": "^4.0.0"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz",
+          "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz?cache=0&sync_timestamp=1581257110269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz",
+          "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz",
+          "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=",
+          "dev": true
+        }
+      }
+    },
+    "cache-base": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        }
+      }
+    },
+    "cachedir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.1.0.tgz",
+      "integrity": "sha512-xGBpPqoBvn3unBW7oxgb8aJn42K0m9m1/wyjmazah10Fq7bROGG3kRAE6OIyr3U3PIJUqGuebhCEdMk9OKJG0A==",
+      "dev": true
+    },
+    "caching-transform": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz",
+      "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==",
+      "dev": true,
+      "requires": {
+        "hasha": "^5.0.0",
+        "make-dir": "^3.0.0",
+        "package-hash": "^4.0.0",
+        "write-file-atomic": "^3.0.0"
+      },
+      "dependencies": {
+        "make-dir": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz",
+          "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==",
+          "dev": true,
+          "requires": {
+            "semver": "^6.0.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "write-file-atomic": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+          "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+          "dev": true,
+          "requires": {
+            "imurmurhash": "^0.1.4",
+            "is-typedarray": "^1.0.0",
+            "signal-exit": "^3.0.2",
+            "typedarray-to-buffer": "^3.1.5"
+          }
+        }
+      }
+    },
+    "call-me-maybe": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+      "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+      "dev": true
+    },
+    "caller-callsite": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
+      "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
+      "dev": true,
+      "requires": {
+        "callsites": "^2.0.0"
+      },
+      "dependencies": {
+        "callsites": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
+          "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
+          "dev": true
+        }
+      }
+    },
+    "callsites": {
+      "version": "3.1.0",
+      "resolved": "http://r.tnpm.oa.com/callsites/download/callsites-3.1.0.tgz",
+      "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=",
+      "dev": true
+    },
+    "camelcase-keys": {
+      "version": "6.2.2",
+      "resolved": "https://registry.npm.taobao.org/camelcase-keys/download/camelcase-keys-6.2.2.tgz",
+      "integrity": "sha1-XnVda6UaoiPsfT1S8ld4IQ+dw8A=",
+      "dev": true,
+      "requires": {
+        "camelcase": "^5.3.1",
+        "map-obj": "^4.0.0",
+        "quick-lru": "^4.0.1"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz",
+          "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=",
+          "dev": true
+        }
+      }
+    },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+      "dev": true
+    },
+    "chai": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
+      "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
+      "dev": true,
+      "requires": {
+        "assertion-error": "^1.1.0",
+        "check-error": "^1.0.2",
+        "deep-eql": "^3.0.1",
+        "get-func-name": "^2.0.0",
+        "pathval": "^1.1.0",
+        "type-detect": "^4.0.5"
+      }
+    },
+    "chalk": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^2.2.1",
+        "escape-string-regexp": "^1.0.2",
+        "has-ansi": "^2.0.0",
+        "strip-ansi": "^3.0.0",
+        "supports-color": "^2.0.0"
+      }
+    },
+    "chardet": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+      "dev": true
+    },
+    "charm": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz",
+      "integrity": "sha1-BsIe7RobBq62dVPNxT4jJ0usIpY=",
+      "dev": true
+    },
+    "check-error": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+      "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+      "dev": true
+    },
+    "chokidar": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.0.tgz?cache=0&sync_timestamp=1587911196018&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.4.0.tgz",
+      "integrity": "sha1-swYRQjzjdjV8dlubj5BLn7o8C+g=",
+      "dev": true,
+      "requires": {
+        "anymatch": "~3.1.1",
+        "braces": "~3.0.2",
+        "fsevents": "~2.1.2",
+        "glob-parent": "~5.1.0",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.4.0"
+      },
+      "dependencies": {
+        "anymatch": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz",
+          "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=",
+          "dev": true,
+          "requires": {
+            "normalize-path": "^3.0.0",
+            "picomatch": "^2.0.4"
+          }
+        },
+        "binary-extensions": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.1.0.tgz?cache=0&sync_timestamp=1593261419324&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-2.1.0.tgz",
+          "integrity": "sha1-MPpAyef+B9vIlWeM0ocCTeokHdk=",
+          "dev": true
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz",
+          "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz",
+          "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "fsevents": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.1.3.tgz",
+          "integrity": "sha1-+3OHA66NL5/pAMM4Nt3r7ouX8j4=",
+          "dev": true,
+          "optional": true
+        },
+        "glob-parent": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz",
+          "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "is-binary-path": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz",
+          "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=",
+          "dev": true,
+          "requires": {
+            "binary-extensions": "^2.0.0"
+          }
+        },
+        "is-extglob": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz",
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz",
+          "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^2.1.1"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz",
+          "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=",
+          "dev": true
+        },
+        "normalize-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz",
+          "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=",
+          "dev": true
+        },
+        "readdirp": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.4.0.tgz",
+          "integrity": "sha1-n9zN+ekVWAVEkiGsZF6DA6tbmto=",
+          "dev": true,
+          "requires": {
+            "picomatch": "^2.2.1"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz",
+          "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "chownr": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npm.taobao.org/chownr/download/chownr-1.1.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchownr%2Fdownload%2Fchownr-1.1.4.tgz",
+      "integrity": "sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs=",
+      "dev": true
+    },
+    "ci-info": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+      "dev": true
+    },
+    "class-utils": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        }
+      }
+    },
+    "clean-stack": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+      "dev": true
+    },
+    "cli-cursor": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+      "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+      "dev": true,
+      "requires": {
+        "restore-cursor": "^2.0.0"
+      }
+    },
+    "cli-highlight": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npm.taobao.org/cli-highlight/download/cli-highlight-2.1.4.tgz?cache=0&sync_timestamp=1573948719956&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcli-highlight%2Fdownload%2Fcli-highlight-2.1.4.tgz",
+      "integrity": "sha1-CYy2Qs8X9CrcHBFF4H+WDsTXUis=",
+      "dev": true,
+      "requires": {
+        "chalk": "^3.0.0",
+        "highlight.js": "^9.6.0",
+        "mz": "^2.4.0",
+        "parse5": "^5.1.1",
+        "parse5-htmlparser2-tree-adapter": "^5.1.1",
+        "yargs": "^15.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-5.0.0.tgz",
+          "integrity": "sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.2.1.tgz",
+          "integrity": "sha1-kK51xCTQCNJiTFvynq0xd+v881k=",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz",
+          "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-3.0.0.tgz?cache=0&sync_timestamp=1591687070184&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-3.0.0.tgz",
+          "integrity": "sha1-P3PCv1JlkfV0zEksUeJFY0n4ROQ=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "cliui": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-6.0.0.tgz?cache=0&sync_timestamp=1573943292170&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-6.0.0.tgz",
+          "integrity": "sha1-UR1wLAxOQcoVbX0OlgIfI+EyJbE=",
+          "dev": true,
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^6.2.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz",
+          "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz",
+          "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
+          "dev": true
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-8.0.0.tgz",
+          "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=",
+          "dev": true
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz",
+          "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "get-caller-file": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz",
+          "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz",
+          "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=",
+          "dev": true
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz",
+          "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz",
+          "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz",
+          "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=",
+          "dev": true
+        },
+        "require-main-filename": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz",
+          "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-4.2.0.tgz",
+          "integrity": "sha1-lSGCxGzHssMT0VluYjmSvRY7crU=",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-6.0.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-6.0.0.tgz",
+          "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.1.0.tgz",
+          "integrity": "sha1-aOMlkd9z4lrRxLSRCKLsUHliv9E=",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "which-module": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz",
+          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+          "dev": true
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha1-6Tk7oHEC5skaOyIUePAlfNKFblM=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "yargs": {
+          "version": "15.3.1",
+          "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-15.3.1.tgz",
+          "integrity": "sha1-lQW0cnY5Y+VK/mAUitJ6MwgY6Ys=",
+          "dev": true,
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.1"
+          }
+        },
+        "yargs-parser": {
+          "version": "18.1.3",
+          "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-18.1.3.tgz?cache=0&sync_timestamp=1590107599564&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-18.1.3.tgz",
+          "integrity": "sha1-vmjEl1xrKr9GkjawyHA2L6sJp7A=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
+      }
+    },
+    "cli-width": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+      "dev": true
+    },
+    "clone": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+      "dev": true
+    },
+    "clone-deep": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npm.taobao.org/clone-deep/download/clone-deep-4.0.1.tgz",
+      "integrity": "sha1-wZ/Zvbv4WUK0/ZechNz31fB8I4c=",
+      "dev": true,
+      "requires": {
+        "is-plain-object": "^2.0.4",
+        "kind-of": "^6.0.2",
+        "shallow-clone": "^3.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz",
+          "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=",
+          "dev": true
+        }
+      }
+    },
+    "code-point-at": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+      "dev": true
+    },
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "dev": true,
+      "requires": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      }
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dev": true,
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+      "dev": true
+    },
+    "colors": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
+      "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=",
+      "dev": true
+    },
+    "columnify": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz",
+      "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=",
+      "dev": true,
+      "requires": {
+        "strip-ansi": "^3.0.0",
+        "wcwidth": "^1.0.0"
+      }
+    },
+    "combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dev": true,
+      "requires": {
+        "delayed-stream": "~1.0.0"
+      }
+    },
+    "commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+      "dev": true
+    },
+    "commitizen": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-3.1.2.tgz",
+      "integrity": "sha512-eD0uTUsogu8ksFjFFYq75LLfXeLXsCIa27TPfOqvBI+tCx1Pp5QfKqC9oC+qTpSz3nTn9/+7TL5mE/wurB22JQ==",
+      "dev": true,
+      "requires": {
+        "cachedir": "2.1.0",
+        "cz-conventional-changelog": "2.1.0",
+        "dedent": "0.7.0",
+        "detect-indent": "^5.0.0",
+        "find-node-modules": "2.0.0",
+        "find-root": "1.1.0",
+        "fs-extra": "^7.0.0",
+        "glob": "7.1.3",
+        "inquirer": "6.2.0",
+        "is-utf8": "^0.2.1",
+        "lodash": "4.17.14",
+        "minimist": "1.2.0",
+        "shelljs": "0.7.6",
+        "strip-bom": "3.0.0",
+        "strip-json-comments": "2.0.1"
+      },
+      "dependencies": {
+        "detect-indent": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz",
+          "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=",
+          "dev": true
+        },
+        "fs-extra": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+          "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
+        },
+        "glob": {
+          "version": "7.1.3",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+          "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+          "dev": true,
+          "requires": {
+            "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"
+          }
+        },
+        "lodash": {
+          "version": "4.17.14",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz",
+          "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==",
+          "dev": true
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+      "dev": true
+    },
+    "compare-func": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npm.taobao.org/compare-func/download/compare-func-1.3.4.tgz",
+      "integrity": "sha1-awfExeg0ERm69EV4CFvaD0qCNRY=",
+      "dev": true,
+      "requires": {
+        "array-ify": "^1.0.0",
+        "dot-prop": "^3.0.0"
+      },
+      "dependencies": {
+        "dot-prop": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz",
+          "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=",
+          "dev": true,
+          "requires": {
+            "is-obj": "^1.0.0"
+          }
+        }
+      }
+    },
+    "component-emitter": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+      "dev": true
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "dev": true
+    },
+    "concat-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+      "dev": true,
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.2.2",
+        "typedarray": "^0.0.6"
+      }
+    },
+    "config-chain": {
+      "version": "1.1.12",
+      "resolved": "https://registry.npm.taobao.org/config-chain/download/config-chain-1.1.12.tgz",
+      "integrity": "sha1-D96NCRIA616AjK8l/mGMAvSOTvo=",
+      "dev": true,
+      "requires": {
+        "ini": "^1.3.4",
+        "proto-list": "~1.2.1"
+      }
+    },
+    "console-control-strings": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+      "dev": true
+    },
+    "content-disposition": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "content-type": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+      "dev": true
+    },
+    "conventional-changelog-angular": {
+      "version": "5.0.10",
+      "resolved": "https://registry.npm.taobao.org/conventional-changelog-angular/download/conventional-changelog-angular-5.0.10.tgz",
+      "integrity": "sha1-XPewDdMVtqalWCI8gNXvJN2zQgU=",
+      "dev": true,
+      "requires": {
+        "compare-func": "^1.3.1",
+        "q": "^1.5.1"
+      }
+    },
+    "conventional-changelog-core": {
+      "version": "3.2.3",
+      "resolved": "https://registry.npm.taobao.org/conventional-changelog-core/download/conventional-changelog-core-3.2.3.tgz",
+      "integrity": "sha1-sxQQhW9DHIRwhqfctNLKGEp9iPs=",
+      "dev": true,
+      "requires": {
+        "conventional-changelog-writer": "^4.0.6",
+        "conventional-commits-parser": "^3.0.3",
+        "dateformat": "^3.0.0",
+        "get-pkg-repo": "^1.0.0",
+        "git-raw-commits": "2.0.0",
+        "git-remote-origin-url": "^2.0.0",
+        "git-semver-tags": "^2.0.3",
+        "lodash": "^4.2.1",
+        "normalize-package-data": "^2.3.5",
+        "q": "^1.5.1",
+        "read-pkg": "^3.0.0",
+        "read-pkg-up": "^3.0.0",
+        "through2": "^3.0.0"
+      },
+      "dependencies": {
+        "dateformat": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npm.taobao.org/dateformat/download/dateformat-3.0.3.tgz",
+          "integrity": "sha1-puN0maTZqc+F71hyBE1ikByYia4=",
+          "dev": true
+        },
+        "load-json-file": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+          "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "parse-json": "^4.0.0",
+            "pify": "^3.0.0",
+            "strip-bom": "^3.0.0"
+          }
+        },
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        },
+        "read-pkg": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+          "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "^4.0.0",
+            "normalize-package-data": "^2.3.2",
+            "path-type": "^3.0.0"
+          }
+        },
+        "through2": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npm.taobao.org/through2/download/through2-3.0.1.tgz",
+          "integrity": "sha1-OSducTwzAu3544jdnIEt07glvVo=",
+          "dev": true,
+          "requires": {
+            "readable-stream": "2 || 3"
+          }
+        }
+      }
+    },
+    "conventional-changelog-preset-loader": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npm.taobao.org/conventional-changelog-preset-loader/download/conventional-changelog-preset-loader-2.3.4.tgz",
+      "integrity": "sha1-FKhVq7/9WQJ/1gJYHx802YYupEw=",
+      "dev": true
+    },
+    "conventional-changelog-writer": {
+      "version": "4.0.16",
+      "resolved": "https://registry.npm.taobao.org/conventional-changelog-writer/download/conventional-changelog-writer-4.0.16.tgz",
+      "integrity": "sha1-yhDyaRqOptPC63S9Nbz0CqBS3aU=",
+      "dev": true,
+      "requires": {
+        "compare-func": "^1.3.1",
+        "conventional-commits-filter": "^2.0.6",
+        "dateformat": "^3.0.0",
+        "handlebars": "^4.7.6",
+        "json-stringify-safe": "^5.0.1",
+        "lodash": "^4.17.15",
+        "meow": "^7.0.0",
+        "semver": "^6.0.0",
+        "split": "^1.0.0",
+        "through2": "^3.0.0"
+      },
+      "dependencies": {
+        "dateformat": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npm.taobao.org/dateformat/download/dateformat-3.0.3.tgz",
+          "integrity": "sha1-puN0maTZqc+F71hyBE1ikByYia4=",
+          "dev": true
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        },
+        "split": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npm.taobao.org/split/download/split-1.0.1.tgz",
+          "integrity": "sha1-YFvZvjA6pZ+zX5Ip++oN3snqB9k=",
+          "dev": true,
+          "requires": {
+            "through": "2"
+          }
+        },
+        "through2": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npm.taobao.org/through2/download/through2-3.0.1.tgz",
+          "integrity": "sha1-OSducTwzAu3544jdnIEt07glvVo=",
+          "dev": true,
+          "requires": {
+            "readable-stream": "2 || 3"
+          }
+        }
+      }
+    },
+    "conventional-commit-types": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-2.3.0.tgz",
+      "integrity": "sha512-6iB39PrcGYdz0n3z31kj6/Km6mK9hm9oMRhwcLnKxE7WNoeRKZbTAobliKrbYZ5jqyCvtcVEfjCiaEzhL3AVmQ==",
+      "dev": true
+    },
+    "conventional-commits-filter": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npm.taobao.org/conventional-commits-filter/download/conventional-commits-filter-2.0.6.tgz",
+      "integrity": "sha1-CTXhJAxcp2mDKa/+4bakbTMyTEw=",
+      "dev": true,
+      "requires": {
+        "lodash.ismatch": "^4.4.0",
+        "modify-values": "^1.0.0"
+      }
+    },
+    "conventional-commits-parser": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npm.taobao.org/conventional-commits-parser/download/conventional-commits-parser-3.1.0.tgz",
+      "integrity": "sha1-EBQGc9Xn71VyYzeRRWxdA7aei+Q=",
+      "dev": true,
+      "requires": {
+        "JSONStream": "^1.0.4",
+        "is-text-path": "^1.0.1",
+        "lodash": "^4.17.15",
+        "meow": "^7.0.0",
+        "split2": "^2.0.0",
+        "through2": "^3.0.0",
+        "trim-off-newlines": "^1.0.0"
+      },
+      "dependencies": {
+        "through2": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npm.taobao.org/through2/download/through2-3.0.1.tgz",
+          "integrity": "sha1-OSducTwzAu3544jdnIEt07glvVo=",
+          "dev": true,
+          "requires": {
+            "readable-stream": "2 || 3"
+          }
+        }
+      }
+    },
+    "conventional-recommended-bump": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npm.taobao.org/conventional-recommended-bump/download/conventional-recommended-bump-5.0.1.tgz",
+      "integrity": "sha1-WvY5A5R7bgied3Z2ActZLKuxBro=",
+      "dev": true,
+      "requires": {
+        "concat-stream": "^2.0.0",
+        "conventional-changelog-preset-loader": "^2.1.1",
+        "conventional-commits-filter": "^2.0.2",
+        "conventional-commits-parser": "^3.0.3",
+        "git-raw-commits": "2.0.0",
+        "git-semver-tags": "^2.0.3",
+        "meow": "^4.0.0",
+        "q": "^1.5.1"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+          "dev": true
+        },
+        "camelcase-keys": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz",
+          "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^4.1.0",
+            "map-obj": "^2.0.0",
+            "quick-lru": "^1.0.0"
+          }
+        },
+        "concat-stream": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/concat-stream/download/concat-stream-2.0.0.tgz",
+          "integrity": "sha1-QUz1r3kKSMYKub5FJ9VtXkETPLE=",
+          "dev": true,
+          "requires": {
+            "buffer-from": "^1.0.0",
+            "inherits": "^2.0.3",
+            "readable-stream": "^3.0.2",
+            "typedarray": "^0.0.6"
+          }
+        },
+        "indent-string": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
+          "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
+          "dev": true
+        },
+        "map-obj": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
+          "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=",
+          "dev": true
+        },
+        "meow": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npm.taobao.org/meow/download/meow-4.0.1.tgz",
+          "integrity": "sha1-1IWY9vSxRy81v2MXqVlFrONH+XU=",
+          "dev": true,
+          "requires": {
+            "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"
+          }
+        },
+        "minimist-options": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npm.taobao.org/minimist-options/download/minimist-options-3.0.2.tgz",
+          "integrity": "sha1-+6TIGRM54T7PTWG+sD8HAQPz2VQ=",
+          "dev": true,
+          "requires": {
+            "arrify": "^1.0.1",
+            "is-plain-obj": "^1.1.0"
+          }
+        },
+        "quick-lru": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npm.taobao.org/quick-lru/download/quick-lru-1.1.0.tgz",
+          "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz?cache=0&sync_timestamp=1581624324274&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-3.6.0.tgz",
+          "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        },
+        "redent": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz",
+          "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=",
+          "dev": true,
+          "requires": {
+            "indent-string": "^3.0.0",
+            "strip-indent": "^2.0.0"
+          }
+        },
+        "strip-indent": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+          "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+          "dev": true
+        },
+        "trim-newlines": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
+          "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=",
+          "dev": true
+        }
+      }
+    },
+    "convert-source-map": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+      "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "~5.1.1"
+      }
+    },
+    "cookie": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+      "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
+      "dev": true
+    },
+    "cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+      "dev": true
+    },
+    "copy-concurrently": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz",
+      "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz?cache=0&sync_timestamp=1581257110269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz",
+          "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+      "dev": true
+    },
+    "core-js": {
+      "version": "2.6.11",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
+      "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
+      "dev": true
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+      "dev": true
+    },
+    "cosmiconfig": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
+      "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+      "dev": true,
+      "requires": {
+        "import-fresh": "^2.0.0",
+        "is-directory": "^0.3.1",
+        "js-yaml": "^3.13.1",
+        "parse-json": "^4.0.0"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1"
+          }
+        }
+      }
+    },
+    "cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "http://r.tnpm.oa.com/cross-spawn/download/cross-spawn-7.0.3.tgz",
+      "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=",
+      "dev": true,
+      "requires": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "dependencies": {
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "http://r.tnpm.oa.com/path-key/download/path-key-3.1.1.tgz",
+          "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "http://r.tnpm.oa.com/shebang-command/download/shebang-command-2.0.0.tgz",
+          "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "http://r.tnpm.oa.com/shebang-regex/download/shebang-regex-3.0.0.tgz",
+          "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=",
+          "dev": true
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "http://r.tnpm.oa.com/which/download/which-2.0.2.tgz",
+          "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
+      }
+    },
+    "currently-unhandled": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+      "dev": true,
+      "requires": {
+        "array-find-index": "^1.0.1"
+      }
+    },
+    "cyclist": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
+      "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
+      "dev": true
+    },
+    "cz-conventional-changelog": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-2.1.0.tgz",
+      "integrity": "sha1-L0vHOQ4yROTfKT5ro1Hkx0Cnx2Q=",
+      "dev": true,
+      "requires": {
+        "conventional-commit-types": "^2.0.0",
+        "lodash.map": "^4.5.1",
+        "longest": "^1.0.1",
+        "right-pad": "^1.0.1",
+        "word-wrap": "^1.0.3"
+      }
+    },
+    "dargs": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz",
+      "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=",
+      "dev": true,
+      "requires": {
+        "number-is-nan": "^1.0.0"
+      }
+    },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "datauri": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/datauri/-/datauri-1.1.0.tgz",
+      "integrity": "sha512-0q+cTTKx7q8eDteZRIQLTFJuiIsVing17UbWTPssY4JLSMaYsk/VKpNulBDo9NSgQWcvlPrkEHW8kUO67T/7mQ==",
+      "dev": true,
+      "requires": {
+        "image-size": "^0.6.2",
+        "mimer": "^0.3.2",
+        "semver": "^5.5.0"
+      },
+      "dependencies": {
+        "image-size": {
+          "version": "0.6.3",
+          "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz",
+          "integrity": "sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA==",
+          "dev": true
+        }
+      }
+    },
+    "debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "requires": {
+        "ms": "2.0.0"
+      }
+    },
+    "debuglog": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz",
+      "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=",
+      "dev": true
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+      "dev": true
+    },
+    "decamelize-keys": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
+      "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
+      "dev": true,
+      "requires": {
+        "decamelize": "^1.1.0",
+        "map-obj": "^1.0.0"
+      },
+      "dependencies": {
+        "map-obj": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npm.taobao.org/map-obj/download/map-obj-1.0.1.tgz",
+          "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+          "dev": true
+        }
+      }
+    },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+      "dev": true
+    },
+    "dedent": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+      "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
+      "dev": true
+    },
+    "deep-eql": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+      "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+      "dev": true,
+      "requires": {
+        "type-detect": "^4.0.0"
+      }
+    },
+    "deep-is": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+      "dev": true
+    },
+    "deepmerge": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+      "dev": true
+    },
+    "default-require-extensions": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz",
+      "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==",
+      "dev": true,
+      "requires": {
+        "strip-bom": "^4.0.0"
+      },
+      "dependencies": {
+        "strip-bom": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+          "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+          "dev": true
+        }
+      }
+    },
+    "defaults": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+      "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+      "dev": true,
+      "requires": {
+        "clone": "^1.0.2"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+          "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+          "dev": true
+        }
+      }
+    },
+    "define-properties": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+      "dev": true,
+      "requires": {
+        "object-keys": "^1.0.12"
+      }
+    },
+    "define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "dev": true,
+      "requires": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+          "dev": true
+        }
+      }
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+      "dev": true
+    },
+    "delegates": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+      "dev": true
+    },
+    "depd": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+      "dev": true
+    },
+    "deprecation": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npm.taobao.org/deprecation/download/deprecation-2.3.1.tgz",
+      "integrity": "sha1-Y2jL20Cr8zc7UlrIfkomDDpwCRk=",
+      "dev": true
+    },
+    "destroy": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+      "dev": true
+    },
+    "detect-file": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+      "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+      "dev": true
+    },
+    "detect-indent": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+      "dev": true,
+      "requires": {
+        "repeating": "^2.0.0"
+      }
+    },
+    "dezalgo": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz",
+      "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=",
+      "dev": true,
+      "requires": {
+        "asap": "^2.0.0",
+        "wrappy": "1"
+      }
+    },
+    "diff": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+      "dev": true
+    },
+    "dir-glob": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-2.2.2.tgz",
+      "integrity": "sha1-+gnwaUFTyJGLGLoN6vrpR2n8UMQ=",
+      "dev": true,
+      "requires": {
+        "path-type": "^3.0.0"
+      }
+    },
+    "doctrine": {
+      "version": "3.0.0",
+      "resolved": "http://r.tnpm.oa.com/doctrine/download/doctrine-3.0.0.tgz",
+      "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=",
+      "dev": true,
+      "requires": {
+        "esutils": "^2.0.2"
+      }
+    },
+    "dot-prop": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npm.taobao.org/dot-prop/download/dot-prop-4.2.0.tgz",
+      "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=",
+      "dev": true,
+      "requires": {
+        "is-obj": "^1.0.0"
+      }
+    },
+    "duplexer": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
+      "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+      "dev": true
+    },
+    "duplexer2": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
+      "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "~1.1.9"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "1.1.14",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+          "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+          "dev": true,
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.1",
+            "isarray": "0.0.1",
+            "string_decoder": "~0.10.x"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true
+        }
+      }
+    },
+    "duplexify": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npm.taobao.org/duplexify/download/duplexify-3.7.1.tgz",
+      "integrity": "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk=",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+      "dev": true,
+      "requires": {
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+      "dev": true
+    },
+    "emoji-regex": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+      "dev": true
+    },
+    "encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+      "dev": true
+    },
+    "encoding": {
+      "version": "0.1.12",
+      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
+      "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
+      "dev": true,
+      "requires": {
+        "iconv-lite": "~0.4.13"
+      }
+    },
+    "end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "dev": true,
+      "requires": {
+        "once": "^1.4.0"
+      }
+    },
+    "enquirer": {
+      "version": "2.3.5",
+      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.5.tgz",
+      "integrity": "sha512-BNT1C08P9XD0vNg3J475yIUG+mVdp9T6towYFHUv897X0KoHBjB1shyrNmhmtHWKP17iSWgo7Gqh7BBuzLZMSA==",
+      "dev": true,
+      "requires": {
+        "ansi-colors": "^3.2.1"
+      }
+    },
+    "env-paths": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npm.taobao.org/env-paths/download/env-paths-2.2.0.tgz",
+      "integrity": "sha1-zcpVfcAJFSkX1hZuL+vh8DloXkM=",
+      "dev": true
+    },
+    "envinfo": {
+      "version": "7.5.1",
+      "resolved": "https://registry.npm.taobao.org/envinfo/download/envinfo-7.5.1.tgz",
+      "integrity": "sha1-k8JolyJaAEV8dec001TqkQanIjY=",
+      "dev": true
+    },
+    "err-code": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz",
+      "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=",
+      "dev": true
+    },
+    "errno": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+      "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "prr": "~1.0.1"
+      }
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "es-abstract": {
+      "version": "1.17.5",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
+      "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
+      "dev": true,
+      "requires": {
+        "es-to-primitive": "^1.2.1",
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.1",
+        "is-callable": "^1.1.5",
+        "is-regex": "^1.0.5",
+        "object-inspect": "^1.7.0",
+        "object-keys": "^1.1.1",
+        "object.assign": "^4.1.0",
+        "string.prototype.trimleft": "^2.1.1",
+        "string.prototype.trimright": "^2.1.1"
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+      "dev": true,
+      "requires": {
+        "is-callable": "^1.1.4",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.2"
+      }
+    },
+    "es6-error": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+      "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+      "dev": true
+    },
+    "es6-promise": {
+      "version": "4.2.8",
+      "resolved": "https://registry.npm.taobao.org/es6-promise/download/es6-promise-4.2.8.tgz",
+      "integrity": "sha1-TrIVlMlyvEBVPSduUQU5FD21Pgo=",
+      "dev": true
+    },
+    "es6-promisify": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
+      "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
+      "dev": true,
+      "requires": {
+        "es6-promise": "^4.0.3"
+      }
+    },
+    "escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+      "dev": true
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true
+    },
+    "escodegen": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
+      "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
+      "dev": true,
+      "requires": {
+        "esprima": "^2.7.1",
+        "estraverse": "^1.9.1",
+        "esutils": "^2.0.2",
+        "optionator": "^0.8.1",
+        "source-map": "~0.2.0"
+      },
+      "dependencies": {
+        "esprima": {
+          "version": "2.7.3",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+          "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+          "dev": true
+        },
+        "estraverse": {
+          "version": "1.9.3",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
+          "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.2.0",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
+          "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "amdefine": ">=0.0.4"
+          }
+        }
+      }
+    },
+    "eslint": {
+      "version": "7.5.0",
+      "resolved": "http://r.tnpm.oa.com/eslint/download/eslint-7.5.0.tgz",
+      "integrity": "sha1-nsv61iIW0iO4Ksn/6n7zREZx0TU=",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "ajv": "^6.10.0",
+        "chalk": "^4.0.0",
+        "cross-spawn": "^7.0.2",
+        "debug": "^4.0.1",
+        "doctrine": "^3.0.0",
+        "enquirer": "^2.3.5",
+        "eslint-scope": "^5.1.0",
+        "eslint-utils": "^2.1.0",
+        "eslint-visitor-keys": "^1.3.0",
+        "espree": "^7.2.0",
+        "esquery": "^1.2.0",
+        "esutils": "^2.0.2",
+        "file-entry-cache": "^5.0.1",
+        "functional-red-black-tree": "^1.0.1",
+        "glob-parent": "^5.0.0",
+        "globals": "^12.1.0",
+        "ignore": "^4.0.6",
+        "import-fresh": "^3.0.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "js-yaml": "^3.13.1",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.4.1",
+        "lodash": "^4.17.19",
+        "minimatch": "^3.0.4",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.9.1",
+        "progress": "^2.0.0",
+        "regexpp": "^3.1.0",
+        "semver": "^7.2.1",
+        "strip-ansi": "^6.0.0",
+        "strip-json-comments": "^3.1.0",
+        "table": "^5.2.3",
+        "text-table": "^0.2.0",
+        "v8-compile-cache": "^2.0.3"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "http://r.tnpm.oa.com/ansi-regex/download/ansi-regex-5.0.0.tgz",
+          "integrity": "sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "http://r.tnpm.oa.com/ansi-styles/download/ansi-styles-4.2.1.tgz",
+          "integrity": "sha1-kK51xCTQCNJiTFvynq0xd+v881k=",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "http://r.tnpm.oa.com/chalk/download/chalk-4.1.0.tgz",
+          "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "http://r.tnpm.oa.com/color-convert/download/color-convert-2.0.1.tgz",
+          "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "http://r.tnpm.oa.com/color-name/download/color-name-1.1.4.tgz",
+          "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
+          "dev": true
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "http://r.tnpm.oa.com/debug/download/debug-4.1.1.tgz",
+          "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "glob-parent": {
+          "version": "5.1.1",
+          "resolved": "http://r.tnpm.oa.com/glob-parent/download/glob-parent-5.1.1.tgz",
+          "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "globals": {
+          "version": "12.4.0",
+          "resolved": "http://r.tnpm.oa.com/globals/download/globals-12.4.0.tgz",
+          "integrity": "sha1-oYgTV2pBsAokqX5/gVkYwuGZJfg=",
+          "dev": true,
+          "requires": {
+            "type-fest": "^0.8.1"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "http://r.tnpm.oa.com/has-flag/download/has-flag-4.0.0.tgz",
+          "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
+          "dev": true
+        },
+        "import-fresh": {
+          "version": "3.2.1",
+          "resolved": "http://r.tnpm.oa.com/import-fresh/download/import-fresh-3.2.1.tgz",
+          "integrity": "sha1-Yz/2GFBueTr1rJG/SLcmd+FcvmY=",
+          "dev": true,
+          "requires": {
+            "parent-module": "^1.0.0",
+            "resolve-from": "^4.0.0"
+          }
+        },
+        "is-extglob": {
+          "version": "2.1.1",
+          "resolved": "http://r.tnpm.oa.com/is-extglob/download/is-extglob-2.1.1.tgz",
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "4.0.1",
+          "resolved": "http://r.tnpm.oa.com/is-glob/download/is-glob-4.0.1.tgz",
+          "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^2.1.1"
+          }
+        },
+        "levn": {
+          "version": "0.4.1",
+          "resolved": "http://r.tnpm.oa.com/levn/download/levn-0.4.1.tgz",
+          "integrity": "sha1-rkViwAdHO5MqYgDUAyaN0v/8at4=",
+          "dev": true,
+          "requires": {
+            "prelude-ls": "^1.2.1",
+            "type-check": "~0.4.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.19",
+          "resolved": "http://r.tnpm.oa.com/lodash/download/lodash-4.17.19.tgz",
+          "integrity": "sha1-5I3e2+MLMyF4PFtDAfvTU7weSks=",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "http://r.tnpm.oa.com/ms/download/ms-2.1.2.tgz",
+          "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=",
+          "dev": true
+        },
+        "optionator": {
+          "version": "0.9.1",
+          "resolved": "http://r.tnpm.oa.com/optionator/download/optionator-0.9.1.tgz",
+          "integrity": "sha1-TyNqY3Pa4FZqbUPhMmZ09QwpFJk=",
+          "dev": true,
+          "requires": {
+            "deep-is": "^0.1.3",
+            "fast-levenshtein": "^2.0.6",
+            "levn": "^0.4.1",
+            "prelude-ls": "^1.2.1",
+            "type-check": "^0.4.0",
+            "word-wrap": "^1.2.3"
+          }
+        },
+        "prelude-ls": {
+          "version": "1.2.1",
+          "resolved": "http://r.tnpm.oa.com/prelude-ls/download/prelude-ls-1.2.1.tgz",
+          "integrity": "sha1-3rxkidem5rDnYRiIzsiAM30xY5Y=",
+          "dev": true
+        },
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "http://r.tnpm.oa.com/semver/download/semver-7.3.2.tgz",
+          "integrity": "sha1-YElisFK4HtB4aq6EOJ/7pw/9OTg=",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "http://r.tnpm.oa.com/strip-ansi/download/strip-ansi-6.0.0.tgz",
+          "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        },
+        "strip-json-comments": {
+          "version": "3.1.1",
+          "resolved": "http://r.tnpm.oa.com/strip-json-comments/download/strip-json-comments-3.1.1.tgz",
+          "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "http://r.tnpm.oa.com/supports-color/download/supports-color-7.1.0.tgz",
+          "integrity": "sha1-aOMlkd9z4lrRxLSRCKLsUHliv9E=",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "type-check": {
+          "version": "0.4.0",
+          "resolved": "http://r.tnpm.oa.com/type-check/download/type-check-0.4.0.tgz",
+          "integrity": "sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE=",
+          "dev": true,
+          "requires": {
+            "prelude-ls": "^1.2.1"
+          }
+        },
+        "type-fest": {
+          "version": "0.8.1",
+          "resolved": "http://r.tnpm.oa.com/type-fest/download/type-fest-0.8.1.tgz",
+          "integrity": "sha1-CeJJ696FHTseSNJ8EFREZn8XuD0=",
+          "dev": true
+        }
+      }
+    },
+    "eslint-config-prettier": {
+      "version": "6.10.1",
+      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.10.1.tgz",
+      "integrity": "sha512-svTy6zh1ecQojvpbJSgH3aei/Rt7C6i090l5f2WQ4aB05lYHeZIR1qL4wZyyILTbtmnbHP5Yn8MrsOJMGa8RkQ==",
+      "dev": true,
+      "requires": {
+        "get-stdin": "^6.0.0"
+      }
+    },
+    "eslint-plugin-prettier": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz",
+      "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==",
+      "dev": true,
+      "requires": {
+        "prettier-linter-helpers": "^1.0.0"
+      }
+    },
+    "eslint-scope": {
+      "version": "5.1.0",
+      "resolved": "http://r.tnpm.oa.com/eslint-scope/download/eslint-scope-5.1.0.tgz",
+      "integrity": "sha1-0Plx3+WcaeDK2mhLI9Sdv4JgDOU=",
+      "dev": true,
+      "requires": {
+        "esrecurse": "^4.1.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "eslint-utils": {
+      "version": "2.1.0",
+      "resolved": "http://r.tnpm.oa.com/eslint-utils/download/eslint-utils-2.1.0.tgz",
+      "integrity": "sha1-0t5eA0JOcH3BDHQGjd7a5wh0Gyc=",
+      "dev": true,
+      "requires": {
+        "eslint-visitor-keys": "^1.1.0"
+      }
+    },
+    "eslint-visitor-keys": {
+      "version": "1.3.0",
+      "resolved": "http://r.tnpm.oa.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz",
+      "integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=",
+      "dev": true
+    },
+    "esm": {
+      "version": "3.2.25",
+      "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+      "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
+      "dev": true
+    },
+    "espree": {
+      "version": "7.2.0",
+      "resolved": "http://r.tnpm.oa.com/espree/download/espree-7.2.0.tgz",
+      "integrity": "sha1-HCY9W1E9utCsMMSZG5OsNU6UjWk=",
+      "dev": true,
+      "requires": {
+        "acorn": "^7.3.1",
+        "acorn-jsx": "^5.2.0",
+        "eslint-visitor-keys": "^1.3.0"
+      }
+    },
+    "esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "dev": true
+    },
+    "esquery": {
+      "version": "1.3.1",
+      "resolved": "http://r.tnpm.oa.com/esquery/download/esquery-1.3.1.tgz",
+      "integrity": "sha1-t4tYKKqOIU4p+3TE1bdS4cAz2lc=",
+      "dev": true,
+      "requires": {
+        "estraverse": "^5.1.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.1.0",
+          "resolved": "http://r.tnpm.oa.com/estraverse/download/estraverse-5.1.0.tgz",
+          "integrity": "sha1-N0MJ05/ZNa5QDnuS6Ka0xyDllkI=",
+          "dev": true
+        }
+      }
+    },
+    "esrecurse": {
+      "version": "4.2.1",
+      "resolved": "http://r.tnpm.oa.com/esrecurse/download/esrecurse-4.2.1.tgz",
+      "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=",
+      "dev": true,
+      "requires": {
+        "estraverse": "^4.1.0"
+      }
+    },
+    "estraverse": {
+      "version": "4.3.0",
+      "resolved": "http://r.tnpm.oa.com/estraverse/download/estraverse-4.3.0.tgz",
+      "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=",
+      "dev": true
+    },
+    "estree-walker": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
+      "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
+      "dev": true
+    },
+    "esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true
+    },
+    "etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+      "dev": true
+    },
+    "event-stream": {
+      "version": "3.3.4",
+      "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
+      "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
+      "dev": true,
+      "requires": {
+        "duplexer": "~0.1.1",
+        "from": "~0",
+        "map-stream": "~0.1.0",
+        "pause-stream": "0.0.11",
+        "split": "0.3",
+        "stream-combiner": "~0.0.4",
+        "through": "~2.3.1"
+      }
+    },
+    "eventemitter3": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npm.taobao.org/eventemitter3/download/eventemitter3-3.1.2.tgz?cache=0&sync_timestamp=1589283150629&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feventemitter3%2Fdownload%2Feventemitter3-3.1.2.tgz",
+      "integrity": "sha1-LT1I+cNGaY/Og6hdfWZOmFNd9uc=",
+      "dev": true
+    },
+    "execa": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+      "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "dev": true,
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        }
+      }
+    },
+    "expand-brackets": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-0.1.5.tgz",
+      "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "is-posix-bracket": "^0.1.0"
+      }
+    },
+    "expand-range": {
+      "version": "1.8.2",
+      "resolved": "https://registry.npm.taobao.org/expand-range/download/expand-range-1.8.2.tgz",
+      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "fill-range": "^2.1.0"
+      }
+    },
+    "expand-tilde": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+      "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+      "dev": true,
+      "requires": {
+        "homedir-polyfill": "^1.0.1"
+      }
+    },
+    "express": {
+      "version": "4.17.1",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+      "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.7",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.19.0",
+        "content-disposition": "0.5.3",
+        "content-type": "~1.0.4",
+        "cookie": "0.4.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "~1.1.2",
+        "fresh": "0.5.2",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.5",
+        "qs": "6.7.0",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.1.2",
+        "send": "0.17.1",
+        "serve-static": "1.14.1",
+        "setprototypeof": "1.1.1",
+        "statuses": "~1.5.0",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "qs": {
+          "version": "6.7.0",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+          "dev": true
+        }
+      }
+    },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "dev": true
+    },
+    "extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "dev": true,
+      "requires": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "external-editor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+      "dev": true,
+      "requires": {
+        "chardet": "^0.7.0",
+        "iconv-lite": "^0.4.24",
+        "tmp": "^0.0.33"
+      }
+    },
+    "extglob": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npm.taobao.org/extglob/download/extglob-0.3.2.tgz",
+      "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "is-extglob": "^1.0.0"
+      }
+    },
+    "extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+      "dev": true
+    },
+    "fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "http://r.tnpm.oa.com/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=",
+      "dev": true
+    },
+    "fast-diff": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+      "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+      "dev": true
+    },
+    "fast-glob": {
+      "version": "2.2.7",
+      "resolved": "https://registry.npm.taobao.org/fast-glob/download/fast-glob-2.2.7.tgz?cache=0&sync_timestamp=1592291968616&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-glob%2Fdownload%2Ffast-glob-2.2.7.tgz",
+      "integrity": "sha1-aVOFfDr6R1//ku5gFdUtpwpM050=",
+      "dev": true,
+      "requires": {
+        "@mrmlnc/readdir-enhanced": "^2.2.1",
+        "@nodelib/fs.stat": "^1.1.2",
+        "glob-parent": "^3.1.0",
+        "is-glob": "^4.0.0",
+        "merge2": "^1.2.3",
+        "micromatch": "^3.1.10"
+      },
+      "dependencies": {
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+          "dev": true
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+          "dev": true
+        },
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz",
+          "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=",
+          "dev": true,
+          "requires": {
+            "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"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "expand-brackets": {
+          "version": "2.1.4",
+          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+          "dev": true,
+          "requires": {
+            "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"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "0.2.5",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^0.1.0"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            },
+            "is-accessor-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+              "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+              "dev": true,
+              "requires": {
+                "kind-of": "^3.0.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "dev": true,
+                  "requires": {
+                    "is-buffer": "^1.1.5"
+                  }
+                }
+              }
+            },
+            "is-data-descriptor": {
+              "version": "0.1.4",
+              "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+              "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+              "dev": true,
+              "requires": {
+                "kind-of": "^3.0.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "dev": true,
+                  "requires": {
+                    "is-buffer": "^1.1.5"
+                  }
+                }
+              }
+            },
+            "is-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz",
+              "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+              "dev": true,
+              "requires": {
+                "is-accessor-descriptor": "^0.1.6",
+                "is-data-descriptor": "^0.1.4",
+                "kind-of": "^5.0.0"
+              }
+            },
+            "kind-of": {
+              "version": "5.1.0",
+              "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz",
+              "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=",
+              "dev": true
+            }
+          }
+        },
+        "extglob": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz",
+          "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=",
+          "dev": true,
+          "requires": {
+            "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"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^1.0.0"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+          "dev": true,
+          "requires": {
+            "is-glob": "^3.1.0",
+            "path-dirname": "^1.0.0"
+          },
+          "dependencies": {
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+              "dev": true,
+              "requires": {
+                "is-extglob": "^2.1.0"
+              }
+            }
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        },
+        "is-extglob": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz",
+          "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^2.1.1"
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz",
+          "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz",
+          "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=",
+          "dev": true,
+          "requires": {
+            "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"
+          }
+        }
+      }
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true
+    },
+    "fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+      "dev": true
+    },
+    "figgy-pudding": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npm.taobao.org/figgy-pudding/download/figgy-pudding-3.5.2.tgz",
+      "integrity": "sha1-tO7oFIq7Adzx0aw0Nn1Z4S+mHW4=",
+      "dev": true
+    },
+    "figures": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+      "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^1.0.5"
+      }
+    },
+    "file-entry-cache": {
+      "version": "5.0.1",
+      "resolved": "http://r.tnpm.oa.com/file-entry-cache/download/file-entry-cache-5.0.1.tgz",
+      "integrity": "sha1-yg9u+m3T1WEzP7FFFQZcL6/fQ5w=",
+      "dev": true,
+      "requires": {
+        "flat-cache": "^2.0.1"
+      }
+    },
+    "file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90=",
+      "dev": true,
+      "optional": true
+    },
+    "filename-regex": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/filename-regex/download/filename-regex-2.0.1.tgz",
+      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+      "dev": true,
+      "optional": true
+    },
+    "fill-range": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-2.2.4.tgz",
+      "integrity": "sha1-6x53OrsFbc2N8r/favWbizqTZWU=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "is-number": "^2.1.0",
+        "isobject": "^2.0.0",
+        "randomatic": "^3.0.0",
+        "repeat-element": "^1.1.2",
+        "repeat-string": "^1.5.2"
+      }
+    },
+    "finalhandler": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "statuses": "~1.5.0",
+        "unpipe": "~1.0.0"
+      }
+    },
+    "find-cache-dir": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
+      "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
+      "dev": true,
+      "requires": {
+        "commondir": "^1.0.1",
+        "make-dir": "^3.0.2",
+        "pkg-dir": "^4.1.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "make-dir": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz",
+          "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==",
+          "dev": true,
+          "requires": {
+            "semver": "^6.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+          "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+          "dev": true,
+          "requires": {
+            "find-up": "^4.0.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "find-node-modules": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.0.0.tgz",
+      "integrity": "sha512-8MWIBRgJi/WpjjfVXumjPKCtmQ10B+fjx6zmSA+770GMJirLhWIzg8l763rhjl9xaeaHbnxPNRQKq2mgMhr+aw==",
+      "dev": true,
+      "requires": {
+        "findup-sync": "^3.0.0",
+        "merge": "^1.2.1"
+      }
+    },
+    "find-parent-dir": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz",
+      "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=",
+      "dev": true
+    },
+    "find-root": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+      "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
+      "dev": true
+    },
+    "find-up": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz",
+      "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=",
+      "dev": true,
+      "requires": {
+        "locate-path": "^3.0.0"
+      }
+    },
+    "findup": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/findup/-/findup-0.1.5.tgz",
+      "integrity": "sha1-itkpozk7rGJ5V6fl3kYjsGsOLOs=",
+      "dev": true,
+      "requires": {
+        "colors": "~0.6.0-1",
+        "commander": "~2.1.0"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz",
+          "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=",
+          "dev": true
+        }
+      }
+    },
+    "findup-sync": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
+      "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
+      "dev": true,
+      "requires": {
+        "detect-file": "^1.0.0",
+        "is-glob": "^4.0.0",
+        "micromatch": "^3.0.4",
+        "resolve-dir": "^1.0.1"
+      },
+      "dependencies": {
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+          "dev": true
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+          "dev": true
+        },
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "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"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "expand-brackets": {
+          "version": "2.1.4",
+          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+          "dev": true,
+          "requires": {
+            "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"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "0.2.5",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^0.1.0"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            },
+            "is-accessor-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+              "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+              "dev": true,
+              "requires": {
+                "kind-of": "^3.0.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "dev": true,
+                  "requires": {
+                    "is-buffer": "^1.1.5"
+                  }
+                }
+              }
+            },
+            "is-data-descriptor": {
+              "version": "0.1.4",
+              "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+              "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+              "dev": true,
+              "requires": {
+                "kind-of": "^3.0.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "dev": true,
+                  "requires": {
+                    "is-buffer": "^1.1.5"
+                  }
+                }
+              }
+            },
+            "is-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+              "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+              "dev": true,
+              "requires": {
+                "is-accessor-descriptor": "^0.1.6",
+                "is-data-descriptor": "^0.1.4",
+                "kind-of": "^5.0.0"
+              }
+            },
+            "kind-of": {
+              "version": "5.1.0",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+              "dev": true
+            }
+          }
+        },
+        "extglob": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+          "dev": true,
+          "requires": {
+            "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"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^1.0.0"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        },
+        "is-extglob": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+          "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^2.1.1"
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "dev": true,
+          "requires": {
+            "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"
+          }
+        }
+      }
+    },
+    "flat": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
+      "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
+      "dev": true,
+      "requires": {
+        "is-buffer": "~2.0.3"
+      },
+      "dependencies": {
+        "is-buffer": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
+          "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
+          "dev": true
+        }
+      }
+    },
+    "flat-cache": {
+      "version": "2.0.1",
+      "resolved": "http://r.tnpm.oa.com/flat-cache/download/flat-cache-2.0.1.tgz",
+      "integrity": "sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA=",
+      "dev": true,
+      "requires": {
+        "flatted": "^2.0.0",
+        "rimraf": "2.6.3",
+        "write": "1.0.3"
+      },
+      "dependencies": {
+        "rimraf": {
+          "version": "2.6.3",
+          "resolved": "http://r.tnpm.oa.com/rimraf/download/rimraf-2.6.3.tgz",
+          "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "flatted": {
+      "version": "2.0.2",
+      "resolved": "http://r.tnpm.oa.com/flatted/download/flatted-2.0.2.tgz",
+      "integrity": "sha1-RXWyHivO50NKqb5mL0t7X5wrUTg=",
+      "dev": true
+    },
+    "flush-write-stream": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.1.1.tgz",
+      "integrity": "sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.3.6"
+      }
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+      "dev": true
+    },
+    "for-own": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npm.taobao.org/for-own/download/for-own-0.1.5.tgz",
+      "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "for-in": "^1.0.1"
+      }
+    },
+    "foreground-child": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
+      "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "^7.0.0",
+        "signal-exit": "^3.0.2"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "7.0.2",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz",
+          "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
+          }
+        },
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+          "dev": true
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
+      }
+    },
+    "forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+      "dev": true
+    },
+    "form-data": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+      "dev": true,
+      "requires": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.6",
+        "mime-types": "^2.1.12"
+      }
+    },
+    "forwarded": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+      "dev": true
+    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "dev": true,
+      "requires": {
+        "map-cache": "^0.2.2"
+      }
+    },
+    "fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+      "dev": true
+    },
+    "from": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
+      "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=",
+      "dev": true
+    },
+    "from2": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0"
+      }
+    },
+    "fromentries": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz",
+      "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==",
+      "dev": true
+    },
+    "fs-extra": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+      "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "jsonfile": "^4.0.0",
+        "universalify": "^0.1.0"
+      }
+    },
+    "fs-minipass": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npm.taobao.org/fs-minipass/download/fs-minipass-1.2.7.tgz?cache=0&sync_timestamp=1579628575109&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffs-minipass%2Fdownload%2Ffs-minipass-1.2.7.tgz",
+      "integrity": "sha1-zP+FcIQef+QmVpPaiJNsVa7X98c=",
+      "dev": true,
+      "requires": {
+        "minipass": "^2.6.0"
+      }
+    },
+    "fs-readdir-recursive": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
+      "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
+      "dev": true
+    },
+    "fs-write-stream-atomic": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+      "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "iferr": "^0.1.5",
+        "imurmurhash": "^0.1.4",
+        "readable-stream": "1 || 2"
+      }
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
+    },
+    "fsevents": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz",
+      "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "bindings": "^1.5.0",
+        "nan": "^2.12.1"
+      }
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "functional-red-black-tree": {
+      "version": "1.0.1",
+      "resolved": "http://r.tnpm.oa.com/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz",
+      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+      "dev": true
+    },
+    "gauge": {
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+          "dev": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+          "dev": true,
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        }
+      }
+    },
+    "genfun": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npm.taobao.org/genfun/download/genfun-5.0.0.tgz",
+      "integrity": "sha1-ndlxCgaQClxKW/V6yl2k5S/nZTc=",
+      "dev": true
+    },
+    "gensync": {
+      "version": "1.0.0-beta.1",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
+      "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==",
+      "dev": true
+    },
+    "get-func-name": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+      "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+      "dev": true
+    },
+    "get-pkg-repo": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz",
+      "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz",
+          "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+          "dev": true
+        },
+        "camelcase-keys": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npm.taobao.org/camelcase-keys/download/camelcase-keys-2.1.0.tgz",
+          "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^2.0.0",
+            "map-obj": "^1.0.0"
+          }
+        },
+        "find-up": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz",
+          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+          "dev": true,
+          "requires": {
+            "path-exists": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "get-stdin": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npm.taobao.org/get-stdin/download/get-stdin-4.0.1.tgz",
+          "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+          "dev": true
+        },
+        "indent-string": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npm.taobao.org/indent-string/download/indent-string-2.1.0.tgz",
+          "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+          "dev": true,
+          "requires": {
+            "repeating": "^2.0.0"
+          }
+        },
+        "load-json-file": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz",
+          "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "parse-json": "^2.2.0",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0",
+            "strip-bom": "^2.0.0"
+          }
+        },
+        "map-obj": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npm.taobao.org/map-obj/download/map-obj-1.0.1.tgz",
+          "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+          "dev": true
+        },
+        "meow": {
+          "version": "3.7.0",
+          "resolved": "https://registry.npm.taobao.org/meow/download/meow-3.7.0.tgz",
+          "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+          "dev": true,
+          "requires": {
+            "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"
+          }
+        },
+        "parse-json": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz",
+          "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz",
+          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+          "dev": true,
+          "requires": {
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "path-type": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz",
+          "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        },
+        "read-pkg": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz",
+          "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "^1.0.0",
+            "normalize-package-data": "^2.3.2",
+            "path-type": "^1.0.0"
+          }
+        },
+        "read-pkg-up": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz",
+          "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+          "dev": true,
+          "requires": {
+            "find-up": "^1.0.0",
+            "read-pkg": "^1.0.0"
+          }
+        },
+        "redent": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/redent/download/redent-1.0.0.tgz",
+          "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+          "dev": true,
+          "requires": {
+            "indent-string": "^2.1.0",
+            "strip-indent": "^1.0.1"
+          }
+        },
+        "strip-bom": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz",
+          "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+          "dev": true,
+          "requires": {
+            "is-utf8": "^0.2.0"
+          }
+        },
+        "strip-indent": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npm.taobao.org/strip-indent/download/strip-indent-1.0.1.tgz",
+          "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+          "dev": true,
+          "requires": {
+            "get-stdin": "^4.0.1"
+          }
+        },
+        "trim-newlines": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/trim-newlines/download/trim-newlines-1.0.0.tgz",
+          "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+          "dev": true
+        }
+      }
+    },
+    "get-port": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npm.taobao.org/get-port/download/get-port-4.2.0.tgz",
+      "integrity": "sha1-43Nosehjt2KcQ8WjI2Jflc8ksRk=",
+      "dev": true
+    },
+    "get-stdin": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
+      "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
+      "dev": true
+    },
+    "get-stream": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+      "dev": true,
+      "requires": {
+        "pump": "^3.0.0"
+      },
+      "dependencies": {
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        }
+      }
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+      "dev": true
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "git-raw-commits": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/git-raw-commits/download/git-raw-commits-2.0.0.tgz",
+      "integrity": "sha1-2Srd90RAwUvMXIPszj+3+KeRGLU=",
+      "dev": true,
+      "requires": {
+        "dargs": "^4.0.1",
+        "lodash.template": "^4.0.2",
+        "meow": "^4.0.0",
+        "split2": "^2.0.0",
+        "through2": "^2.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+          "dev": true
+        },
+        "camelcase-keys": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz",
+          "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^4.1.0",
+            "map-obj": "^2.0.0",
+            "quick-lru": "^1.0.0"
+          }
+        },
+        "indent-string": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
+          "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
+          "dev": true
+        },
+        "lodash._reinterpolate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+          "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+          "dev": true
+        },
+        "lodash.template": {
+          "version": "4.5.0",
+          "resolved": "https://registry.npm.taobao.org/lodash.template/download/lodash.template-4.5.0.tgz",
+          "integrity": "sha1-+XYZXPPzR9DV9SSDVp/oAxzM6Ks=",
+          "dev": true,
+          "requires": {
+            "lodash._reinterpolate": "^3.0.0",
+            "lodash.templatesettings": "^4.0.0"
+          }
+        },
+        "lodash.templatesettings": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npm.taobao.org/lodash.templatesettings/download/lodash.templatesettings-4.2.0.tgz",
+          "integrity": "sha1-5IExDwSdPPbUfpEq0JMTsVTw+zM=",
+          "dev": true,
+          "requires": {
+            "lodash._reinterpolate": "^3.0.0"
+          }
+        },
+        "map-obj": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
+          "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=",
+          "dev": true
+        },
+        "meow": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npm.taobao.org/meow/download/meow-4.0.1.tgz",
+          "integrity": "sha1-1IWY9vSxRy81v2MXqVlFrONH+XU=",
+          "dev": true,
+          "requires": {
+            "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"
+          }
+        },
+        "minimist-options": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npm.taobao.org/minimist-options/download/minimist-options-3.0.2.tgz",
+          "integrity": "sha1-+6TIGRM54T7PTWG+sD8HAQPz2VQ=",
+          "dev": true,
+          "requires": {
+            "arrify": "^1.0.1",
+            "is-plain-obj": "^1.1.0"
+          }
+        },
+        "quick-lru": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npm.taobao.org/quick-lru/download/quick-lru-1.1.0.tgz",
+          "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=",
+          "dev": true
+        },
+        "redent": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz",
+          "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=",
+          "dev": true,
+          "requires": {
+            "indent-string": "^3.0.0",
+            "strip-indent": "^2.0.0"
+          }
+        },
+        "strip-indent": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+          "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+          "dev": true
+        },
+        "trim-newlines": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
+          "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=",
+          "dev": true
+        }
+      }
+    },
+    "git-remote-origin-url": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz",
+      "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=",
+      "dev": true,
+      "requires": {
+        "gitconfiglocal": "^1.0.0",
+        "pify": "^2.3.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "git-semver-tags": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npm.taobao.org/git-semver-tags/download/git-semver-tags-2.0.3.tgz",
+      "integrity": "sha1-SJiKcYrPWTgA+ZYiqVKnfEBb+jQ=",
+      "dev": true,
+      "requires": {
+        "meow": "^4.0.0",
+        "semver": "^6.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+          "dev": true
+        },
+        "camelcase-keys": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz",
+          "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^4.1.0",
+            "map-obj": "^2.0.0",
+            "quick-lru": "^1.0.0"
+          }
+        },
+        "indent-string": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
+          "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
+          "dev": true
+        },
+        "map-obj": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
+          "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=",
+          "dev": true
+        },
+        "meow": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npm.taobao.org/meow/download/meow-4.0.1.tgz",
+          "integrity": "sha1-1IWY9vSxRy81v2MXqVlFrONH+XU=",
+          "dev": true,
+          "requires": {
+            "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"
+          }
+        },
+        "minimist-options": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npm.taobao.org/minimist-options/download/minimist-options-3.0.2.tgz",
+          "integrity": "sha1-+6TIGRM54T7PTWG+sD8HAQPz2VQ=",
+          "dev": true,
+          "requires": {
+            "arrify": "^1.0.1",
+            "is-plain-obj": "^1.1.0"
+          }
+        },
+        "quick-lru": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npm.taobao.org/quick-lru/download/quick-lru-1.1.0.tgz",
+          "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=",
+          "dev": true
+        },
+        "redent": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz",
+          "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=",
+          "dev": true,
+          "requires": {
+            "indent-string": "^3.0.0",
+            "strip-indent": "^2.0.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        },
+        "strip-indent": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+          "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+          "dev": true
+        },
+        "trim-newlines": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
+          "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=",
+          "dev": true
+        }
+      }
+    },
+    "git-up": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npm.taobao.org/git-up/download/git-up-4.0.1.tgz",
+      "integrity": "sha1-yy7whmU2QOch0gQv4xBIV9iQB8A=",
+      "dev": true,
+      "requires": {
+        "is-ssh": "^1.3.0",
+        "parse-url": "^5.0.0"
+      }
+    },
+    "git-url-parse": {
+      "version": "11.1.2",
+      "resolved": "https://registry.npm.taobao.org/git-url-parse/download/git-url-parse-11.1.2.tgz",
+      "integrity": "sha1-r/Gol8NsyTaZJwWHvqPby7uV3mc=",
+      "dev": true,
+      "requires": {
+        "git-up": "^4.0.0"
+      }
+    },
+    "gitconfiglocal": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz",
+      "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=",
+      "dev": true,
+      "requires": {
+        "ini": "^1.3.2"
+      }
+    },
+    "glob": {
+      "version": "7.1.6",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+      "dev": true,
+      "requires": {
+        "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"
+      }
+    },
+    "glob-base": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npm.taobao.org/glob-base/download/glob-base-0.3.0.tgz",
+      "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "glob-parent": "^2.0.0",
+        "is-glob": "^2.0.0"
+      }
+    },
+    "glob-parent": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-2.0.0.tgz",
+      "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "is-glob": "^2.0.0"
+      }
+    },
+    "glob-to-regexp": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+      "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+      "dev": true
+    },
+    "global-modules": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+      "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+      "dev": true,
+      "requires": {
+        "global-prefix": "^1.0.1",
+        "is-windows": "^1.0.1",
+        "resolve-dir": "^1.0.0"
+      }
+    },
+    "global-prefix": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+      "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+      "dev": true,
+      "requires": {
+        "expand-tilde": "^2.0.2",
+        "homedir-polyfill": "^1.0.1",
+        "ini": "^1.3.4",
+        "is-windows": "^1.0.1",
+        "which": "^1.2.14"
+      }
+    },
+    "globals": {
+      "version": "9.18.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+      "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+      "dev": true
+    },
+    "globby": {
+      "version": "9.2.0",
+      "resolved": "https://registry.npm.taobao.org/globby/download/globby-9.2.0.tgz?cache=0&sync_timestamp=1591083783605&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobby%2Fdownload%2Fglobby-9.2.0.tgz",
+      "integrity": "sha1-/QKacGxwPSm90XD0tts6P3p8tj0=",
+      "dev": true,
+      "requires": {
+        "@types/glob": "^7.1.1",
+        "array-union": "^1.0.2",
+        "dir-glob": "^2.2.2",
+        "fast-glob": "^2.2.6",
+        "glob": "^7.1.3",
+        "ignore": "^4.0.3",
+        "pify": "^4.0.1",
+        "slash": "^2.0.0"
+      },
+      "dependencies": {
+        "ignore": {
+          "version": "4.0.6",
+          "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz?cache=0&sync_timestamp=1590809289115&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore%2Fdownload%2Fignore-4.0.6.tgz",
+          "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=",
+          "dev": true
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/slash/download/slash-2.0.0.tgz",
+          "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q=",
+          "dev": true
+        }
+      }
+    },
+    "graceful-fs": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
+      "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
+      "dev": true
+    },
+    "growl": {
+      "version": "1.10.5",
+      "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
+      "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
+      "dev": true
+    },
+    "handlebars": {
+      "version": "4.7.6",
+      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
+      "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
+      "dev": true,
+      "requires": {
+        "minimist": "^1.2.5",
+        "neo-async": "^2.6.0",
+        "source-map": "^0.6.1",
+        "uglify-js": "^3.1.4",
+        "wordwrap": "^1.0.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "uglify-js": {
+          "version": "3.8.1",
+          "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.1.tgz",
+          "integrity": "sha512-W7KxyzeaQmZvUFbGj4+YFshhVrMBGSg2IbcYAjGWGvx8DHvJMclbTDMpffdxFUGPBHjIytk7KJUR/KUXstUGDw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "commander": "~2.20.3",
+            "source-map": "~0.6.1"
+          }
+        },
+        "wordwrap": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+          "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+          "dev": true
+        }
+      }
+    },
+    "har-schema": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+      "dev": true
+    },
+    "har-validator": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+      "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.5.5",
+        "har-schema": "^2.0.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.12.0",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
+          "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "fast-deep-equal": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
+          "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
+          "dev": true
+        },
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+          "dev": true
+        }
+      }
+    },
+    "hard-rejection": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/hard-rejection/download/hard-rejection-2.1.0.tgz",
+      "integrity": "sha1-HG7aXBaFxjlCdm15u0Cudzzs2IM=",
+      "dev": true
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-ansi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      }
+    },
+    "has-color": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
+      "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=",
+      "dev": true
+    },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+      "dev": true
+    },
+    "has-symbols": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+      "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+      "dev": true
+    },
+    "has-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+      "dev": true
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "dev": true,
+      "requires": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        }
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "dev": true,
+      "requires": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "hasha": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz",
+      "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==",
+      "dev": true,
+      "requires": {
+        "is-stream": "^2.0.0",
+        "type-fest": "^0.8.0"
+      },
+      "dependencies": {
+        "is-stream": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+          "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+          "dev": true
+        },
+        "type-fest": {
+          "version": "0.8.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+          "dev": true
+        }
+      }
+    },
+    "he": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+      "dev": true
+    },
+    "highlight.js": {
+      "version": "9.18.1",
+      "resolved": "https://registry.npm.taobao.org/highlight.js/download/highlight.js-9.18.1.tgz",
+      "integrity": "sha1-7SGqAB/mJSuxCj121HVzxlOf4Tw=",
+      "dev": true
+    },
+    "home-or-tmp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+      "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+      "dev": true,
+      "requires": {
+        "os-homedir": "^1.0.0",
+        "os-tmpdir": "^1.0.1"
+      }
+    },
+    "homedir-polyfill": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+      "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+      "dev": true,
+      "requires": {
+        "parse-passwd": "^1.0.0"
+      }
+    },
+    "hosted-git-info": {
+      "version": "2.8.9",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+      "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+      "dev": true
+    },
+    "html-escaper": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+      "dev": true
+    },
+    "http-cache-semantics": {
+      "version": "3.8.1",
+      "resolved": "https://registry.npm.taobao.org/http-cache-semantics/download/http-cache-semantics-3.8.1.tgz",
+      "integrity": "sha1-ObDhat2bYFvwqe89nar0hDtMrNI=",
+      "dev": true
+    },
+    "http-errors": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+      "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+      "dev": true,
+      "requires": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.1.1",
+        "statuses": ">= 1.5.0 < 2",
+        "toidentifier": "1.0.0"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        }
+      }
+    },
+    "http-proxy-agent": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/http-proxy-agent/download/http-proxy-agent-2.1.0.tgz",
+      "integrity": "sha1-5IIb7vWyFCogJr1zkm/lN2McVAU=",
+      "dev": true,
+      "requires": {
+        "agent-base": "4",
+        "debug": "3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz",
+          "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "http-signature": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
+      }
+    },
+    "https-proxy-agent": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npm.taobao.org/https-proxy-agent/download/https-proxy-agent-2.2.4.tgz?cache=0&sync_timestamp=1581106803611&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttps-proxy-agent%2Fdownload%2Fhttps-proxy-agent-2.2.4.tgz",
+      "integrity": "sha1-TuenN6vZJniik9mzShr00NCMeHs=",
+      "dev": true,
+      "requires": {
+        "agent-base": "^4.3.0",
+        "debug": "^3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz",
+          "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
+          "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=",
+          "dev": true
+        }
+      }
+    },
+    "human-signals": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+      "dev": true
+    },
+    "humanize-ms": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
+      "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=",
+      "dev": true,
+      "requires": {
+        "ms": "^2.0.0"
+      }
+    },
+    "husky": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-1.3.1.tgz",
+      "integrity": "sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg==",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "^5.0.7",
+        "execa": "^1.0.0",
+        "find-up": "^3.0.0",
+        "get-stdin": "^6.0.0",
+        "is-ci": "^2.0.0",
+        "pkg-dir": "^3.0.0",
+        "please-upgrade-node": "^3.1.1",
+        "read-pkg": "^4.0.1",
+        "run-node": "^1.0.0",
+        "slash": "^2.0.0"
+      },
+      "dependencies": {
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        }
+      }
+    },
+    "iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      }
+    },
+    "iferr": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
+      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
+      "dev": true
+    },
+    "ignore": {
+      "version": "4.0.6",
+      "resolved": "http://r.tnpm.oa.com/ignore/download/ignore-4.0.6.tgz",
+      "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=",
+      "dev": true
+    },
+    "ignore-walk": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npm.taobao.org/ignore-walk/download/ignore-walk-3.0.3.tgz",
+      "integrity": "sha1-AX4kRxhL/q3nwjjkrv3R6PlbHjc=",
+      "dev": true,
+      "requires": {
+        "minimatch": "^3.0.4"
+      }
+    },
+    "image-size": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+      "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
+      "dev": true,
+      "optional": true
+    },
+    "import-fresh": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
+      "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
+      "dev": true,
+      "requires": {
+        "caller-path": "^2.0.0",
+        "resolve-from": "^3.0.0"
+      },
+      "dependencies": {
+        "caller-path": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
+          "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
+          "dev": true,
+          "requires": {
+            "caller-callsite": "^2.0.0"
+          }
+        },
+        "resolve-from": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+          "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+          "dev": true
+        }
+      }
+    },
+    "import-local": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/import-local/download/import-local-2.0.0.tgz",
+      "integrity": "sha1-VQcL44pZk88Y72236WH1vuXFoJ0=",
+      "dev": true,
+      "requires": {
+        "pkg-dir": "^3.0.0",
+        "resolve-cwd": "^2.0.0"
+      }
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+      "dev": true
+    },
+    "indent-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npm.taobao.org/indent-string/download/indent-string-4.0.0.tgz",
+      "integrity": "sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE=",
+      "dev": true
+    },
+    "infer-owner": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npm.taobao.org/infer-owner/download/infer-owner-1.0.4.tgz",
+      "integrity": "sha1-xM78qo5RBRwqQLos6KPScpWvlGc=",
+      "dev": true
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "dev": true,
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "dev": true
+    },
+    "ini": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz",
+      "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==",
+      "dev": true
+    },
+    "init-package-json": {
+      "version": "1.10.3",
+      "resolved": "https://registry.npm.taobao.org/init-package-json/download/init-package-json-1.10.3.tgz",
+      "integrity": "sha1-Rf/i9hCoyhNPK9HbVjeyNQcPbL4=",
+      "dev": true,
+      "requires": {
+        "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": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz",
+      "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "interpret": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
+      "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
+      "dev": true
+    },
+    "invariant": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+      "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+      "dev": true,
+      "requires": {
+        "loose-envify": "^1.0.0"
+      }
+    },
+    "ip": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
+      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+      "dev": true
+    },
+    "ipaddr.js": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+      "dev": true
+    },
+    "is-accessor-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      }
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
+    },
+    "is-binary-path": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz",
+      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "binary-extensions": "^1.0.0"
+      }
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+      "dev": true
+    },
+    "is-callable": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
+      "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
+      "dev": true
+    },
+    "is-ci": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+      "dev": true,
+      "requires": {
+        "ci-info": "^2.0.0"
+      }
+    },
+    "is-data-descriptor": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      }
+    },
+    "is-date-object": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+      "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+      "dev": true
+    },
+    "is-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+      "dev": true,
+      "requires": {
+        "is-accessor-descriptor": "^0.1.6",
+        "is-data-descriptor": "^0.1.4",
+        "kind-of": "^5.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+          "dev": true
+        }
+      }
+    },
+    "is-directory": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+      "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
+      "dev": true
+    },
+    "is-dotfile": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/is-dotfile/download/is-dotfile-1.0.3.tgz",
+      "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+      "dev": true,
+      "optional": true
+    },
+    "is-equal-shallow": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npm.taobao.org/is-equal-shallow/download/is-equal-shallow-0.1.3.tgz",
+      "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "is-primitive": "^2.0.0"
+      }
+    },
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+      "dev": true
+    },
+    "is-extglob": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-1.0.0.tgz",
+      "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+      "dev": true,
+      "optional": true
+    },
+    "is-finite": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
+      "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
+      "dev": true
+    },
+    "is-fullwidth-code-point": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+      "dev": true
+    },
+    "is-glob": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-2.0.1.tgz",
+      "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "is-extglob": "^1.0.0"
+      }
+    },
+    "is-lambda": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/is-lambda/download/is-lambda-1.0.1.tgz",
+      "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=",
+      "dev": true
+    },
+    "is-number": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-2.1.0.tgz",
+      "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      }
+    },
+    "is-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+      "dev": true
+    },
+    "is-plain-obj": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+      "dev": true
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        }
+      }
+    },
+    "is-posix-bracket": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npm.taobao.org/is-posix-bracket/download/is-posix-bracket-0.1.1.tgz",
+      "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+      "dev": true,
+      "optional": true
+    },
+    "is-primitive": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/is-primitive/download/is-primitive-2.0.0.tgz",
+      "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+      "dev": true,
+      "optional": true
+    },
+    "is-promise": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
+      "dev": true
+    },
+    "is-regex": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
+      "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
+    "is-ssh": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npm.taobao.org/is-ssh/download/is-ssh-1.3.1.tgz",
+      "integrity": "sha1-80moyt0k5lKYA3pSLPdSDy6BoPM=",
+      "dev": true,
+      "requires": {
+        "protocols": "^1.1.0"
+      }
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+      "dev": true
+    },
+    "is-symbol": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+      "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+      "dev": true,
+      "requires": {
+        "has-symbols": "^1.0.1"
+      }
+    },
+    "is-text-path": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
+      "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=",
+      "dev": true,
+      "requires": {
+        "text-extensions": "^1.0.0"
+      }
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+      "dev": true
+    },
+    "is-utf8": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+      "dev": true
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+      "dev": true
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "isobject": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz",
+      "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "isarray": "1.0.0"
+      }
+    },
+    "isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+      "dev": true
+    },
+    "istanbul": {
+      "version": "0.4.5",
+      "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz",
+      "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
+      "dev": true,
+      "requires": {
+        "abbrev": "1.0.x",
+        "async": "1.x",
+        "escodegen": "1.8.x",
+        "esprima": "2.7.x",
+        "glob": "^5.0.15",
+        "handlebars": "^4.0.1",
+        "js-yaml": "3.x",
+        "mkdirp": "0.5.x",
+        "nopt": "3.x",
+        "once": "1.x",
+        "resolve": "1.1.x",
+        "supports-color": "^3.1.0",
+        "which": "^1.1.1",
+        "wordwrap": "^1.0.0"
+      },
+      "dependencies": {
+        "esprima": {
+          "version": "2.7.3",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+          "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+          "dev": true
+        },
+        "glob": {
+          "version": "5.0.15",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+          "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+          "dev": true,
+          "requires": {
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "2 || 3",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "resolve": {
+          "version": "1.1.7",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+          "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "^1.0.0"
+          }
+        },
+        "wordwrap": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+          "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+          "dev": true
+        }
+      }
+    },
+    "istanbul-lib-coverage": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
+      "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==",
+      "dev": true
+    },
+    "istanbul-lib-hook": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz",
+      "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==",
+      "dev": true,
+      "requires": {
+        "append-transform": "^2.0.0"
+      }
+    },
+    "istanbul-lib-instrument": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz",
+      "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.7.5",
+        "@babel/parser": "^7.7.5",
+        "@babel/template": "^7.7.4",
+        "@babel/traverse": "^7.7.4",
+        "@istanbuljs/schema": "^0.1.2",
+        "istanbul-lib-coverage": "^3.0.0",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "istanbul-lib-processinfo": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz",
+      "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==",
+      "dev": true,
+      "requires": {
+        "archy": "^1.0.0",
+        "cross-spawn": "^7.0.0",
+        "istanbul-lib-coverage": "^3.0.0-alpha.1",
+        "make-dir": "^3.0.0",
+        "p-map": "^3.0.0",
+        "rimraf": "^3.0.0",
+        "uuid": "^3.3.3"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "7.0.2",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz",
+          "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
+          }
+        },
+        "make-dir": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz",
+          "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==",
+          "dev": true,
+          "requires": {
+            "semver": "^6.0.0"
+          }
+        },
+        "p-map": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+          "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
+          "dev": true,
+          "requires": {
+            "aggregate-error": "^3.0.0"
+          }
+        },
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+          "dev": true
+        },
+        "rimraf": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+          "dev": true
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
+      }
+    },
+    "istanbul-lib-report": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+      "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+      "dev": true,
+      "requires": {
+        "istanbul-lib-coverage": "^3.0.0",
+        "make-dir": "^3.0.0",
+        "supports-color": "^7.1.0"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "make-dir": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz",
+          "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==",
+          "dev": true,
+          "requires": {
+            "semver": "^6.0.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "istanbul-lib-source-maps": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz",
+      "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.1",
+        "istanbul-lib-coverage": "^3.0.0",
+        "source-map": "^0.6.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
       }
     },
-    "babel-preset-stage-2": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-preset-stage-2/download/babel-preset-stage-2-6.24.1.tgz",
-      "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=",
+    "istanbul-reports": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz",
+      "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==",
       "dev": true,
       "requires": {
-        "babel-plugin-syntax-dynamic-import": "6.18.0",
-        "babel-plugin-transform-class-properties": "6.24.1",
-        "babel-plugin-transform-decorators": "6.24.1",
-        "babel-preset-stage-3": "6.24.1"
+        "html-escaper": "^2.0.0",
+        "istanbul-lib-report": "^3.0.0"
       }
     },
-    "babel-preset-stage-3": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-preset-stage-3/download/babel-preset-stage-3-6.24.1.tgz",
-      "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=",
+    "js-tokens": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+      "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+      "dev": true
+    },
+    "js-yaml": {
+      "version": "3.13.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+      "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
       "dev": true,
       "requires": {
-        "babel-plugin-syntax-trailing-function-commas": "6.22.0",
-        "babel-plugin-transform-async-generator-functions": "6.24.1",
-        "babel-plugin-transform-async-to-generator": "6.24.1",
-        "babel-plugin-transform-exponentiation-operator": "6.24.1",
-        "babel-plugin-transform-object-rest-spread": "6.26.0"
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
       }
     },
-    "babel-register": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-register/download/babel-register-6.26.0.tgz",
-      "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+      "dev": true
+    },
+    "jsesc": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+      "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+      "dev": true
+    },
+    "json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+      "dev": true
+    },
+    "json-schema": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+      "dev": true
+    },
+    "json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "http://r.tnpm.oa.com/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=",
+      "dev": true
+    },
+    "json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "http://r.tnpm.oa.com/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+      "dev": true
+    },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+      "dev": true
+    },
+    "json5": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+      "dev": true
+    },
+    "jsonfile": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
       "dev": true,
       "requires": {
-        "babel-core": "6.26.0",
-        "babel-runtime": "6.26.0",
-        "core-js": "2.5.1",
-        "home-or-tmp": "2.0.0",
-        "lodash": "4.17.4",
-        "mkdirp": "0.5.1",
-        "source-map-support": "0.4.18"
+        "graceful-fs": "^4.1.6"
       }
     },
-    "babel-runtime": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz",
-      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+    "jsonlint": {
+      "version": "1.6.3",
+      "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.3.tgz",
+      "integrity": "sha512-jMVTMzP+7gU/IyC6hvKyWpUU8tmTkK5b3BPNuMI9U8Sit+YAWLlZwB6Y6YrdCxfg2kNz05p3XY3Bmm4m26Nv3A==",
       "dev": true,
       "requires": {
-        "core-js": "2.5.1",
-        "regenerator-runtime": "0.11.0"
+        "JSV": "^4.0.x",
+        "nomnom": "^1.5.x"
       }
     },
-    "babel-template": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-template/download/babel-template-6.26.0.tgz",
-      "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+    "jsonparse": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+      "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
+      "dev": true
+    },
+    "jsprim": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.2.3",
+        "verror": "1.10.0"
+      }
+    },
+    "kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "dev": true,
+      "requires": {
+        "is-buffer": "^1.1.5"
+      }
+    },
+    "learn": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/learn/-/learn-0.1.5.tgz",
+      "integrity": "sha1-n0/LSZH3hw2/tnc6JSngc7bgtOw=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0",
-        "babylon": "6.18.0",
-        "lodash": "4.17.4"
+        "babel-preset-es2015": "^6.5.0",
+        "babel-register": "^6.5.2",
+        "datauri": "^1.0.4",
+        "express": "^4.13.4",
+        "handlebars": "^4.0.5",
+        "marked": "^0.3.3",
+        "open": "0.0.5",
+        "ramda": "^0.14.0",
+        "serve-index": "^1.7.3",
+        "serve-static": "^1.10.2",
+        "terminal-menu": "^2.1.1",
+        "tildify": "^1.1.2",
+        "wrench": "^1.5.8"
+      }
+    },
+    "lerna": {
+      "version": "3.22.1",
+      "resolved": "https://registry.npm.taobao.org/lerna/download/lerna-3.22.1.tgz",
+      "integrity": "sha1-ggJ6w9qcYn/YvwLM/v+AapjmW2I=",
+      "dev": true,
+      "requires": {
+        "@lerna/add": "3.21.0",
+        "@lerna/bootstrap": "3.21.0",
+        "@lerna/changed": "3.21.0",
+        "@lerna/clean": "3.21.0",
+        "@lerna/cli": "3.18.5",
+        "@lerna/create": "3.22.0",
+        "@lerna/diff": "3.21.0",
+        "@lerna/exec": "3.21.0",
+        "@lerna/import": "3.22.0",
+        "@lerna/info": "3.21.0",
+        "@lerna/init": "3.21.0",
+        "@lerna/link": "3.21.0",
+        "@lerna/list": "3.21.0",
+        "@lerna/publish": "3.22.1",
+        "@lerna/run": "3.21.0",
+        "@lerna/version": "3.22.1",
+        "import-local": "^2.0.0",
+        "npmlog": "^4.1.2"
+      }
+    },
+    "lerna-changelog": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/lerna-changelog/download/lerna-changelog-1.0.1.tgz",
+      "integrity": "sha1-UwkKt/BHcw7IjTIId2IWRiYmnTo=",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.1",
+        "cli-highlight": "^2.1.4",
+        "execa": "^1.0.0",
+        "make-fetch-happen": "^7.1.1",
+        "normalize-git-url": "^3.0.2",
+        "p-map": "^3.0.0",
+        "progress": "^2.0.0",
+        "yargs": "^13.0.0"
+      },
+      "dependencies": {
+        "agent-base": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npm.taobao.org/agent-base/download/agent-base-5.1.1.tgz",
+          "integrity": "sha1-6Ps/JClZ20TWO+Zl23qOc5U3oyw=",
+          "dev": true
+        },
+        "agentkeepalive": {
+          "version": "4.1.3",
+          "resolved": "https://registry.npm.taobao.org/agentkeepalive/download/agentkeepalive-4.1.3.tgz?cache=0&sync_timestamp=1592194047498&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fagentkeepalive%2Fdownload%2Fagentkeepalive-4.1.3.tgz",
+          "integrity": "sha1-NgoJ10Oh9P3nSfm6B8qmV10IJZo=",
+          "dev": true,
+          "requires": {
+            "debug": "^4.1.0",
+            "depd": "^1.1.2",
+            "humanize-ms": "^1.2.1"
+          }
+        },
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz",
+          "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz",
+          "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "cacache": {
+          "version": "14.0.0",
+          "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-14.0.0.tgz",
+          "integrity": "sha1-l8EPyHxMfuQdReMmMcJnYcJofKo=",
+          "dev": true,
+          "requires": {
+            "chownr": "^1.1.2",
+            "figgy-pudding": "^3.5.1",
+            "fs-minipass": "^2.0.0",
+            "glob": "^7.1.4",
+            "graceful-fs": "^4.2.2",
+            "infer-owner": "^1.0.4",
+            "lru-cache": "^5.1.1",
+            "minipass": "^3.0.0",
+            "minipass-collect": "^1.0.2",
+            "minipass-flush": "^1.0.5",
+            "minipass-pipeline": "^1.2.2",
+            "mkdirp": "^1.0.3",
+            "move-concurrently": "^1.0.1",
+            "p-map": "^3.0.0",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.7.1",
+            "ssri": "^7.0.0",
+            "tar": "^6.0.0",
+            "unique-filename": "^1.1.1"
+          }
+        },
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz",
+          "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1591687070184&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz",
+          "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "cliui": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-5.0.0.tgz?cache=0&sync_timestamp=1573943292170&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-5.0.0.tgz",
+          "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=",
+          "dev": true,
+          "requires": {
+            "string-width": "^3.1.0",
+            "strip-ansi": "^5.2.0",
+            "wrap-ansi": "^5.1.0"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz",
+          "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "fs-minipass": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npm.taobao.org/fs-minipass/download/fs-minipass-2.1.0.tgz?cache=0&sync_timestamp=1579628575109&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffs-minipass%2Fdownload%2Ffs-minipass-2.1.0.tgz",
+          "integrity": "sha1-f1A2/b8SxjwWkZDL5BmchSJx+fs=",
+          "dev": true,
+          "requires": {
+            "minipass": "^3.0.0"
+          }
+        },
+        "get-caller-file": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz",
+          "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=",
+          "dev": true
+        },
+        "http-cache-semantics": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npm.taobao.org/http-cache-semantics/download/http-cache-semantics-4.1.0.tgz",
+          "integrity": "sha1-SekcXL82yblLz81xwj1SSex045A=",
+          "dev": true
+        },
+        "http-proxy-agent": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/http-proxy-agent/download/http-proxy-agent-3.0.0.tgz",
+          "integrity": "sha1-WY9C3IFZSaEeLG2/3yTNikwWUyc=",
+          "dev": true,
+          "requires": {
+            "agent-base": "5",
+            "debug": "4"
+          }
+        },
+        "https-proxy-agent": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/https-proxy-agent/download/https-proxy-agent-4.0.0.tgz?cache=0&sync_timestamp=1581106803611&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttps-proxy-agent%2Fdownload%2Fhttps-proxy-agent-4.0.0.tgz",
+          "integrity": "sha1-cCtx+1UgoTKmbeH2dUHZ5iFU2Cs=",
+          "dev": true,
+          "requires": {
+            "agent-base": "5",
+            "debug": "4"
+          }
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz",
+          "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          },
+          "dependencies": {
+            "yallist": {
+              "version": "3.1.1",
+              "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz",
+              "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=",
+              "dev": true
+            }
+          }
+        },
+        "make-fetch-happen": {
+          "version": "7.1.1",
+          "resolved": "https://registry.npm.taobao.org/make-fetch-happen/download/make-fetch-happen-7.1.1.tgz?cache=0&sync_timestamp=1589333212707&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmake-fetch-happen%2Fdownload%2Fmake-fetch-happen-7.1.1.tgz",
+          "integrity": "sha1-iayBEuqp1DYVQd61kTKekjilMbE=",
+          "dev": true,
+          "requires": {
+            "agentkeepalive": "^4.1.0",
+            "cacache": "^14.0.0",
+            "http-cache-semantics": "^4.0.3",
+            "http-proxy-agent": "^3.0.0",
+            "https-proxy-agent": "^4.0.0",
+            "is-lambda": "^1.0.1",
+            "lru-cache": "^5.1.1",
+            "minipass": "^3.0.0",
+            "minipass-collect": "^1.0.2",
+            "minipass-fetch": "^1.1.2",
+            "minipass-flush": "^1.0.5",
+            "minipass-pipeline": "^1.2.2",
+            "promise-retry": "^1.1.1",
+            "socks-proxy-agent": "^4.0.0",
+            "ssri": "^7.0.1"
+          }
+        },
+        "minipass": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npm.taobao.org/minipass/download/minipass-3.1.3.tgz",
+          "integrity": "sha1-fUL/HzljVILhX5zbUxhN7r1YFf0=",
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "minizlib": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npm.taobao.org/minizlib/download/minizlib-2.1.0.tgz",
+          "integrity": "sha1-/VLGRTAe8JpjosIJaXwpTGzgLPM=",
+          "requires": {
+            "minipass": "^3.0.0",
+            "yallist": "^4.0.0"
+          }
+        },
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-1.0.4.tgz?cache=0&sync_timestamp=1587535418745&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-1.0.4.tgz",
+          "integrity": "sha1-PrXtYmInVteaXw4qIh3+utdcL34=",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
+          "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=",
+          "dev": true
+        },
+        "p-map": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/p-map/download/p-map-3.0.0.tgz",
+          "integrity": "sha1-1wTZr4orpoTiYA2aIVmD1BQal50=",
+          "dev": true,
+          "requires": {
+            "aggregate-error": "^3.0.0"
+          }
+        },
+        "require-main-filename": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz",
+          "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=",
+          "dev": true
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz?cache=0&sync_timestamp=1581229865753&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz",
+          "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "ssri": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz",
+          "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1",
+            "minipass": "^3.1.1"
+          }
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz",
+          "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz",
+          "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz",
+          "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        },
+        "tar": {
+          "version": "6.1.11",
+          "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
+          "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
+          "dev": true,
+          "requires": {
+            "chownr": "^2.0.0",
+            "fs-minipass": "^2.0.0",
+            "minipass": "^3.0.0",
+            "minizlib": "^2.1.1",
+            "mkdirp": "^1.0.3",
+            "yallist": "^4.0.0"
+          },
+          "dependencies": {
+            "chownr": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+              "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+              "dev": true
+            },
+            "minizlib": {
+              "version": "2.1.2",
+              "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+              "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+              "dev": true,
+              "requires": {
+                "minipass": "^3.0.0",
+                "yallist": "^4.0.0"
+              }
+            }
+          }
+        },
+        "which-module": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz",
+          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+          "dev": true
+        },
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz",
+          "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI="
+        },
+        "yargs": {
+          "version": "13.3.2",
+          "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-13.3.2.tgz",
+          "integrity": "sha1-rX/+/sGqWVZayRX4Lcyzipwxot0=",
+          "dev": true,
+          "requires": {
+            "cliui": "^5.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^3.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^13.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "13.1.2",
+          "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-13.1.2.tgz?cache=0&sync_timestamp=1590107599564&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-13.1.2.tgz",
+          "integrity": "sha1-Ew8JcC667vJlDVTObj5XBvek+zg=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
+      }
+    },
+    "less": {
+      "version": "3.11.1",
+      "resolved": "https://registry.npmjs.org/less/-/less-3.11.1.tgz",
+      "integrity": "sha512-tlWX341RECuTOvoDIvtFqXsKj072hm3+9ymRBe76/mD6O5ZZecnlAOVDlWAleF2+aohFrxNidXhv2773f6kY7g==",
+      "dev": true,
+      "requires": {
+        "clone": "^2.1.2",
+        "errno": "^0.1.1",
+        "graceful-fs": "^4.1.2",
+        "image-size": "~0.5.0",
+        "mime": "^1.4.1",
+        "mkdirp": "^0.5.0",
+        "promise": "^7.1.1",
+        "request": "^2.83.0",
+        "source-map": "~0.6.0",
+        "tslib": "^1.10.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true,
+          "optional": true
+        }
       }
     },
-    "babel-traverse": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-traverse/download/babel-traverse-6.26.0.tgz",
-      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+    "levn": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
       "dev": true,
       "requires": {
-        "babel-code-frame": "6.26.0",
-        "babel-messages": "6.23.0",
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0",
-        "babylon": "6.18.0",
-        "debug": "2.6.8",
-        "globals": "9.18.0",
-        "invariant": "2.2.2",
-        "lodash": "4.17.4"
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2"
       }
     },
-    "babel-types": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-types/download/babel-types-6.26.0.tgz",
-      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+    "lines-and-columns": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+      "dev": true
+    },
+    "load-json-file": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npm.taobao.org/load-json-file/download/load-json-file-5.3.0.tgz",
+      "integrity": "sha1-TTweAfocA+p4pgrHr5MsnOU0A/M=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "esutils": "2.0.2",
-        "lodash": "4.17.4",
-        "to-fast-properties": "1.0.3"
+        "graceful-fs": "^4.1.15",
+        "parse-json": "^4.0.0",
+        "pify": "^4.0.1",
+        "strip-bom": "^3.0.0",
+        "type-fest": "^0.3.0"
       }
     },
-    "babylon": {
-      "version": "6.18.0",
-      "resolved": "http://registry.npm.taobao.org/babylon/download/babylon-6.18.0.tgz",
-      "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=",
-      "dev": true
-    },
-    "balanced-match": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-      "dev": true
-    },
-    "bcrypt-pbkdf": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
-      "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
+    "locate-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
       "dev": true,
-      "optional": true,
       "requires": {
-        "tweetnacl": "0.14.5"
+        "p-locate": "^3.0.0",
+        "path-exists": "^3.0.0"
+      },
+      "dependencies": {
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+          "dev": true
+        }
       }
     },
-    "beeper": {
-      "version": "1.1.1",
-      "resolved": "http://registry.npm.taobao.org/beeper/download/beeper-1.1.1.tgz",
-      "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
+    "lodash": {
+      "version": "4.17.15",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+      "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
       "dev": true
     },
-    "binary-extensions": {
-      "version": "1.10.0",
-      "resolved": "http://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.10.0.tgz",
-      "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=",
+    "lodash.clonedeep": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
       "dev": true
     },
-    "boom": {
-      "version": "2.10.1",
-      "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
-      "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
-      "dev": true,
-      "requires": {
-        "hoek": "2.16.3"
-      }
-    },
-    "brace-expansion": {
-      "version": "1.1.8",
-      "resolved": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.8.tgz",
-      "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
-      "dev": true,
-      "requires": {
-        "balanced-match": "1.0.0",
-        "concat-map": "0.0.1"
-      }
+    "lodash.flattendeep": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
+      "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=",
+      "dev": true
     },
-    "braces": {
-      "version": "1.8.5",
-      "resolved": "http://registry.npm.taobao.org/braces/download/braces-1.8.5.tgz",
-      "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
-      "dev": true,
-      "requires": {
-        "expand-range": "1.8.2",
-        "preserve": "0.2.0",
-        "repeat-element": "1.1.2"
-      }
+    "lodash.get": {
+      "version": "4.4.2",
+      "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+      "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
+      "dev": true
     },
-    "browser-stdout": {
-      "version": "1.3.0",
-      "resolved": "http://registry.npm.taobao.org/browser-stdout/download/browser-stdout-1.3.0.tgz",
-      "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
+    "lodash.ismatch": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz",
+      "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=",
       "dev": true
     },
-    "builtin-modules": {
-      "version": "1.1.1",
-      "resolved": "http://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz",
-      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+    "lodash.map": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz",
+      "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=",
       "dev": true
     },
-    "caller-path": {
-      "version": "0.1.0",
-      "resolved": "http://registry.npm.taobao.org/caller-path/download/caller-path-0.1.0.tgz",
-      "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
-      "dev": true,
-      "requires": {
-        "callsites": "0.2.0"
-      }
+    "lodash.set": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
+      "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=",
+      "dev": true
     },
-    "callsites": {
-      "version": "0.2.0",
-      "resolved": "http://registry.npm.taobao.org/callsites/download/callsites-0.2.0.tgz",
-      "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+    "lodash.sortby": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+      "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
       "dev": true
     },
-    "camelcase": {
-      "version": "1.2.1",
-      "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz",
-      "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+    "lodash.uniq": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+      "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
       "dev": true
     },
-    "camelcase-keys": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npm.taobao.org/camelcase-keys/download/camelcase-keys-2.1.0.tgz",
-      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+    "log-symbols": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+      "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
       "dev": true,
       "requires": {
-        "camelcase": "2.1.1",
-        "map-obj": "1.0.1"
+        "chalk": "^2.0.1"
       },
       "dependencies": {
-        "camelcase": {
-          "version": "2.1.1",
-          "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz",
-          "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
-          "dev": true
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
-    "caseless": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
-      "dev": true,
-      "optional": true
-    },
-    "center-align": {
-      "version": "0.1.3",
-      "resolved": "http://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz",
-      "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
-      "dev": true,
-      "requires": {
-        "align-text": "0.1.4",
-        "lazy-cache": "1.0.4"
-      }
+    "longest": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+      "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
+      "dev": true
     },
-    "chalk": {
-      "version": "1.1.3",
-      "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz",
-      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+    "loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
       "dev": true,
       "requires": {
-        "ansi-styles": "2.2.1",
-        "escape-string-regexp": "1.0.5",
-        "has-ansi": "2.0.0",
-        "strip-ansi": "3.0.1",
-        "supports-color": "2.0.0"
+        "js-tokens": "^3.0.0 || ^4.0.0"
       }
     },
-    "chokidar": {
-      "version": "1.7.0",
-      "resolved": "http://registry.npm.taobao.org/chokidar/download/chokidar-1.7.0.tgz",
-      "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
+    "loud-rejection": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
       "dev": true,
       "requires": {
-        "anymatch": "1.3.2",
-        "async-each": "1.0.1",
-        "glob-parent": "2.0.0",
-        "inherits": "2.0.3",
-        "is-binary-path": "1.0.1",
-        "is-glob": "2.0.1",
-        "path-is-absolute": "1.0.1",
-        "readdirp": "2.1.0"
+        "currently-unhandled": "^0.4.1",
+        "signal-exit": "^3.0.0"
       }
     },
-    "circular-json": {
-      "version": "0.3.3",
-      "resolved": "http://registry.npm.taobao.org/circular-json/download/circular-json-0.3.3.tgz",
-      "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=",
+    "macos-release": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npm.taobao.org/macos-release/download/macos-release-2.3.0.tgz",
+      "integrity": "sha1-6xkwsDbAgArevM1fF7xMEt6Ltx8=",
       "dev": true
     },
-    "cli-cursor": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/cli-cursor/download/cli-cursor-1.0.2.tgz",
-      "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
+    "magic-string": {
+      "version": "0.25.7",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
+      "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
       "dev": true,
       "requires": {
-        "restore-cursor": "1.0.1"
+        "sourcemap-codec": "^1.4.4"
       }
     },
-    "cli-width": {
-      "version": "2.2.0",
-      "resolved": "http://registry.npm.taobao.org/cli-width/download/cli-width-2.2.0.tgz",
-      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
-      "dev": true
-    },
-    "cliui": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz",
-      "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+    "make-dir": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-1.3.0.tgz?cache=0&sync_timestamp=1587567572251&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmake-dir%2Fdownload%2Fmake-dir-1.3.0.tgz",
+      "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=",
       "dev": true,
       "requires": {
-        "center-align": "0.1.3",
-        "right-align": "0.1.3",
-        "wordwrap": "0.0.2"
+        "pify": "^3.0.0"
       },
       "dependencies": {
-        "wordwrap": {
-          "version": "0.0.2",
-          "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz",
-          "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
           "dev": true
         }
       }
     },
-    "clone": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/clone/download/clone-1.0.2.tgz",
-      "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=",
-      "dev": true
-    },
-    "clone-stats": {
-      "version": "0.0.1",
-      "resolved": "http://registry.npm.taobao.org/clone-stats/download/clone-stats-0.0.1.tgz",
-      "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
-      "dev": true
-    },
-    "cmd-shim": {
-      "version": "2.0.2",
-      "resolved": "http://registry.npm.taobao.org/cmd-shim/download/cmd-shim-2.0.2.tgz",
-      "integrity": "sha1-b8vamUg6j9FdfTChlspp1oii79s=",
+    "make-fetch-happen": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npm.taobao.org/make-fetch-happen/download/make-fetch-happen-5.0.2.tgz?cache=0&sync_timestamp=1589333212707&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmake-fetch-happen%2Fdownload%2Fmake-fetch-happen-5.0.2.tgz",
+      "integrity": "sha1-qoOHEE8mh+3KAchofuRQE9AtGb0=",
       "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11",
-        "mkdirp": "0.5.1"
+        "agentkeepalive": "^3.4.1",
+        "cacache": "^12.0.0",
+        "http-cache-semantics": "^3.8.1",
+        "http-proxy-agent": "^2.1.0",
+        "https-proxy-agent": "^2.2.3",
+        "lru-cache": "^5.1.1",
+        "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"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz",
+          "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz",
+          "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=",
+          "dev": true
+        }
       }
     },
-    "co": {
-      "version": "4.6.0",
-      "resolved": "http://registry.npm.taobao.org/co/download/co-4.6.0.tgz",
-      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
       "dev": true
     },
-    "code-point-at": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz",
-      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+    "map-obj": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npm.taobao.org/map-obj/download/map-obj-4.1.0.tgz",
+      "integrity": "sha1-uRIhtUJzS58UJWwBMsiXxdclb9U=",
       "dev": true
     },
-    "coffee-script": {
-      "version": "1.12.7",
-      "resolved": "http://registry.npm.taobao.org/coffee-script/download/coffee-script-1.12.7.tgz",
-      "integrity": "sha1-wF2uDLeVkdBbMHCoQzqYyaiczFM=",
+    "map-stream": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
+      "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
       "dev": true
     },
-    "combined-stream": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
-      "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
-      "dev": true,
-      "requires": {
-        "delayed-stream": "1.0.0"
-      }
-    },
-    "command-join": {
-      "version": "1.1.1",
-      "resolved": "http://registry.npm.taobao.org/command-join/download/command-join-1.1.1.tgz",
-      "integrity": "sha1-CedgkBLh3YtPChT95Bpp7/HSER8=",
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
       "dev": true,
       "requires": {
-        "array-from": "2.1.1",
-        "repeat-string": "1.6.1"
+        "object-visit": "^1.0.0"
       }
     },
-    "commander": {
-      "version": "2.11.0",
-      "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.11.0.tgz",
-      "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=",
-      "dev": true
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+    "marked": {
+      "version": "0.3.19",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz",
+      "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==",
       "dev": true
     },
-    "concat-stream": {
-      "version": "1.6.0",
-      "resolved": "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.0.tgz",
-      "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
+    "math-random": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npm.taobao.org/math-random/download/math-random-1.0.4.tgz",
+      "integrity": "sha1-XdaUPJOFSCZwFtTjTwV1gwgMUUw=",
       "dev": true,
-      "requires": {
-        "inherits": "2.0.3",
-        "readable-stream": "2.3.3",
-        "typedarray": "0.0.6"
-      }
-    },
-    "convert-source-map": {
-      "version": "1.5.0",
-      "resolved": "http://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.5.0.tgz",
-      "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=",
-      "dev": true
-    },
-    "core-js": {
-      "version": "2.5.1",
-      "resolved": "http://registry.npm.taobao.org/core-js/download/core-js-2.5.1.tgz",
-      "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=",
-      "dev": true
+      "optional": true
     },
-    "core-util-is": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+    "media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
       "dev": true
     },
-    "cross-spawn": {
-      "version": "4.0.2",
-      "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-4.0.2.tgz",
-      "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=",
-      "dev": true,
-      "requires": {
-        "lru-cache": "4.1.1",
-        "which": "1.3.0"
+    "meow": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npm.taobao.org/meow/download/meow-7.0.1.tgz",
+      "integrity": "sha1-HtSgpQs4RLRRNpxINi6wUV8Ewdw=",
+      "dev": true,
+      "requires": {
+        "@types/minimist": "^1.2.0",
+        "arrify": "^2.0.1",
+        "camelcase": "^6.0.0",
+        "camelcase-keys": "^6.2.2",
+        "decamelize-keys": "^1.1.0",
+        "hard-rejection": "^2.1.0",
+        "minimist-options": "^4.0.2",
+        "normalize-package-data": "^2.5.0",
+        "read-pkg-up": "^7.0.1",
+        "redent": "^3.0.0",
+        "trim-newlines": "^3.0.0",
+        "type-fest": "^0.13.1",
+        "yargs-parser": "^18.1.3"
       },
       "dependencies": {
-        "lru-cache": {
-          "version": "4.1.1",
-          "resolved": "http://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.1.tgz",
-          "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=",
+        "arrify": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npm.taobao.org/arrify/download/arrify-2.0.1.tgz",
+          "integrity": "sha1-yWVekzHgq81YjSp8rX6ZVvZnAfo=",
+          "dev": true
+        },
+        "camelcase": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-6.0.0.tgz",
+          "integrity": "sha1-Uln3ww414njxvcKk2RIws3ytmB4=",
+          "dev": true
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz",
+          "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=",
           "dev": true,
           "requires": {
-            "pseudomap": "1.0.2",
-            "yallist": "2.1.2"
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
           }
-        }
-      }
-    },
-    "cryptiles": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
-      "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "boom": "2.10.1"
-      }
-    },
-    "currently-unhandled": {
-      "version": "0.4.1",
-      "resolved": "http://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz",
-      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
-      "dev": true,
-      "requires": {
-        "array-find-index": "1.0.2"
-      }
-    },
-    "d": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/d/download/d-1.0.0.tgz",
-      "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
-      "dev": true,
-      "requires": {
-        "es5-ext": "0.10.30"
-      }
-    },
-    "dashdash": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
-      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "assert-plus": "1.0.0"
-      },
-      "dependencies": {
-        "assert-plus": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz",
+          "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz",
+          "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "parse-json": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-5.0.0.tgz",
+          "integrity": "sha1-c+URTJhtFD76NxLU6iTbmkJm9g8=",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1",
+            "lines-and-columns": "^1.1.6"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz",
+          "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=",
+          "dev": true
+        },
+        "read-pkg": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-5.2.0.tgz",
+          "integrity": "sha1-e/KVQ4yloz5WzTDgU7NO5yUMk8w=",
+          "dev": true,
+          "requires": {
+            "@types/normalize-package-data": "^2.4.0",
+            "normalize-package-data": "^2.5.0",
+            "parse-json": "^5.0.0",
+            "type-fest": "^0.6.0"
+          },
+          "dependencies": {
+            "type-fest": {
+              "version": "0.6.0",
+              "resolved": "https://registry.npm.taobao.org/type-fest/download/type-fest-0.6.0.tgz?cache=0&sync_timestamp=1591686750124&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype-fest%2Fdownload%2Ftype-fest-0.6.0.tgz",
+              "integrity": "sha1-jSojcNPfiG61yQraHFv2GIrPg4s=",
+              "dev": true
+            }
+          }
+        },
+        "read-pkg-up": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-7.0.1.tgz",
+          "integrity": "sha1-86YTV1hFlzOuK5VjgFbhhU5+9Qc=",
+          "dev": true,
+          "requires": {
+            "find-up": "^4.1.0",
+            "read-pkg": "^5.2.0",
+            "type-fest": "^0.8.1"
+          },
+          "dependencies": {
+            "type-fest": {
+              "version": "0.8.1",
+              "resolved": "https://registry.npm.taobao.org/type-fest/download/type-fest-0.8.1.tgz?cache=0&sync_timestamp=1591686750124&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype-fest%2Fdownload%2Ftype-fest-0.8.1.tgz",
+              "integrity": "sha1-CeJJ696FHTseSNJ8EFREZn8XuD0=",
+              "dev": true
+            }
+          }
+        },
+        "type-fest": {
+          "version": "0.13.1",
+          "resolved": "https://registry.npm.taobao.org/type-fest/download/type-fest-0.13.1.tgz?cache=0&sync_timestamp=1591686750124&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype-fest%2Fdownload%2Ftype-fest-0.13.1.tgz",
+          "integrity": "sha1-AXLLW86AsL1ULqNI21DH4hg02TQ=",
+          "dev": true
+        },
+        "yargs-parser": {
+          "version": "18.1.3",
+          "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-18.1.3.tgz?cache=0&sync_timestamp=1590107599564&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-18.1.3.tgz",
+          "integrity": "sha1-vmjEl1xrKr9GkjawyHA2L6sJp7A=",
           "dev": true,
-          "optional": true
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          },
+          "dependencies": {
+            "camelcase": {
+              "version": "5.3.1",
+              "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz",
+              "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=",
+              "dev": true
+            }
+          }
         }
       }
     },
-    "dateformat": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/dateformat/download/dateformat-2.0.0.tgz",
-      "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=",
+    "merge": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz",
+      "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==",
       "dev": true
     },
-    "debug": {
-      "version": "2.6.8",
-      "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.8.tgz",
-      "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
-      "dev": true,
-      "requires": {
-        "ms": "2.0.0"
-      }
+    "merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+      "dev": true
     },
-    "decamelize": {
-      "version": "1.2.0",
-      "resolved": "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+    "merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
       "dev": true
     },
-    "deep-is": {
-      "version": "0.1.3",
-      "resolved": "http://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz",
-      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+    "merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npm.taobao.org/merge2/download/merge2-1.4.1.tgz?cache=0&sync_timestamp=1591170027156&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmerge2%2Fdownload%2Fmerge2-1.4.1.tgz",
+      "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=",
       "dev": true
     },
-    "defaults": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/defaults/download/defaults-1.0.3.tgz",
-      "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+    "methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+      "dev": true
+    },
+    "micromatch": {
+      "version": "2.3.11",
+      "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-2.3.11.tgz",
+      "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
       "dev": true,
+      "optional": true,
       "requires": {
-        "clone": "1.0.2"
+        "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"
       }
     },
-    "del": {
-      "version": "2.2.2",
-      "resolved": "http://registry.npm.taobao.org/del/download/del-2.2.2.tgz",
-      "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+    "mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "dev": true
+    },
+    "mime-db": {
+      "version": "1.43.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
+      "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==",
+      "dev": true
+    },
+    "mime-types": {
+      "version": "2.1.26",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
+      "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
       "dev": true,
       "requires": {
-        "globby": "5.0.0",
-        "is-path-cwd": "1.0.0",
-        "is-path-in-cwd": "1.0.0",
-        "object-assign": "4.1.1",
-        "pify": "2.3.0",
-        "pinkie-promise": "2.0.1",
-        "rimraf": "2.6.2"
+        "mime-db": "1.43.0"
       }
     },
-    "delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-      "dev": true
-    },
-    "depd": {
-      "version": "1.1.1",
-      "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.1.tgz",
-      "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
+    "mimer": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/mimer/-/mimer-0.3.2.tgz",
+      "integrity": "sha512-N6NcgDQAevhP/02DQ/epK6daLy4NKrIHyTlJcO6qBiYn98q+Y4a/knNsAATCe1xLS2F0nEmJp+QYli2s8vKwyQ==",
       "dev": true
     },
-    "deprecated": {
-      "version": "0.0.1",
-      "resolved": "http://registry.npm.taobao.org/deprecated/download/deprecated-0.0.1.tgz",
-      "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=",
+    "mimic-fn": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+      "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
       "dev": true
     },
-    "destroy": {
-      "version": "1.0.4",
-      "resolved": "http://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz",
-      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+    "min-indent": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/min-indent/download/min-indent-1.0.1.tgz",
+      "integrity": "sha1-pj9oFnOzBXH76LwlaGrnRu76mGk=",
       "dev": true
     },
-    "detect-file": {
-      "version": "0.1.0",
-      "resolved": "http://registry.npm.taobao.org/detect-file/download/detect-file-0.1.0.tgz",
-      "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=",
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
       "dev": true,
       "requires": {
-        "fs-exists-sync": "0.1.0"
+        "brace-expansion": "^1.1.7"
       }
     },
-    "detect-indent": {
-      "version": "4.0.0",
-      "resolved": "http://registry.npm.taobao.org/detect-indent/download/detect-indent-4.0.0.tgz",
-      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+    "minimist": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+      "dev": true
+    },
+    "minimist-options": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npm.taobao.org/minimist-options/download/minimist-options-4.1.0.tgz",
+      "integrity": "sha1-wGVXE8U6ii69d/+iR9NCxA8BBhk=",
       "dev": true,
       "requires": {
-        "repeating": "2.0.1"
+        "arrify": "^1.0.1",
+        "is-plain-obj": "^1.1.0",
+        "kind-of": "^6.0.3"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz",
+          "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=",
+          "dev": true
+        }
       }
     },
-    "diff": {
-      "version": "3.2.0",
-      "resolved": "http://registry.npm.taobao.org/diff/download/diff-3.2.0.tgz",
-      "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=",
-      "dev": true
-    },
-    "doctrine": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/doctrine/download/doctrine-2.0.0.tgz",
-      "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=",
+    "minipass": {
+      "version": "2.9.0",
+      "resolved": "https://registry.npm.taobao.org/minipass/download/minipass-2.9.0.tgz",
+      "integrity": "sha1-5xN2Ln0+Mv7YAxFc+T4EvKn8yaY=",
       "dev": true,
       "requires": {
-        "esutils": "2.0.2",
-        "isarray": "1.0.0"
+        "safe-buffer": "^5.1.2",
+        "yallist": "^3.0.0"
+      },
+      "dependencies": {
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz",
+          "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=",
+          "dev": true
+        }
       }
     },
-    "duplexer2": {
-      "version": "0.0.2",
-      "resolved": "http://registry.npm.taobao.org/duplexer2/download/duplexer2-0.0.2.tgz",
-      "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+    "minipass-collect": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/minipass-collect/download/minipass-collect-1.0.2.tgz",
+      "integrity": "sha1-IrgTv3Rdxu26JXa5QAIq1u3Ixhc=",
       "dev": true,
       "requires": {
-        "readable-stream": "1.1.14"
+        "minipass": "^3.0.0"
       },
       "dependencies": {
-        "isarray": {
-          "version": "0.0.1",
-          "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz",
-          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
-          "dev": true
-        },
-        "readable-stream": {
-          "version": "1.1.14",
-          "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.1.14.tgz",
-          "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+        "minipass": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npm.taobao.org/minipass/download/minipass-3.1.3.tgz",
+          "integrity": "sha1-fUL/HzljVILhX5zbUxhN7r1YFf0=",
           "dev": true,
           "requires": {
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
-            "isarray": "0.0.1",
-            "string_decoder": "0.10.31"
+            "yallist": "^4.0.0"
           }
         },
-        "string_decoder": {
-          "version": "0.10.31",
-          "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz",
-          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz",
+          "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
           "dev": true
         }
       }
     },
-    "duplexify": {
-      "version": "3.5.1",
-      "resolved": "http://registry.npm.taobao.org/duplexify/download/duplexify-3.5.1.tgz",
-      "integrity": "sha1-ThUWvmiDi8kKSZlPCzmm5ZYL780=",
+    "minipass-fetch": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npm.taobao.org/minipass-fetch/download/minipass-fetch-1.2.1.tgz",
+      "integrity": "sha1-G5fstVm+VrCYEtRbLpUJ8fWezi8=",
       "dev": true,
       "requires": {
-        "end-of-stream": "1.4.0",
-        "inherits": "2.0.3",
-        "readable-stream": "2.3.3",
-        "stream-shift": "1.0.0"
+        "encoding": "^0.1.12",
+        "minipass": "^3.1.0",
+        "minipass-pipeline": "^1.2.2",
+        "minipass-sized": "^1.0.3",
+        "minizlib": "^2.0.0"
       },
       "dependencies": {
-        "end-of-stream": {
-          "version": "1.4.0",
-          "resolved": "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.0.tgz",
-          "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=",
+        "minipass": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npm.taobao.org/minipass/download/minipass-3.1.3.tgz",
+          "integrity": "sha1-fUL/HzljVILhX5zbUxhN7r1YFf0=",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "minizlib": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npm.taobao.org/minizlib/download/minizlib-2.1.0.tgz",
+          "integrity": "sha1-/VLGRTAe8JpjosIJaXwpTGzgLPM=",
           "dev": true,
           "requires": {
-            "once": "1.4.0"
+            "minipass": "^3.0.0",
+            "yallist": "^4.0.0"
           }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz",
+          "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
+          "dev": true
         }
       }
     },
-    "ecc-jsbn": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
-      "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "jsbn": "0.1.1"
-      }
-    },
-    "ee-first": {
-      "version": "1.1.1",
-      "resolved": "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz",
-      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
-      "dev": true
-    },
-    "encodeurl": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.1.tgz",
-      "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=",
-      "dev": true
-    },
-    "end-of-stream": {
-      "version": "0.1.5",
-      "resolved": "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-0.1.5.tgz",
-      "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=",
+    "minipass-flush": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npm.taobao.org/minipass-flush/download/minipass-flush-1.0.5.tgz",
+      "integrity": "sha1-gucTXX6JpQ/+ZGEKeHlTxMTLs3M=",
       "dev": true,
       "requires": {
-        "once": "1.3.3"
+        "minipass": "^3.0.0"
       },
       "dependencies": {
-        "once": {
-          "version": "1.3.3",
-          "resolved": "http://registry.npm.taobao.org/once/download/once-1.3.3.tgz",
-          "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
+        "minipass": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npm.taobao.org/minipass/download/minipass-3.1.3.tgz",
+          "integrity": "sha1-fUL/HzljVILhX5zbUxhN7r1YFf0=",
           "dev": true,
           "requires": {
-            "wrappy": "1.0.2"
+            "yallist": "^4.0.0"
           }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz",
+          "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
+          "dev": true
         }
       }
     },
-    "errno": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz",
-      "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "prr": "0.0.0"
-      }
-    },
-    "error-ex": {
-      "version": "1.3.1",
-      "resolved": "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.1.tgz",
-      "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+    "minipass-pipeline": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npm.taobao.org/minipass-pipeline/download/minipass-pipeline-1.2.3.tgz?cache=0&sync_timestamp=1589391114286&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fminipass-pipeline%2Fdownload%2Fminipass-pipeline-1.2.3.tgz",
+      "integrity": "sha1-VfeDkwfXSFnW6K2pw+vnLOwhajQ=",
       "dev": true,
       "requires": {
-        "is-arrayish": "0.2.1"
+        "minipass": "^3.0.0"
+      },
+      "dependencies": {
+        "minipass": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npm.taobao.org/minipass/download/minipass-3.1.3.tgz",
+          "integrity": "sha1-fUL/HzljVILhX5zbUxhN7r1YFf0=",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz",
+          "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
+          "dev": true
+        }
       }
     },
-    "es5-ext": {
-      "version": "0.10.30",
-      "resolved": "http://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.30.tgz",
-      "integrity": "sha1-cUGhaDZpfbq/qq7uQUlc4p9SyTk=",
+    "minipass-sized": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/minipass-sized/download/minipass-sized-1.0.3.tgz",
+      "integrity": "sha1-cO5afFBSBwr6z7wil36nne81O3A=",
       "dev": true,
       "requires": {
-        "es6-iterator": "2.0.1",
-        "es6-symbol": "3.1.1"
+        "minipass": "^3.0.0"
+      },
+      "dependencies": {
+        "minipass": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npm.taobao.org/minipass/download/minipass-3.1.3.tgz",
+          "integrity": "sha1-fUL/HzljVILhX5zbUxhN7r1YFf0=",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz",
+          "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
+          "dev": true
+        }
       }
     },
-    "es6-iterator": {
-      "version": "2.0.1",
-      "resolved": "http://registry.npm.taobao.org/es6-iterator/download/es6-iterator-2.0.1.tgz",
-      "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=",
+    "minizlib": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npm.taobao.org/minizlib/download/minizlib-1.3.3.tgz",
+      "integrity": "sha1-IpDeloGKNMKVUcio0wEha9Zahh0=",
       "dev": true,
       "requires": {
-        "d": "1.0.0",
-        "es5-ext": "0.10.30",
-        "es6-symbol": "3.1.1"
+        "minipass": "^2.9.0"
       }
     },
-    "es6-map": {
-      "version": "0.1.5",
-      "resolved": "http://registry.npm.taobao.org/es6-map/download/es6-map-0.1.5.tgz",
-      "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
+    "mississippi": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/mississippi/download/mississippi-3.0.0.tgz",
+      "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=",
       "dev": true,
       "requires": {
-        "d": "1.0.0",
-        "es5-ext": "0.10.30",
-        "es6-iterator": "2.0.1",
-        "es6-set": "0.1.5",
-        "es6-symbol": "3.1.1",
-        "event-emitter": "0.3.5"
+        "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"
       }
     },
-    "es6-set": {
-      "version": "0.1.5",
-      "resolved": "http://registry.npm.taobao.org/es6-set/download/es6-set-0.1.5.tgz",
-      "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
+    "mixin-deep": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
       "dev": true,
       "requires": {
-        "d": "1.0.0",
-        "es5-ext": "0.10.30",
-        "es6-iterator": "2.0.1",
-        "es6-symbol": "3.1.1",
-        "event-emitter": "0.3.5"
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
       }
     },
-    "es6-symbol": {
-      "version": "3.1.1",
-      "resolved": "http://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.1.tgz",
-      "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+    "mkdirp": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
       "dev": true,
       "requires": {
-        "d": "1.0.0",
-        "es5-ext": "0.10.30"
+        "minimist": "^1.2.5"
       }
     },
-    "es6-weak-map": {
-      "version": "2.0.2",
-      "resolved": "http://registry.npm.taobao.org/es6-weak-map/download/es6-weak-map-2.0.2.tgz",
-      "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
+    "mkdirp-promise": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz",
+      "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=",
       "dev": true,
       "requires": {
-        "d": "1.0.0",
-        "es5-ext": "0.10.30",
-        "es6-iterator": "2.0.1",
-        "es6-symbol": "3.1.1"
+        "mkdirp": "*"
       }
     },
-    "escape-html": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz",
-      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
-      "dev": true
-    },
-    "escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+    "mkpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-1.0.0.tgz",
+      "integrity": "sha1-67Opd+evHGg65v2hK1Raa6bFhT0=",
       "dev": true
     },
-    "escodegen": {
-      "version": "1.8.1",
-      "resolved": "http://registry.npm.taobao.org/escodegen/download/escodegen-1.8.1.tgz",
-      "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
+    "mocha": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz",
+      "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==",
       "dev": true,
       "requires": {
-        "esprima": "2.7.3",
-        "estraverse": "1.9.3",
-        "esutils": "2.0.2",
-        "optionator": "0.8.2",
-        "source-map": "0.2.0"
+        "ansi-colors": "3.2.3",
+        "browser-stdout": "1.3.1",
+        "debug": "3.2.6",
+        "diff": "3.5.0",
+        "escape-string-regexp": "1.0.5",
+        "find-up": "3.0.0",
+        "glob": "7.1.3",
+        "growl": "1.10.5",
+        "he": "1.2.0",
+        "js-yaml": "3.13.1",
+        "log-symbols": "2.2.0",
+        "minimatch": "3.0.4",
+        "mkdirp": "0.5.4",
+        "ms": "2.1.1",
+        "node-environment-flags": "1.0.5",
+        "object.assign": "4.1.0",
+        "strip-json-comments": "2.0.1",
+        "supports-color": "6.0.0",
+        "which": "1.3.1",
+        "wide-align": "1.1.3",
+        "yargs": "13.3.2",
+        "yargs-parser": "13.1.2",
+        "yargs-unparser": "1.6.0"
       },
       "dependencies": {
-        "esprima": {
-          "version": "2.7.3",
-          "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-2.7.3.tgz",
-          "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+        "ansi-colors": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
+          "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
+          "dev": true
+        },
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+          "dev": true
+        },
+        "cliui": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+          "dev": true,
+          "requires": {
+            "string-width": "^3.1.0",
+            "strip-ansi": "^5.2.0",
+            "wrap-ansi": "^5.1.0"
+          }
+        },
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "get-caller-file": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+          "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+          "dev": true
+        },
+        "glob": {
+          "version": "7.1.3",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+          "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+          "dev": true,
+          "requires": {
+            "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"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz",
+          "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+          "dev": true
+        },
+        "require-main-filename": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+          "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
           "dev": true
         },
-        "estraverse": {
-          "version": "1.9.3",
-          "resolved": "http://registry.npm.taobao.org/estraverse/download/estraverse-1.9.3.tgz",
-          "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
+        "supports-color": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
+          "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        },
+        "which-module": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
           "dev": true
         },
-        "source-map": {
-          "version": "0.2.0",
-          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.2.0.tgz",
-          "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          }
+        },
+        "yargs": {
+          "version": "13.3.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+          "dev": true,
+          "requires": {
+            "cliui": "^5.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^3.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^13.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "13.1.2",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+          "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
           "dev": true,
-          "optional": true,
           "requires": {
-            "amdefine": "1.0.1"
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
           }
         }
       }
     },
-    "escope": {
-      "version": "3.6.0",
-      "resolved": "http://registry.npm.taobao.org/escope/download/escope-3.6.0.tgz",
-      "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
+    "modify-values": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/modify-values/download/modify-values-1.0.1.tgz",
+      "integrity": "sha1-s5OfpgVUZHTj4+PGPWS9Q7TuYCI=",
+      "dev": true
+    },
+    "move-concurrently": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
+      "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
       "dev": true,
       "requires": {
-        "es6-map": "0.1.5",
-        "es6-weak-map": "2.0.2",
-        "esrecurse": "4.2.0",
-        "estraverse": "4.2.0"
-      }
-    },
-    "eslint": {
-      "version": "3.19.0",
-      "resolved": "http://registry.npm.taobao.org/eslint/download/eslint-3.19.0.tgz",
-      "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=",
-      "dev": true,
-      "requires": {
-        "babel-code-frame": "6.26.0",
-        "chalk": "1.1.3",
-        "concat-stream": "1.6.0",
-        "debug": "2.6.8",
-        "doctrine": "2.0.0",
-        "escope": "3.6.0",
-        "espree": "3.5.0",
-        "esquery": "1.0.0",
-        "estraverse": "4.2.0",
-        "esutils": "2.0.2",
-        "file-entry-cache": "2.0.0",
-        "glob": "7.1.2",
-        "globals": "9.18.0",
-        "ignore": "3.3.5",
-        "imurmurhash": "0.1.4",
-        "inquirer": "0.12.0",
-        "is-my-json-valid": "2.16.1",
-        "is-resolvable": "1.0.0",
-        "js-yaml": "3.10.0",
-        "json-stable-stringify": "1.0.1",
-        "levn": "0.3.0",
-        "lodash": "4.17.4",
-        "mkdirp": "0.5.1",
-        "natural-compare": "1.4.0",
-        "optionator": "0.8.2",
-        "path-is-inside": "1.0.2",
-        "pluralize": "1.2.1",
-        "progress": "1.1.8",
-        "require-uncached": "1.0.3",
-        "shelljs": "0.7.8",
-        "strip-bom": "3.0.0",
-        "strip-json-comments": "2.0.1",
-        "table": "3.8.3",
-        "text-table": "0.2.0",
-        "user-home": "2.0.0"
+        "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"
       },
       "dependencies": {
-        "user-home": {
-          "version": "2.0.0",
-          "resolved": "http://registry.npm.taobao.org/user-home/download/user-home-2.0.0.tgz",
-          "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=",
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz?cache=0&sync_timestamp=1581257110269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz",
+          "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=",
           "dev": true,
           "requires": {
-            "os-homedir": "1.0.2"
+            "glob": "^7.1.3"
           }
         }
       }
     },
-    "espree": {
-      "version": "3.5.0",
-      "resolved": "http://registry.npm.taobao.org/espree/download/espree-3.5.0.tgz",
-      "integrity": "sha1-mDWGJb3QVYYeon4oZ+pyn69GPY0=",
-      "dev": true,
-      "requires": {
-        "acorn": "5.1.2",
-        "acorn-jsx": "3.0.1"
-      }
-    },
-    "esprima": {
-      "version": "4.0.0",
-      "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-4.0.0.tgz",
-      "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=",
-      "dev": true
-    },
-    "esquery": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/esquery/download/esquery-1.0.0.tgz",
-      "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=",
-      "dev": true,
-      "requires": {
-        "estraverse": "4.2.0"
-      }
-    },
-    "esrecurse": {
-      "version": "4.2.0",
-      "resolved": "http://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.0.tgz",
-      "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=",
-      "dev": true,
-      "requires": {
-        "estraverse": "4.2.0",
-        "object-assign": "4.1.1"
-      }
-    },
-    "estraverse": {
-      "version": "4.2.0",
-      "resolved": "http://registry.npm.taobao.org/estraverse/download/estraverse-4.2.0.tgz",
-      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
-      "dev": true
-    },
-    "esutils": {
-      "version": "2.0.2",
-      "resolved": "http://registry.npm.taobao.org/esutils/download/esutils-2.0.2.tgz",
-      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
-      "dev": true
-    },
-    "etag": {
-      "version": "1.8.1",
-      "resolved": "http://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz",
-      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
       "dev": true
     },
-    "event-emitter": {
-      "version": "0.3.5",
-      "resolved": "http://registry.npm.taobao.org/event-emitter/download/event-emitter-0.3.5.tgz",
-      "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+    "multimatch": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/multimatch/download/multimatch-3.0.0.tgz",
+      "integrity": "sha1-DiU0zGvCONmrZ+G5zV/Nhabb9ws=",
       "dev": true,
       "requires": {
-        "d": "1.0.0",
-        "es5-ext": "0.10.30"
+        "array-differ": "^2.0.3",
+        "array-union": "^1.0.2",
+        "arrify": "^1.0.1",
+        "minimatch": "^3.0.4"
+      },
+      "dependencies": {
+        "array-differ": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npm.taobao.org/array-differ/download/array-differ-2.1.0.tgz",
+          "integrity": "sha1-S5wcPxS5BnVwgpJXaeirkE9IAbE=",
+          "dev": true
+        }
       }
     },
-    "exit-hook": {
-      "version": "1.1.1",
-      "resolved": "http://registry.npm.taobao.org/exit-hook/download/exit-hook-1.1.1.tgz",
-      "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=",
+    "mute-stream": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+      "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
       "dev": true
     },
-    "expand-brackets": {
-      "version": "0.1.5",
-      "resolved": "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-0.1.5.tgz",
-      "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+    "mz": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npm.taobao.org/mz/download/mz-2.7.0.tgz",
+      "integrity": "sha1-lQCAV6Vsr63CvGPd5/n/aVWUjjI=",
       "dev": true,
       "requires": {
-        "is-posix-bracket": "0.1.1"
+        "any-promise": "^1.0.0",
+        "object-assign": "^4.0.1",
+        "thenify-all": "^1.0.0"
       }
     },
-    "expand-range": {
-      "version": "1.8.2",
-      "resolved": "http://registry.npm.taobao.org/expand-range/download/expand-range-1.8.2.tgz",
-      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+    "nan": {
+      "version": "2.14.1",
+      "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.1.tgz",
+      "integrity": "sha1-174036MQW5FJTDFHCJMV7/iHSwE=",
       "dev": true,
-      "requires": {
-        "fill-range": "2.2.3"
-      }
+      "optional": true
     },
-    "expand-tilde": {
-      "version": "1.2.2",
-      "resolved": "http://registry.npm.taobao.org/expand-tilde/download/expand-tilde-1.2.2.tgz",
-      "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=",
-      "dev": true,
-      "requires": {
-        "os-homedir": "1.0.2"
+    "nanomatch": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+          "dev": true
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+          "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+          "dev": true
+        }
       }
     },
-    "extend": {
-      "version": "3.0.1",
-      "resolved": "http://registry.npm.taobao.org/extend/download/extend-3.0.1.tgz",
-      "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
+    "natural-compare": {
+      "version": "1.4.0",
+      "resolved": "http://r.tnpm.oa.com/natural-compare/download/natural-compare-1.4.0.tgz",
+      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
       "dev": true
     },
-    "extglob": {
-      "version": "0.3.2",
-      "resolved": "http://registry.npm.taobao.org/extglob/download/extglob-0.3.2.tgz",
-      "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
-      "dev": true,
-      "requires": {
-        "is-extglob": "1.0.0"
-      }
-    },
-    "extsprintf": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+    "negotiator": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+      "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
       "dev": true
     },
-    "fancy-log": {
-      "version": "1.3.0",
-      "resolved": "http://registry.npm.taobao.org/fancy-log/download/fancy-log-1.3.0.tgz",
-      "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=",
-      "dev": true,
-      "requires": {
-        "chalk": "1.1.3",
-        "time-stamp": "1.1.0"
-      }
+    "neo-async": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
+      "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==",
+      "dev": true
     },
-    "fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "http://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+    "nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
       "dev": true
     },
-    "figures": {
-      "version": "1.7.0",
-      "resolved": "http://registry.npm.taobao.org/figures/download/figures-1.7.0.tgz",
-      "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+    "node-environment-flags": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz",
+      "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==",
       "dev": true,
       "requires": {
-        "escape-string-regexp": "1.0.5",
-        "object-assign": "4.1.1"
+        "object.getownpropertydescriptors": "^2.0.3",
+        "semver": "^5.7.0"
       }
     },
-    "file-entry-cache": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-2.0.0.tgz",
-      "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+    "node-fetch": {
+      "version": "2.6.7",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+      "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
       "dev": true,
       "requires": {
-        "flat-cache": "1.2.2",
-        "object-assign": "4.1.1"
+        "whatwg-url": "^5.0.0"
+      },
+      "dependencies": {
+        "tr46": {
+          "version": "0.0.3",
+          "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+          "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
+          "dev": true
+        },
+        "webidl-conversions": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+          "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
+          "dev": true
+        },
+        "whatwg-url": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+          "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
+          "dev": true,
+          "requires": {
+            "tr46": "~0.0.3",
+            "webidl-conversions": "^3.0.0"
+          }
+        }
       }
     },
-    "filename-regex": {
-      "version": "2.0.1",
-      "resolved": "http://registry.npm.taobao.org/filename-regex/download/filename-regex-2.0.1.tgz",
-      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
-      "dev": true
-    },
-    "fill-range": {
-      "version": "2.2.3",
-      "resolved": "http://registry.npm.taobao.org/fill-range/download/fill-range-2.2.3.tgz",
-      "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
+    "node-fetch-npm": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npm.taobao.org/node-fetch-npm/download/node-fetch-npm-2.0.4.tgz?cache=0&sync_timestamp=1585181373751&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-fetch-npm%2Fdownload%2Fnode-fetch-npm-2.0.4.tgz",
+      "integrity": "sha1-ZQfQ4XqewL477FFpWKSXzsVL9aQ=",
       "dev": true,
       "requires": {
-        "is-number": "2.1.0",
-        "isobject": "2.1.0",
-        "randomatic": "1.1.7",
-        "repeat-element": "1.1.2",
-        "repeat-string": "1.6.1"
+        "encoding": "^0.1.11",
+        "json-parse-better-errors": "^1.0.0",
+        "safe-buffer": "^5.1.1"
       }
     },
-    "find-index": {
-      "version": "0.1.1",
-      "resolved": "http://registry.npm.taobao.org/find-index/download/find-index-0.1.1.tgz",
-      "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=",
-      "dev": true
+    "node-gyp": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npm.taobao.org/node-gyp/download/node-gyp-5.1.1.tgz",
+      "integrity": "sha1-65Ffe2Mck30oLjOu1Ey3oCX2Kj4=",
+      "dev": true,
+      "requires": {
+        "env-paths": "^2.2.0",
+        "glob": "^7.1.4",
+        "graceful-fs": "^4.2.2",
+        "mkdirp": "^0.5.1",
+        "nopt": "^4.0.1",
+        "npmlog": "^4.1.2",
+        "request": "^2.88.0",
+        "rimraf": "^2.6.3",
+        "semver": "^5.7.1",
+        "tar": "^4.4.12",
+        "which": "^1.3.1"
+      },
+      "dependencies": {
+        "nopt": {
+          "version": "4.0.3",
+          "resolved": "https://registry.npm.taobao.org/nopt/download/nopt-4.0.3.tgz?cache=0&sync_timestamp=1583704549918&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnopt%2Fdownload%2Fnopt-4.0.3.tgz",
+          "integrity": "sha1-o3XK2dAv2SEnjZVMIlTVqlfhXkg=",
+          "dev": true,
+          "requires": {
+            "abbrev": "1",
+            "osenv": "^0.1.4"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz?cache=0&sync_timestamp=1581257110269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz",
+          "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
     },
-    "find-up": {
-      "version": "1.1.2",
-      "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz",
-      "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+    "node-preload": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
+      "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==",
       "dev": true,
       "requires": {
-        "path-exists": "2.1.0",
-        "pinkie-promise": "2.0.1"
+        "process-on-spawn": "^1.0.0"
       }
     },
-    "findup-sync": {
-      "version": "0.4.3",
-      "resolved": "http://registry.npm.taobao.org/findup-sync/download/findup-sync-0.4.3.tgz",
-      "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=",
+    "node-time-ago": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/node-time-ago/-/node-time-ago-1.0.0.tgz",
+      "integrity": "sha1-kHH3PqJFCwrfFKd2oxxAKDz48ms=",
       "dev": true,
       "requires": {
-        "detect-file": "0.1.0",
-        "is-glob": "2.0.1",
-        "micromatch": "2.3.11",
-        "resolve-dir": "0.1.1"
+        "lodash": "^4.15.0"
       }
     },
-    "fined": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/fined/download/fined-1.1.0.tgz",
-      "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=",
+    "nomnom": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
+      "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=",
       "dev": true,
       "requires": {
-        "expand-tilde": "2.0.2",
-        "is-plain-object": "2.0.4",
-        "object.defaults": "1.1.0",
-        "object.pick": "1.3.0",
-        "parse-filepath": "1.0.1"
+        "chalk": "~0.4.0",
+        "underscore": "~1.6.0"
       },
       "dependencies": {
-        "expand-tilde": {
-          "version": "2.0.2",
-          "resolved": "http://registry.npm.taobao.org/expand-tilde/download/expand-tilde-2.0.2.tgz",
-          "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+        "ansi-styles": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz",
+          "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "0.4.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz",
+          "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=",
           "dev": true,
           "requires": {
-            "homedir-polyfill": "1.0.1"
+            "ansi-styles": "~1.0.0",
+            "has-color": "~0.1.0",
+            "strip-ansi": "~0.1.0"
           }
+        },
+        "strip-ansi": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz",
+          "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=",
+          "dev": true
         }
       }
     },
-    "first-chunk-stream": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/first-chunk-stream/download/first-chunk-stream-1.0.0.tgz",
-      "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=",
-      "dev": true
-    },
-    "flagged-respawn": {
-      "version": "0.3.2",
-      "resolved": "http://registry.npm.taobao.org/flagged-respawn/download/flagged-respawn-0.3.2.tgz",
-      "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=",
-      "dev": true
-    },
-    "flat-cache": {
-      "version": "1.2.2",
-      "resolved": "http://registry.npm.taobao.org/flat-cache/download/flat-cache-1.2.2.tgz",
-      "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=",
+    "nopt": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+      "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
       "dev": true,
       "requires": {
-        "circular-json": "0.3.3",
-        "del": "2.2.2",
-        "graceful-fs": "4.1.11",
-        "write": "0.2.1"
+        "abbrev": "1"
       }
     },
-    "for-in": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz",
-      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+    "normalize-git-url": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npm.taobao.org/normalize-git-url/download/normalize-git-url-3.0.2.tgz",
+      "integrity": "sha1-jl8Uvgva7bc+ByADEKpBbCc1D8Q=",
       "dev": true
     },
-    "for-own": {
-      "version": "0.1.5",
-      "resolved": "http://registry.npm.taobao.org/for-own/download/for-own-0.1.5.tgz",
-      "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+    "normalize-package-data": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
       "dev": true,
       "requires": {
-        "for-in": "1.0.2"
+        "hosted-git-info": "^2.1.4",
+        "resolve": "^1.10.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
       }
     },
-    "forever-agent": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
-      "dev": true,
-      "optional": true
-    },
-    "fork-stream": {
-      "version": "0.0.4",
-      "resolved": "http://registry.npm.taobao.org/fork-stream/download/fork-stream-0.0.4.tgz",
-      "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=",
-      "dev": true
-    },
-    "form-data": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
-      "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+    "normalize-path": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz",
+      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
       "dev": true,
       "optional": true,
       "requires": {
-        "asynckit": "0.4.0",
-        "combined-stream": "1.0.5",
-        "mime-types": "2.1.17"
+        "remove-trailing-separator": "^1.0.1"
       }
     },
-    "fresh": {
-      "version": "0.5.0",
-      "resolved": "http://registry.npm.taobao.org/fresh/download/fresh-0.5.0.tgz",
-      "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=",
-      "dev": true
-    },
-    "fs-exists-sync": {
-      "version": "0.1.0",
-      "resolved": "http://registry.npm.taobao.org/fs-exists-sync/download/fs-exists-sync-0.1.0.tgz",
-      "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=",
-      "dev": true
-    },
-    "fs-readdir-recursive": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/fs-readdir-recursive/download/fs-readdir-recursive-1.0.0.tgz",
-      "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=",
-      "dev": true
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+    "normalize-url": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npm.taobao.org/normalize-url/download/normalize-url-3.3.0.tgz",
+      "integrity": "sha1-suHE3E98bVd0PfczpPWXjRhlBVk=",
       "dev": true
     },
-    "gaze": {
-      "version": "0.5.2",
-      "resolved": "http://registry.npm.taobao.org/gaze/download/gaze-0.5.2.tgz",
-      "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=",
+    "npm-bundled": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/npm-bundled/download/npm-bundled-1.1.1.tgz?cache=0&sync_timestamp=1575936189080&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnpm-bundled%2Fdownload%2Fnpm-bundled-1.1.1.tgz",
+      "integrity": "sha1-Ht1XCGWpTNsbyCIHdeKUZsn7I0s=",
       "dev": true,
       "requires": {
-        "globule": "0.1.0"
+        "npm-normalize-package-bin": "^1.0.1"
       }
     },
-    "generate-function": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/generate-function/download/generate-function-2.0.0.tgz",
-      "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
-      "dev": true
-    },
-    "generate-object-property": {
-      "version": "1.2.0",
-      "resolved": "http://registry.npm.taobao.org/generate-object-property/download/generate-object-property-1.2.0.tgz",
-      "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
+    "npm-lifecycle": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npm.taobao.org/npm-lifecycle/download/npm-lifecycle-3.1.5.tgz?cache=0&sync_timestamp=1585182608034&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnpm-lifecycle%2Fdownload%2Fnpm-lifecycle-3.1.5.tgz",
+      "integrity": "sha1-mILTZCuMgsgVeCoS5qG/7tACYwk=",
       "dev": true,
       "requires": {
-        "is-property": "1.0.2"
+        "byline": "^5.0.0",
+        "graceful-fs": "^4.1.15",
+        "node-gyp": "^5.0.2",
+        "resolve-from": "^4.0.0",
+        "slide": "^1.1.6",
+        "uid-number": "0.0.6",
+        "umask": "^1.1.0",
+        "which": "^1.3.1"
+      },
+      "dependencies": {
+        "resolve-from": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz",
+          "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=",
+          "dev": true
+        }
       }
     },
-    "get-stdin": {
-      "version": "4.0.1",
-      "resolved": "http://registry.npm.taobao.org/get-stdin/download/get-stdin-4.0.1.tgz",
-      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+    "npm-normalize-package-bin": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/npm-normalize-package-bin/download/npm-normalize-package-bin-1.0.1.tgz?cache=0&sync_timestamp=1575936190670&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnpm-normalize-package-bin%2Fdownload%2Fnpm-normalize-package-bin-1.0.1.tgz",
+      "integrity": "sha1-bnmkHyP9I1wGIyGCKNp9nCO49uI=",
       "dev": true
     },
-    "getpass": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+    "npm-package-arg": {
+      "version": "6.1.1",
+      "resolved": "https://registry.npm.taobao.org/npm-package-arg/download/npm-package-arg-6.1.1.tgz?cache=0&sync_timestamp=1584055189614&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnpm-package-arg%2Fdownload%2Fnpm-package-arg-6.1.1.tgz",
+      "integrity": "sha1-AhaMsKSaK3W/mIooaY3ntSnfXLc=",
       "dev": true,
-      "optional": true,
       "requires": {
-        "assert-plus": "1.0.0"
-      },
-      "dependencies": {
-        "assert-plus": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
-          "dev": true,
-          "optional": true
-        }
+        "hosted-git-info": "^2.7.1",
+        "osenv": "^0.1.5",
+        "semver": "^5.6.0",
+        "validate-npm-package-name": "^3.0.0"
       }
     },
-    "glob": {
-      "version": "7.1.2",
-      "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.2.tgz",
-      "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=",
+    "npm-packlist": {
+      "version": "1.4.8",
+      "resolved": "https://registry.npm.taobao.org/npm-packlist/download/npm-packlist-1.4.8.tgz",
+      "integrity": "sha1-Vu5swTW5+YrT1Rwcldoiu7my7z4=",
       "dev": true,
       "requires": {
-        "fs.realpath": "1.0.0",
-        "inflight": "1.0.6",
-        "inherits": "2.0.3",
-        "minimatch": "3.0.4",
-        "once": "1.4.0",
-        "path-is-absolute": "1.0.1"
+        "ignore-walk": "^3.0.1",
+        "npm-bundled": "^1.0.1",
+        "npm-normalize-package-bin": "^1.0.1"
       }
     },
-    "glob-base": {
-      "version": "0.3.0",
-      "resolved": "http://registry.npm.taobao.org/glob-base/download/glob-base-0.3.0.tgz",
-      "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+    "npm-pick-manifest": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npm.taobao.org/npm-pick-manifest/download/npm-pick-manifest-3.0.2.tgz?cache=0&sync_timestamp=1586304926838&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnpm-pick-manifest%2Fdownload%2Fnpm-pick-manifest-3.0.2.tgz",
+      "integrity": "sha1-9Nnl/UviFT5fTl+be+jcQZqZq7c=",
       "dev": true,
       "requires": {
-        "glob-parent": "2.0.0",
-        "is-glob": "2.0.1"
+        "figgy-pudding": "^3.5.1",
+        "npm-package-arg": "^6.0.0",
+        "semver": "^5.4.1"
       }
     },
-    "glob-parent": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/glob-parent/download/glob-parent-2.0.0.tgz",
-      "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+    "npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
       "dev": true,
       "requires": {
-        "is-glob": "2.0.1"
+        "path-key": "^2.0.0"
       }
     },
-    "glob-stream": {
-      "version": "3.1.18",
-      "resolved": "http://registry.npm.taobao.org/glob-stream/download/glob-stream-3.1.18.tgz",
-      "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=",
+    "npmlog": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npm.taobao.org/npmlog/download/npmlog-4.1.2.tgz",
+      "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=",
       "dev": true,
       "requires": {
-        "glob": "4.5.3",
-        "glob2base": "0.0.12",
-        "minimatch": "2.0.10",
-        "ordered-read-streams": "0.1.0",
-        "through2": "0.6.5",
-        "unique-stream": "1.0.0"
+        "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": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+      "dev": true
+    },
+    "nyc": {
+      "version": "15.0.1",
+      "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.1.tgz",
+      "integrity": "sha512-n0MBXYBYRqa67IVt62qW1r/d9UH/Qtr7SF1w/nQLJ9KxvWF6b2xCHImRAixHN9tnMMYHC2P14uo6KddNGwMgGg==",
+      "dev": true,
+      "requires": {
+        "@istanbuljs/load-nyc-config": "^1.0.0",
+        "@istanbuljs/schema": "^0.1.2",
+        "caching-transform": "^4.0.0",
+        "convert-source-map": "^1.7.0",
+        "decamelize": "^1.2.0",
+        "find-cache-dir": "^3.2.0",
+        "find-up": "^4.1.0",
+        "foreground-child": "^2.0.0",
+        "glob": "^7.1.6",
+        "istanbul-lib-coverage": "^3.0.0",
+        "istanbul-lib-hook": "^3.0.0",
+        "istanbul-lib-instrument": "^4.0.0",
+        "istanbul-lib-processinfo": "^2.0.2",
+        "istanbul-lib-report": "^3.0.0",
+        "istanbul-lib-source-maps": "^4.0.0",
+        "istanbul-reports": "^3.0.2",
+        "make-dir": "^3.0.0",
+        "node-preload": "^0.2.1",
+        "p-map": "^3.0.0",
+        "process-on-spawn": "^1.0.0",
+        "resolve-from": "^5.0.0",
+        "rimraf": "^3.0.0",
+        "signal-exit": "^3.0.2",
+        "spawn-wrap": "^2.0.0",
+        "test-exclude": "^6.0.0",
+        "yargs": "^15.0.2"
       },
       "dependencies": {
-        "glob": {
-          "version": "4.5.3",
-          "resolved": "http://registry.npm.taobao.org/glob/download/glob-4.5.3.tgz",
-          "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=",
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
           "dev": true,
           "requires": {
-            "inflight": "1.0.6",
-            "inherits": "2.0.3",
-            "minimatch": "2.0.10",
-            "once": "1.4.0"
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
           }
         },
-        "isarray": {
-          "version": "0.0.1",
-          "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz",
-          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
           "dev": true
         },
-        "minimatch": {
-          "version": "2.0.10",
-          "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-2.0.10.tgz",
-          "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
+        "cliui": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+          "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
           "dev": true,
           "requires": {
-            "brace-expansion": "1.1.8"
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^6.2.0"
           }
         },
-        "readable-stream": {
-          "version": "1.0.34",
-          "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.0.34.tgz",
-          "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
           "dev": true,
           "requires": {
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
-            "isarray": "0.0.1",
-            "string_decoder": "0.10.31"
+            "color-name": "~1.1.4"
           }
         },
-        "string_decoder": {
-          "version": "0.10.31",
-          "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz",
-          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         },
-        "through2": {
-          "version": "0.6.5",
-          "resolved": "http://registry.npm.taobao.org/through2/download/through2-0.6.5.tgz",
-          "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
           "dev": true,
           "requires": {
-            "readable-stream": "1.0.34",
-            "xtend": "4.0.1"
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
           }
-        }
-      }
-    },
-    "glob-watcher": {
-      "version": "0.0.6",
-      "resolved": "http://registry.npm.taobao.org/glob-watcher/download/glob-watcher-0.0.6.tgz",
-      "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=",
-      "dev": true,
-      "requires": {
-        "gaze": "0.5.2"
-      }
-    },
-    "glob2base": {
-      "version": "0.0.12",
-      "resolved": "http://registry.npm.taobao.org/glob2base/download/glob2base-0.0.12.tgz",
-      "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=",
-      "dev": true,
-      "requires": {
-        "find-index": "0.1.1"
-      }
-    },
-    "global-modules": {
-      "version": "0.2.3",
-      "resolved": "http://registry.npm.taobao.org/global-modules/download/global-modules-0.2.3.tgz",
-      "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=",
-      "dev": true,
-      "requires": {
-        "global-prefix": "0.1.5",
-        "is-windows": "0.2.0"
-      }
-    },
-    "global-prefix": {
-      "version": "0.1.5",
-      "resolved": "http://registry.npm.taobao.org/global-prefix/download/global-prefix-0.1.5.tgz",
-      "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=",
-      "dev": true,
-      "requires": {
-        "homedir-polyfill": "1.0.1",
-        "ini": "1.3.4",
-        "is-windows": "0.2.0",
-        "which": "1.3.0"
-      }
-    },
-    "globals": {
-      "version": "9.18.0",
-      "resolved": "http://registry.npm.taobao.org/globals/download/globals-9.18.0.tgz",
-      "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=",
-      "dev": true
-    },
-    "globby": {
-      "version": "5.0.0",
-      "resolved": "http://registry.npm.taobao.org/globby/download/globby-5.0.0.tgz",
-      "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
-      "dev": true,
-      "requires": {
-        "array-union": "1.0.2",
-        "arrify": "1.0.1",
-        "glob": "7.1.2",
-        "object-assign": "4.1.1",
-        "pify": "2.3.0",
-        "pinkie-promise": "2.0.1"
-      }
-    },
-    "globule": {
-      "version": "0.1.0",
-      "resolved": "http://registry.npm.taobao.org/globule/download/globule-0.1.0.tgz",
-      "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=",
-      "dev": true,
-      "requires": {
-        "glob": "3.1.21",
-        "lodash": "1.0.2",
-        "minimatch": "0.2.14"
-      },
-      "dependencies": {
-        "glob": {
-          "version": "3.1.21",
-          "resolved": "http://registry.npm.taobao.org/glob/download/glob-3.1.21.tgz",
-          "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=",
+        },
+        "get-caller-file": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+          "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "make-dir": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz",
+          "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==",
+          "dev": true,
+          "requires": {
+            "semver": "^6.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "p-map": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+          "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
           "dev": true,
           "requires": {
-            "graceful-fs": "1.2.3",
-            "inherits": "1.0.2",
-            "minimatch": "0.2.14"
+            "aggregate-error": "^3.0.0"
           }
         },
-        "graceful-fs": {
-          "version": "1.2.3",
-          "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-1.2.3.tgz",
-          "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
           "dev": true
         },
-        "inherits": {
-          "version": "1.0.2",
-          "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-1.0.2.tgz",
-          "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=",
+        "require-main-filename": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+          "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
           "dev": true
         },
-        "lodash": {
-          "version": "1.0.2",
-          "resolved": "http://registry.npm.taobao.org/lodash/download/lodash-1.0.2.tgz",
-          "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=",
+        "resolve-from": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+          "dev": true
+        },
+        "rimraf": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
           "dev": true
         },
-        "minimatch": {
-          "version": "0.2.14",
-          "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-0.2.14.tgz",
-          "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
+        "string-width": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        },
+        "which-module": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+          "dev": true
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "yargs": {
+          "version": "15.3.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
+          "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
+          "dev": true,
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.1"
+          }
+        },
+        "yargs-parser": {
+          "version": "18.1.2",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz",
+          "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==",
           "dev": true,
           "requires": {
-            "lru-cache": "2.7.3",
-            "sigmund": "1.0.1"
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
           }
         }
       }
     },
-    "glogg": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/glogg/download/glogg-1.0.0.tgz",
-      "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=",
+    "oauth-sign": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+      "dev": true
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+      "dev": true
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
       "dev": true,
       "requires": {
-        "sparkles": "1.0.0"
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
       }
     },
-    "graceful-fs": {
-      "version": "4.1.11",
-      "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.11.tgz",
-      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
-      "dev": true
-    },
-    "graceful-readlink": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/graceful-readlink/download/graceful-readlink-1.0.1.tgz",
-      "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
+    "object-inspect": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
+      "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
       "dev": true
     },
-    "growl": {
-      "version": "1.9.2",
-      "resolved": "http://registry.npm.taobao.org/growl/download/growl-1.9.2.tgz",
-      "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=",
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
       "dev": true
     },
-    "gulp": {
-      "version": "3.9.1",
-      "resolved": "http://registry.npm.taobao.org/gulp/download/gulp-3.9.1.tgz",
-      "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=",
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
       "dev": true,
       "requires": {
-        "archy": "1.0.0",
-        "chalk": "1.1.3",
-        "deprecated": "0.0.1",
-        "gulp-util": "3.0.8",
-        "interpret": "1.0.3",
-        "liftoff": "2.3.0",
-        "minimist": "1.2.0",
-        "orchestrator": "0.3.8",
-        "pretty-hrtime": "1.0.3",
-        "semver": "4.3.6",
-        "tildify": "1.2.0",
-        "v8flags": "2.1.1",
-        "vinyl-fs": "0.3.14"
+        "isobject": "^3.0.0"
       },
       "dependencies": {
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
           "dev": true
         }
       }
     },
-    "gulp-babel": {
-      "version": "6.1.2",
-      "resolved": "http://registry.npm.taobao.org/gulp-babel/download/gulp-babel-6.1.2.tgz",
-      "integrity": "sha1-fAF25Lo/JExgWIoMSzIKRdGt784=",
+    "object.assign": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+      "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
       "dev": true,
       "requires": {
-        "babel-core": "6.26.0",
-        "gulp-util": "3.0.8",
-        "object-assign": "4.1.1",
-        "replace-ext": "0.0.1",
-        "through2": "2.0.3",
-        "vinyl-sourcemaps-apply": "0.2.1"
+        "define-properties": "^1.1.2",
+        "function-bind": "^1.1.1",
+        "has-symbols": "^1.0.0",
+        "object-keys": "^1.0.11"
       }
     },
-    "gulp-if": {
-      "version": "2.0.2",
-      "resolved": "http://registry.npm.taobao.org/gulp-if/download/gulp-if-2.0.2.tgz",
-      "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=",
+    "object.getownpropertydescriptors": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
+      "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
       "dev": true,
       "requires": {
-        "gulp-match": "1.0.3",
-        "ternary-stream": "2.0.1",
-        "through2": "2.0.3"
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1"
       }
     },
-    "gulp-less": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/gulp-less/-/gulp-less-3.3.2.tgz",
-      "integrity": "sha1-9mNq3MZhUKiQJxn6WZY/x/hipJo=",
+    "object.omit": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/object.omit/download/object.omit-2.0.1.tgz",
+      "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
       "dev": true,
+      "optional": true,
       "requires": {
-        "accord": "0.27.3",
-        "gulp-util": "3.0.8",
-        "less": "2.7.3",
-        "object-assign": "4.1.1",
-        "through2": "2.0.3",
-        "vinyl-sourcemaps-apply": "0.2.1"
+        "for-own": "^0.1.4",
+        "is-extendable": "^0.1.1"
       }
     },
-    "gulp-line-ending-corrector": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/gulp-line-ending-corrector/download/gulp-line-ending-corrector-1.0.1.tgz",
-      "integrity": "sha1-ub6IwkoAM3xJg/+ZpPbDGvHVZUo=",
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
       "dev": true,
       "requires": {
-        "coffee-script": "1.12.7",
-        "gulp-util": "3.0.8",
-        "line-ending-corrector": "1.0.0",
-        "through2": "2.0.3"
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        }
       }
     },
-    "gulp-match": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/gulp-match/download/gulp-match-1.0.3.tgz",
-      "integrity": "sha1-kcfA1/Kb7NZgbVfYCn+Hdqh6uo4=",
-      "dev": true,
-      "requires": {
-        "minimatch": "3.0.4"
-      }
+    "octokit-pagination-methods": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/octokit-pagination-methods/download/octokit-pagination-methods-1.1.0.tgz",
+      "integrity": "sha1-z0cu3J1VEFX573P25CtNu0yAvqQ=",
+      "dev": true
     },
-    "gulp-newer": {
-      "version": "1.3.0",
-      "resolved": "http://registry.npm.taobao.org/gulp-newer/download/gulp-newer-1.3.0.tgz",
-      "integrity": "sha1-1Q7Ky7gi7aSStXMkpshaB/2aVcE=",
+    "on-finished": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
       "dev": true,
       "requires": {
-        "glob": "7.1.2",
-        "gulp-util": "3.0.8",
-        "kew": "0.7.0"
+        "ee-first": "1.1.1"
       }
     },
-    "gulp-plumber": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/gulp-plumber/download/gulp-plumber-1.1.0.tgz",
-      "integrity": "sha1-8SF2wtBCL2AwbCQv/2oBo5T6ugk=",
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
       "dev": true,
       "requires": {
-        "gulp-util": "3.0.8",
-        "through2": "2.0.3"
+        "wrappy": "1"
       }
     },
-    "gulp-util": {
-      "version": "3.0.8",
-      "resolved": "http://registry.npm.taobao.org/gulp-util/download/gulp-util-3.0.8.tgz",
-      "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
+    "onetime": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+      "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
       "dev": true,
       "requires": {
-        "array-differ": "1.0.0",
-        "array-uniq": "1.0.3",
-        "beeper": "1.1.1",
-        "chalk": "1.1.3",
-        "dateformat": "2.0.0",
-        "fancy-log": "1.3.0",
-        "gulplog": "1.0.0",
-        "has-gulplog": "0.1.0",
-        "lodash._reescape": "3.0.0",
-        "lodash._reevaluate": "3.0.0",
-        "lodash._reinterpolate": "3.0.0",
-        "lodash.template": "3.6.2",
-        "minimist": "1.2.0",
-        "multipipe": "0.1.2",
-        "object-assign": "3.0.0",
-        "replace-ext": "0.0.1",
-        "through2": "2.0.3",
-        "vinyl": "0.5.3"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true
-        },
-        "object-assign": {
-          "version": "3.0.0",
-          "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-3.0.0.tgz",
-          "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
-          "dev": true
-        }
+        "mimic-fn": "^1.0.0"
       }
     },
-    "gulp-watch": {
-      "version": "4.3.11",
-      "resolved": "http://registry.npm.taobao.org/gulp-watch/download/gulp-watch-4.3.11.tgz",
-      "integrity": "sha1-Fi/FY96fx3DpH5p845VVE6mhGMA=",
-      "dev": true,
-      "requires": {
-        "anymatch": "1.3.2",
-        "chokidar": "1.7.0",
-        "glob-parent": "3.1.0",
-        "gulp-util": "3.0.8",
-        "object-assign": "4.1.1",
-        "path-is-absolute": "1.0.1",
-        "readable-stream": "2.3.3",
-        "slash": "1.0.0",
-        "vinyl": "1.2.0",
-        "vinyl-file": "2.0.0"
-      },
-      "dependencies": {
-        "glob-parent": {
-          "version": "3.1.0",
-          "resolved": "http://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz",
-          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
-          "dev": true,
-          "requires": {
-            "is-glob": "3.1.0",
-            "path-dirname": "1.0.2"
-          }
-        },
-        "is-extglob": {
-          "version": "2.1.1",
-          "resolved": "http://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz",
-          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-          "dev": true
-        },
-        "is-glob": {
-          "version": "3.1.0",
-          "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz",
-          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "2.1.1"
-          }
-        },
-        "vinyl": {
-          "version": "1.2.0",
-          "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-1.2.0.tgz",
-          "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
-          "dev": true,
-          "requires": {
-            "clone": "1.0.2",
-            "clone-stats": "0.0.1",
-            "replace-ext": "0.0.1"
-          }
-        }
+    "open": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz",
+      "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=",
+      "dev": true
+    },
+    "optionator": {
+      "version": "0.8.3",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+      "dev": true,
+      "requires": {
+        "deep-is": "~0.1.3",
+        "fast-levenshtein": "~2.0.6",
+        "levn": "~0.3.0",
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2",
+        "word-wrap": "~1.2.3"
       }
     },
-    "gulplog": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/gulplog/download/gulplog-1.0.0.tgz",
-      "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+    "os-homedir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+      "dev": true
+    },
+    "os-name": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npm.taobao.org/os-name/download/os-name-3.1.0.tgz",
+      "integrity": "sha1-3sGdlmKW4c1i1wGlpm7h3ernCAE=",
       "dev": true,
       "requires": {
-        "glogg": "1.0.0"
+        "macos-release": "^2.2.0",
+        "windows-release": "^3.1.0"
       }
     },
-    "handlebars": {
-      "version": "4.0.10",
-      "resolved": "http://registry.npm.taobao.org/handlebars/download/handlebars-4.0.10.tgz",
-      "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=",
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+      "dev": true
+    },
+    "osenv": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npm.taobao.org/osenv/download/osenv-0.1.5.tgz",
+      "integrity": "sha1-hc36+uso6Gd/QW4odZK18/SepBA=",
       "dev": true,
       "requires": {
-        "async": "1.5.2",
-        "optimist": "0.6.1",
-        "source-map": "0.4.4",
-        "uglify-js": "2.8.29"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.4.4",
-          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.4.4.tgz",
-          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
-          "dev": true,
-          "requires": {
-            "amdefine": "1.0.1"
-          }
-        }
+        "os-homedir": "^1.0.0",
+        "os-tmpdir": "^1.0.0"
       }
     },
-    "har-schema": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
-      "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=",
+    "output-file-sync": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz",
+      "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=",
       "dev": true,
-      "optional": true
+      "requires": {
+        "graceful-fs": "^4.1.4",
+        "mkdirp": "^0.5.1",
+        "object-assign": "^4.1.0"
+      }
     },
-    "har-validator": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
-      "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "dev": true
+    },
+    "p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
       "dev": true,
-      "optional": true,
       "requires": {
-        "ajv": "4.11.8",
-        "har-schema": "1.0.5"
+        "p-try": "^2.0.0"
       }
     },
-    "has-ansi": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz",
-      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+    "p-locate": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
       "dev": true,
       "requires": {
-        "ansi-regex": "2.1.1"
+        "p-limit": "^2.0.0"
       }
     },
-    "has-color": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
-      "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=",
+    "p-map": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/p-map/download/p-map-2.1.0.tgz",
+      "integrity": "sha1-MQko/u+cnsxltosXaTAYpmXOoXU=",
       "dev": true
     },
-    "has-flag": {
+    "p-map-series": {
       "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz",
-      "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
-      "dev": true
-    },
-    "has-gulplog": {
-      "version": "0.1.0",
-      "resolved": "http://registry.npm.taobao.org/has-gulplog/download/has-gulplog-0.1.0.tgz",
-      "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
+      "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz",
+      "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=",
       "dev": true,
       "requires": {
-        "sparkles": "1.0.0"
+        "p-reduce": "^1.0.0"
       }
     },
-    "hawk": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
-      "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+    "p-pipe": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz",
+      "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=",
+      "dev": true
+    },
+    "p-queue": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npm.taobao.org/p-queue/download/p-queue-4.0.0.tgz",
+      "integrity": "sha1-7Q7uh5iSftbywvX1t3/bIGGl00Y=",
       "dev": true,
-      "optional": true,
       "requires": {
-        "boom": "2.10.1",
-        "cryptiles": "2.0.5",
-        "hoek": "2.16.3",
-        "sntp": "1.0.9"
+        "eventemitter3": "^3.1.0"
       }
     },
-    "he": {
-      "version": "1.1.1",
-      "resolved": "http://registry.npm.taobao.org/he/download/he-1.1.1.tgz",
-      "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+    "p-reduce": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz",
+      "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=",
       "dev": true
     },
-    "hoek": {
-      "version": "2.16.3",
-      "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
-      "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
+    "p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
       "dev": true
     },
-    "home-or-tmp": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/home-or-tmp/download/home-or-tmp-2.0.0.tgz",
-      "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+    "p-waterfall": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-1.0.0.tgz",
+      "integrity": "sha1-ftlLPOszMngjU69qrhGqn8I1uwA=",
       "dev": true,
       "requires": {
-        "os-homedir": "1.0.2",
-        "os-tmpdir": "1.0.2"
+        "p-reduce": "^1.0.0"
       }
     },
-    "homedir-polyfill": {
+    "package-hash": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz",
+      "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.15",
+        "hasha": "^5.0.0",
+        "lodash.flattendeep": "^4.4.0",
+        "release-zalgo": "^1.0.0"
+      }
+    },
+    "parallel-transform": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/parallel-transform/download/parallel-transform-1.2.0.tgz",
+      "integrity": "sha1-kEnKN9bLIYLDsdLHIL6U0UpYFPw=",
+      "dev": true,
+      "requires": {
+        "cyclist": "^1.0.1",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.1.5"
+      }
+    },
+    "parent-module": {
       "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/homedir-polyfill/download/homedir-polyfill-1.0.1.tgz",
-      "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
+      "resolved": "http://r.tnpm.oa.com/parent-module/download/parent-module-1.0.1.tgz",
+      "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=",
       "dev": true,
       "requires": {
-        "parse-passwd": "1.0.0"
+        "callsites": "^3.0.0"
       }
     },
-    "hosted-git-info": {
-      "version": "2.5.0",
-      "resolved": "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.5.0.tgz",
-      "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=",
+    "parse-github-repo-url": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz",
+      "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=",
       "dev": true
     },
-    "http-errors": {
-      "version": "1.6.2",
-      "resolved": "http://registry.npm.taobao.org/http-errors/download/http-errors-1.6.2.tgz",
-      "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
+    "parse-glob": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npm.taobao.org/parse-glob/download/parse-glob-3.0.4.tgz",
+      "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
       "dev": true,
+      "optional": true,
       "requires": {
-        "depd": "1.1.1",
-        "inherits": "2.0.3",
-        "setprototypeof": "1.0.3",
-        "statuses": "1.3.1"
+        "glob-base": "^0.3.0",
+        "is-dotfile": "^1.0.0",
+        "is-extglob": "^1.0.0",
+        "is-glob": "^2.0.0"
       }
     },
-    "http-signature": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
-      "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+    "parse-json": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz",
+      "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
       "dev": true,
-      "optional": true,
       "requires": {
-        "assert-plus": "0.2.0",
-        "jsprim": "1.4.1",
-        "sshpk": "1.13.1"
+        "error-ex": "^1.3.1",
+        "json-parse-better-errors": "^1.0.1"
       }
     },
-    "ignore": {
-      "version": "3.3.5",
-      "resolved": "http://registry.npm.taobao.org/ignore/download/ignore-3.3.5.tgz",
-      "integrity": "sha1-xOcVRV9gc6jX5drnLS/J1xZj26Y=",
+    "parse-passwd": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+      "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
       "dev": true
     },
-    "image-size": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
-      "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
+    "parse-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npm.taobao.org/parse-path/download/parse-path-4.0.1.tgz",
+      "integrity": "sha1-DsdpcElJd4yzuO2l6ZTDIHOhrf8=",
       "dev": true,
-      "optional": true
+      "requires": {
+        "is-ssh": "^1.3.0",
+        "protocols": "^1.4.0"
+      }
     },
-    "imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "http://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+    "parse-url": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npm.taobao.org/parse-url/download/parse-url-5.0.1.tgz",
+      "integrity": "sha1-mcQIT8Eb4UFB76QbPRF6lvy5Un8=",
+      "dev": true,
+      "requires": {
+        "is-ssh": "^1.3.0",
+        "normalize-url": "^3.3.0",
+        "parse-path": "^4.0.0",
+        "protocols": "^1.4.0"
+      }
+    },
+    "parse5": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npm.taobao.org/parse5/download/parse5-5.1.1.tgz",
+      "integrity": "sha1-9o5OW6GFKsLK3AD0VV//bCq7YXg=",
       "dev": true
     },
-    "indent-string": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npm.taobao.org/indent-string/download/indent-string-2.1.0.tgz",
-      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+    "parse5-htmlparser2-tree-adapter": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npm.taobao.org/parse5-htmlparser2-tree-adapter/download/parse5-htmlparser2-tree-adapter-5.1.1.tgz?cache=0&sync_timestamp=1586993715810&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse5-htmlparser2-tree-adapter%2Fdownload%2Fparse5-htmlparser2-tree-adapter-5.1.1.tgz",
+      "integrity": "sha1-6MdD1OkhlNUpPs3isIvjHmdGHLw=",
       "dev": true,
       "requires": {
-        "repeating": "2.0.1"
+        "parse5": "^5.1.1"
       }
     },
-    "indx": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/indx/-/indx-0.2.3.tgz",
-      "integrity": "sha1-Fdz1bunPZcAjTFE8J/vVgOcPvFA=",
+    "parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
       "dev": true
     },
-    "inflight": {
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+      "dev": true
+    },
+    "path-dirname": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+      "dev": true
+    },
+    "path-exists": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz",
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+      "dev": true
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "dev": true
+    },
+    "path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+      "dev": true
+    },
+    "path-parse": {
       "version": "1.0.6",
-      "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+      "dev": true
+    },
+    "path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+      "dev": true
+    },
+    "path-type": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-3.0.0.tgz",
+      "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=",
       "dev": true,
       "requires": {
-        "once": "1.4.0",
-        "wrappy": "1.0.2"
+        "pify": "^3.0.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        }
       }
     },
-    "inherits": {
-      "version": "2.0.3",
-      "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz",
-      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-      "dev": true
-    },
-    "ini": {
-      "version": "1.3.4",
-      "resolved": "http://registry.npm.taobao.org/ini/download/ini-1.3.4.tgz",
-      "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=",
+    "pathval": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+      "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
       "dev": true
     },
-    "inquirer": {
-      "version": "0.12.0",
-      "resolved": "http://registry.npm.taobao.org/inquirer/download/inquirer-0.12.0.tgz",
-      "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=",
+    "pause-stream": {
+      "version": "0.0.11",
+      "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
+      "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
       "dev": true,
       "requires": {
-        "ansi-escapes": "1.4.0",
-        "ansi-regex": "2.1.1",
-        "chalk": "1.1.3",
-        "cli-cursor": "1.0.2",
-        "cli-width": "2.2.0",
-        "figures": "1.7.0",
-        "lodash": "4.17.4",
-        "readline2": "1.0.1",
-        "run-async": "0.1.0",
-        "rx-lite": "3.1.2",
-        "string-width": "1.0.2",
-        "strip-ansi": "3.0.1",
-        "through": "2.3.8"
+        "through": "~2.3"
       }
     },
-    "interpret": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/interpret/download/interpret-1.0.3.tgz",
-      "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=",
+    "performance-now": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
       "dev": true
     },
-    "invariant": {
+    "picomatch": {
       "version": "2.2.2",
-      "resolved": "http://registry.npm.taobao.org/invariant/download/invariant-2.2.2.tgz",
-      "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+      "resolved": "https://registry.npm.taobao.org/picomatch/download/picomatch-2.2.2.tgz",
+      "integrity": "sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=",
+      "dev": true
+    },
+    "pify": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz",
+      "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=",
+      "dev": true
+    },
+    "pinkie": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+      "dev": true
+    },
+    "pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
       "dev": true,
       "requires": {
-        "loose-envify": "1.3.1"
+        "pinkie": "^2.0.0"
       }
     },
-    "is-absolute": {
-      "version": "0.2.6",
-      "resolved": "http://registry.npm.taobao.org/is-absolute/download/is-absolute-0.2.6.tgz",
-      "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=",
+    "pkg-dir": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+      "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
       "dev": true,
       "requires": {
-        "is-relative": "0.2.1",
-        "is-windows": "0.2.0"
+        "find-up": "^3.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        }
       }
     },
-    "is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz",
-      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
-      "dev": true
-    },
-    "is-binary-path": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz",
-      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+    "please-upgrade-node": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
+      "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
       "dev": true,
       "requires": {
-        "binary-extensions": "1.10.0"
+        "semver-compare": "^1.0.0"
       }
     },
-    "is-buffer": {
-      "version": "1.1.5",
-      "resolved": "http://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.5.tgz",
-      "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=",
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+      "dev": true
+    },
+    "prelude-ls": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+      "dev": true
+    },
+    "preserve": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npm.taobao.org/preserve/download/preserve-0.2.0.tgz",
+      "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+      "dev": true,
+      "optional": true
+    },
+    "prettier": {
+      "version": "1.19.1",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
+      "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
       "dev": true
     },
-    "is-builtin-module": {
+    "prettier-linter-helpers": {
       "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/is-builtin-module/download/is-builtin-module-1.0.0.tgz",
-      "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+      "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+      "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
       "dev": true,
       "requires": {
-        "builtin-modules": "1.1.1"
+        "fast-diff": "^1.1.2"
       }
     },
-    "is-dotfile": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/is-dotfile/download/is-dotfile-1.0.3.tgz",
-      "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+    "private": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
       "dev": true
     },
-    "is-equal-shallow": {
-      "version": "0.1.3",
-      "resolved": "http://registry.npm.taobao.org/is-equal-shallow/download/is-equal-shallow-0.1.3.tgz",
-      "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+    "process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+      "dev": true
+    },
+    "process-on-spawn": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz",
+      "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==",
       "dev": true,
       "requires": {
-        "is-primitive": "2.0.0"
+        "fromentries": "^1.2.0"
       }
     },
-    "is-extendable": {
-      "version": "0.1.1",
-      "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+    "progress": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
       "dev": true
     },
-    "is-extglob": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/is-extglob/download/is-extglob-1.0.0.tgz",
-      "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+    "promise": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+      "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "asap": "~2.0.3"
+      }
+    },
+    "promise-inflight": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
       "dev": true
     },
-    "is-finite": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/is-finite/download/is-finite-1.0.2.tgz",
-      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+    "promise-retry": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz",
+      "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=",
       "dev": true,
       "requires": {
-        "number-is-nan": "1.0.1"
+        "err-code": "^1.0.0",
+        "retry": "^0.10.0"
       }
     },
-    "is-fullwidth-code-point": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz",
-      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+    "promise-timeout": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/promise-timeout/-/promise-timeout-1.3.0.tgz",
+      "integrity": "sha512-5yANTE0tmi5++POym6OgtFmwfDvOXABD9oj/jLQr5GPEyuNEb7jH4wbbANJceJid49jwhi1RddxnhnEAb/doqg==",
+      "dev": true
+    },
+    "promzard": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz",
+      "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=",
       "dev": true,
       "requires": {
-        "number-is-nan": "1.0.1"
+        "read": "1"
       }
     },
-    "is-glob": {
-      "version": "2.0.1",
-      "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-2.0.1.tgz",
-      "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+    "proto-list": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+      "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=",
+      "dev": true
+    },
+    "protocols": {
+      "version": "1.4.7",
+      "resolved": "https://registry.npm.taobao.org/protocols/download/protocols-1.4.7.tgz",
+      "integrity": "sha1-lfeIpPDpebKR/+/PVjatET0DfTI=",
+      "dev": true
+    },
+    "protoduck": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npm.taobao.org/protoduck/download/protoduck-5.0.1.tgz",
+      "integrity": "sha1-A8NlnKGAB7aaUP2Cp+vMUWJhFR8=",
       "dev": true,
       "requires": {
-        "is-extglob": "1.0.0"
+        "genfun": "^5.0.0"
       }
     },
-    "is-my-json-valid": {
-      "version": "2.16.1",
-      "resolved": "http://registry.npm.taobao.org/is-my-json-valid/download/is-my-json-valid-2.16.1.tgz",
-      "integrity": "sha1-WoRnd+LCYg0eaRBOXToDsfYIjxE=",
+    "proxy-addr": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
+      "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
       "dev": true,
       "requires": {
-        "generate-function": "2.0.0",
-        "generate-object-property": "1.2.0",
-        "jsonpointer": "4.0.1",
-        "xtend": "4.0.1"
+        "forwarded": "~0.1.2",
+        "ipaddr.js": "1.9.1"
       }
     },
-    "is-number": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-2.1.0.tgz",
-      "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+    "prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
       "dev": true,
-      "requires": {
-        "kind-of": "3.2.2"
-      }
+      "optional": true
     },
-    "is-path-cwd": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/is-path-cwd/download/is-path-cwd-1.0.0.tgz",
-      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+    "psl": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+      "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
       "dev": true
     },
-    "is-path-in-cwd": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/is-path-in-cwd/download/is-path-in-cwd-1.0.0.tgz",
-      "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
-      "dev": true,
-      "requires": {
-        "is-path-inside": "1.0.0"
-      }
-    },
-    "is-path-inside": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/is-path-inside/download/is-path-inside-1.0.0.tgz",
-      "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=",
+    "pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz",
+      "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=",
       "dev": true,
       "requires": {
-        "path-is-inside": "1.0.2"
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
       }
     },
-    "is-plain-object": {
-      "version": "2.0.4",
-      "resolved": "http://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz",
-      "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=",
+    "pumpify": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz",
+      "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=",
       "dev": true,
       "requires": {
-        "isobject": "3.0.1"
+        "duplexify": "^3.6.0",
+        "inherits": "^2.0.3",
+        "pump": "^2.0.0"
       },
       "dependencies": {
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-          "dev": true
+        "pump": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz",
+          "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
         }
       }
     },
-    "is-posix-bracket": {
-      "version": "0.1.1",
-      "resolved": "http://registry.npm.taobao.org/is-posix-bracket/download/is-posix-bracket-0.1.1.tgz",
-      "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
       "dev": true
     },
-    "is-primitive": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/is-primitive/download/is-primitive-2.0.0.tgz",
-      "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+    "q": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
       "dev": true
     },
-    "is-property": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/is-property/download/is-property-1.0.2.tgz",
-      "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
+    "qs": {
+      "version": "6.5.2",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
       "dev": true
     },
-    "is-relative": {
-      "version": "0.2.1",
-      "resolved": "http://registry.npm.taobao.org/is-relative/download/is-relative-0.2.1.tgz",
-      "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=",
+    "quick-lru": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npm.taobao.org/quick-lru/download/quick-lru-4.0.1.tgz",
+      "integrity": "sha1-W4h48ROlgheEjGSCAmxz4bpXcn8=",
+      "dev": true
+    },
+    "ramda": {
+      "version": "0.14.0",
+      "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.14.0.tgz",
+      "integrity": "sha1-FJgUAGo5WzMHGsbq7FUzteJtZeg=",
+      "dev": true
+    },
+    "randomatic": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npm.taobao.org/randomatic/download/randomatic-3.1.1.tgz",
+      "integrity": "sha1-t3bvxZN1mE42xTey9RofCv8Noe0=",
       "dev": true,
+      "optional": true,
       "requires": {
-        "is-unc-path": "0.1.2"
+        "is-number": "^4.0.0",
+        "kind-of": "^6.0.0",
+        "math-random": "^1.0.1"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-4.0.0.tgz",
+          "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=",
+          "dev": true,
+          "optional": true
+        },
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz",
+          "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=",
+          "dev": true,
+          "optional": true
+        }
       }
     },
-    "is-resolvable": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/is-resolvable/download/is-resolvable-1.0.0.tgz",
-      "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=",
+    "range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "dev": true
+    },
+    "raw-body": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+      "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
       "dev": true,
       "requires": {
-        "tryit": "1.0.3"
+        "bytes": "3.1.0",
+        "http-errors": "1.7.2",
+        "iconv-lite": "0.4.24",
+        "unpipe": "1.0.0"
       }
     },
-    "is-typedarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+    "read": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
+      "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=",
       "dev": true,
-      "optional": true
+      "requires": {
+        "mute-stream": "~0.0.4"
+      }
     },
-    "is-unc-path": {
-      "version": "0.1.2",
-      "resolved": "http://registry.npm.taobao.org/is-unc-path/download/is-unc-path-0.1.2.tgz",
-      "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=",
+    "read-cmd-shim": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npm.taobao.org/read-cmd-shim/download/read-cmd-shim-1.0.5.tgz",
+      "integrity": "sha1-h+Q+ulAJi6WjLQzrWDq45DuWHBY=",
       "dev": true,
       "requires": {
-        "unc-path-regex": "0.1.2"
+        "graceful-fs": "^4.1.2"
       }
     },
-    "is-utf8": {
-      "version": "0.2.1",
-      "resolved": "http://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz",
-      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
-      "dev": true
+    "read-package-json": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npm.taobao.org/read-package-json/download/read-package-json-2.1.1.tgz",
+      "integrity": "sha1-FqpmxZ59Ta1iiPF53ZKV/Vm7mPE=",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.1",
+        "graceful-fs": "^4.1.2",
+        "json-parse-better-errors": "^1.0.1",
+        "normalize-package-data": "^2.0.0",
+        "npm-normalize-package-bin": "^1.0.0"
+      }
     },
-    "is-windows": {
-      "version": "0.2.0",
-      "resolved": "http://registry.npm.taobao.org/is-windows/download/is-windows-0.2.0.tgz",
-      "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=",
-      "dev": true
+    "read-package-tree": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npm.taobao.org/read-package-tree/download/read-package-tree-5.3.1.tgz",
+      "integrity": "sha1-oyy2TH8x64pvMe8G+c7fdAaP5jY=",
+      "dev": true,
+      "requires": {
+        "read-package-json": "^2.0.0",
+        "readdir-scoped-modules": "^1.0.0",
+        "util-promisify": "^2.1.0"
+      }
     },
-    "isarray": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-      "dev": true
+    "read-pkg": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz",
+      "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=",
+      "dev": true,
+      "requires": {
+        "normalize-package-data": "^2.3.2",
+        "parse-json": "^4.0.0",
+        "pify": "^3.0.0"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1"
+          }
+        },
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        }
+      }
     },
-    "isexe": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
+    "read-pkg-up": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-3.0.0.tgz",
+      "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
+      "dev": true,
+      "requires": {
+        "find-up": "^2.0.0",
+        "read-pkg": "^3.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz",
+          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^2.0.0"
+          }
+        },
+        "load-json-file": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/load-json-file/download/load-json-file-4.0.0.tgz",
+          "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "parse-json": "^4.0.0",
+            "pify": "^3.0.0",
+            "strip-bom": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz",
+          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^2.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-1.3.0.tgz",
+          "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=",
+          "dev": true,
+          "requires": {
+            "p-try": "^1.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz",
+          "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^1.1.0"
+          }
+        },
+        "p-try": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz",
+          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+          "dev": true
+        },
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        },
+        "read-pkg": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-3.0.0.tgz",
+          "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "^4.0.0",
+            "normalize-package-data": "^2.3.2",
+            "path-type": "^3.0.0"
+          }
+        }
+      }
     },
-    "isobject": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz",
-      "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+    "readable-stream": {
+      "version": "2.3.7",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
       "dev": true,
       "requires": {
-        "isarray": "1.0.0"
+        "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"
       }
     },
-    "isstream": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+    "readdir-scoped-modules": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/readdir-scoped-modules/download/readdir-scoped-modules-1.1.0.tgz",
+      "integrity": "sha1-jUVAe0+HCg3K68DihnDRjnRRQwk=",
       "dev": true,
-      "optional": true
+      "requires": {
+        "debuglog": "^1.0.1",
+        "dezalgo": "^1.0.0",
+        "graceful-fs": "^4.1.2",
+        "once": "^1.3.0"
+      }
     },
-    "istanbul": {
-      "version": "0.4.5",
-      "resolved": "http://registry.npm.taobao.org/istanbul/download/istanbul-0.4.5.tgz",
-      "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
+    "readdirp": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz",
+      "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=",
       "dev": true,
+      "optional": true,
       "requires": {
-        "abbrev": "1.0.9",
-        "async": "1.5.2",
-        "escodegen": "1.8.1",
-        "esprima": "2.7.3",
-        "glob": "5.0.15",
-        "handlebars": "4.0.10",
-        "js-yaml": "3.10.0",
-        "mkdirp": "0.5.1",
-        "nopt": "3.0.6",
-        "once": "1.4.0",
-        "resolve": "1.1.7",
-        "supports-color": "3.2.3",
-        "which": "1.3.0",
-        "wordwrap": "1.0.0"
+        "graceful-fs": "^4.1.11",
+        "micromatch": "^3.1.10",
+        "readable-stream": "^2.0.2"
       },
       "dependencies": {
-        "esprima": {
-          "version": "2.7.3",
-          "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-2.7.3.tgz",
-          "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
-          "dev": true
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+          "dev": true,
+          "optional": true
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+          "dev": true,
+          "optional": true
+        },
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz",
+          "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "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"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "expand-brackets": {
+          "version": "2.1.4",
+          "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz",
+          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "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"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "0.2.5",
+              "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
+              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "is-descriptor": "^0.1.0"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            },
+            "is-accessor-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz",
+              "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "kind-of": "^3.0.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "dev": true,
+                  "optional": true,
+                  "requires": {
+                    "is-buffer": "^1.1.5"
+                  }
+                }
+              }
+            },
+            "is-data-descriptor": {
+              "version": "0.1.4",
+              "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz",
+              "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "kind-of": "^3.0.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "dev": true,
+                  "optional": true,
+                  "requires": {
+                    "is-buffer": "^1.1.5"
+                  }
+                }
+              }
+            },
+            "is-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz",
+              "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "is-accessor-descriptor": "^0.1.6",
+                "is-data-descriptor": "^0.1.4",
+                "kind-of": "^5.0.0"
+              }
+            },
+            "kind-of": {
+              "version": "5.1.0",
+              "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz",
+              "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=",
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "extglob": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz",
+          "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "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"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz",
+              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "is-descriptor": "^1.0.0"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
         },
-        "glob": {
-          "version": "5.0.15",
-          "resolved": "http://registry.npm.taobao.org/glob/download/glob-5.0.15.tgz",
-          "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
           "dev": true,
+          "optional": true,
           "requires": {
-            "inflight": "1.0.6",
-            "inherits": "2.0.3",
-            "minimatch": "3.0.4",
-            "once": "1.4.0",
-            "path-is-absolute": "1.0.1"
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
           }
         },
-        "resolve": {
-          "version": "1.1.7",
-          "resolved": "http://registry.npm.taobao.org/resolve/download/resolve-1.1.7.tgz",
-          "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
-          "dev": true
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
         },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true,
+          "optional": true
+        },
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz",
+          "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=",
           "dev": true,
+          "optional": true
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz",
+          "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=",
+          "dev": true,
+          "optional": true,
           "requires": {
-            "has-flag": "1.0.0"
+            "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"
           }
         }
       }
     },
-    "js-tokens": {
-      "version": "3.0.2",
-      "resolved": "http://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz",
-      "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
-      "dev": true
-    },
-    "js-yaml": {
-      "version": "3.10.0",
-      "resolved": "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.10.0.tgz",
-      "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=",
+    "rechoir": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+      "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
       "dev": true,
       "requires": {
-        "argparse": "1.0.9",
-        "esprima": "4.0.0"
+        "resolve": "^1.1.6"
       }
     },
-    "jsbn": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+    "redent": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/redent/download/redent-3.0.0.tgz",
+      "integrity": "sha1-5Ve3mYMWu1PJ8fVvpiY1LGljBZ8=",
       "dev": true,
-      "optional": true
+      "requires": {
+        "indent-string": "^4.0.0",
+        "strip-indent": "^3.0.0"
+      }
     },
-    "jsesc": {
-      "version": "1.3.0",
-      "resolved": "http://registry.npm.taobao.org/jsesc/download/jsesc-1.3.0.tgz",
-      "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+    "regenerate": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
+      "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
       "dev": true
     },
-    "json-schema": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
-      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
-      "dev": true,
-      "optional": true
-    },
-    "json-stable-stringify": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/json-stable-stringify/download/json-stable-stringify-1.0.1.tgz",
-      "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+    "regenerate-unicode-properties": {
+      "version": "8.2.0",
+      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
+      "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
       "dev": true,
       "requires": {
-        "jsonify": "0.0.0"
+        "regenerate": "^1.4.0"
       }
     },
-    "json-stringify-safe": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
-      "dev": true,
-      "optional": true
-    },
-    "json3": {
-      "version": "3.3.2",
-      "resolved": "http://registry.npm.taobao.org/json3/download/json3-3.3.2.tgz",
-      "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
-      "dev": true
-    },
-    "json5": {
-      "version": "0.5.1",
-      "resolved": "http://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz",
-      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
-      "dev": true
-    },
-    "jsonify": {
-      "version": "0.0.0",
-      "resolved": "http://registry.npm.taobao.org/jsonify/download/jsonify-0.0.0.tgz",
-      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+    "regenerator-runtime": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
       "dev": true
     },
-    "jsonlint": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.2.tgz",
-      "integrity": "sha1-VzcEUIX1XrRVxosf9OvAG9UOiDA=",
+    "regenerator-transform": {
+      "version": "0.10.1",
+      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+      "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
       "dev": true,
       "requires": {
-        "JSV": "4.0.2",
-        "nomnom": "1.8.1"
+        "babel-runtime": "^6.18.0",
+        "babel-types": "^6.19.0",
+        "private": "^0.1.6"
       }
     },
-    "jsonpointer": {
-      "version": "4.0.1",
-      "resolved": "http://registry.npm.taobao.org/jsonpointer/download/jsonpointer-4.0.1.tgz",
-      "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
-      "dev": true
-    },
-    "jsprim": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
-      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+    "regex-cache": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npm.taobao.org/regex-cache/download/regex-cache-0.4.4.tgz",
+      "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=",
       "dev": true,
       "optional": true,
       "requires": {
-        "assert-plus": "1.0.0",
-        "extsprintf": "1.3.0",
-        "json-schema": "0.2.3",
-        "verror": "1.10.0"
-      },
-      "dependencies": {
-        "assert-plus": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
-          "dev": true,
-          "optional": true
-        }
+        "is-equal-shallow": "^0.1.3"
       }
     },
-    "kew": {
-      "version": "0.7.0",
-      "resolved": "http://registry.npm.taobao.org/kew/download/kew-0.7.0.tgz",
-      "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=",
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "regexpp": {
+      "version": "3.1.0",
+      "resolved": "http://r.tnpm.oa.com/regexpp/download/regexpp-3.1.0.tgz",
+      "integrity": "sha1-IG0K0KVkjP+9uK5GQ489xRyfeOI=",
       "dev": true
     },
-    "kind-of": {
-      "version": "3.2.2",
-      "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+    "regexpu-core": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+      "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
       "dev": true,
       "requires": {
-        "is-buffer": "1.1.5"
+        "regenerate": "^1.2.1",
+        "regjsgen": "^0.2.0",
+        "regjsparser": "^0.1.4"
       }
     },
-    "lazy-cache": {
-      "version": "1.0.4",
-      "resolved": "http://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz",
-      "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
+    "regjsgen": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+      "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
       "dev": true
     },
-    "lerna": {
-      "version": "2.0.0-beta.31",
-      "resolved": "http://registry.npm.taobao.org/lerna/download/lerna-2.0.0-beta.31.tgz",
-      "integrity": "sha1-aNpTuGD4GT1GU6bQYB7zALjXF20=",
-      "dev": true,
-      "requires": {
-        "async": "1.5.2",
-        "chalk": "1.1.3",
-        "cmd-shim": "2.0.2",
-        "command-join": "1.1.1",
-        "cross-spawn": "4.0.2",
-        "glob": "7.1.2",
-        "inquirer": "0.12.0",
-        "lodash.find": "4.6.0",
-        "lodash.unionwith": "4.6.0",
-        "meow": "3.7.0",
-        "minimatch": "3.0.4",
-        "mkdirp": "0.5.1",
-        "normalize-path": "2.1.1",
-        "object-assign": "4.1.1",
-        "object-assign-sorted": "1.0.0",
-        "pad": "1.1.0",
-        "path-exists": "2.1.0",
-        "progress": "1.1.8",
-        "read-cmd-shim": "1.0.1",
-        "rimraf": "2.6.2",
-        "semver": "5.4.1",
-        "signal-exit": "2.1.2",
-        "sync-exec": "0.6.2"
+    "regjsparser": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+      "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+      "dev": true,
+      "requires": {
+        "jsesc": "~0.5.0"
       },
       "dependencies": {
-        "semver": {
-          "version": "5.4.1",
-          "resolved": "http://registry.npm.taobao.org/semver/download/semver-5.4.1.tgz",
-          "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=",
+        "jsesc": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
           "dev": true
         }
       }
     },
-    "less": {
-      "version": "2.7.3",
-      "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz",
-      "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==",
+    "release-zalgo": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
+      "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=",
       "dev": true,
       "requires": {
-        "errno": "0.1.4",
-        "graceful-fs": "4.1.11",
-        "image-size": "0.5.5",
-        "mime": "1.3.4",
-        "mkdirp": "0.5.1",
-        "promise": "7.3.1",
-        "request": "2.81.0",
-        "source-map": "0.5.7"
+        "es6-error": "^4.0.1"
       }
     },
-    "levn": {
-      "version": "0.3.0",
-      "resolved": "http://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz",
-      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+    "remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
       "dev": true,
-      "requires": {
-        "prelude-ls": "1.1.2",
-        "type-check": "0.3.2"
-      }
+      "optional": true
     },
-    "liftoff": {
-      "version": "2.3.0",
-      "resolved": "http://registry.npm.taobao.org/liftoff/download/liftoff-2.3.0.tgz",
-      "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=",
-      "dev": true,
-      "requires": {
-        "extend": "3.0.1",
-        "findup-sync": "0.4.3",
-        "fined": "1.1.0",
-        "flagged-respawn": "0.3.2",
-        "lodash.isplainobject": "4.0.6",
-        "lodash.isstring": "4.0.1",
-        "lodash.mapvalues": "4.6.0",
-        "rechoir": "0.6.2",
-        "resolve": "1.4.0"
-      }
+    "repeat-element": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+      "dev": true
     },
-    "line-ending-corrector": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/line-ending-corrector/download/line-ending-corrector-1.0.0.tgz",
-      "integrity": "sha1-sTze+K02ruwCofZ3YhxBvQJTvZs=",
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+      "dev": true
+    },
+    "repeating": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
       "dev": true,
       "requires": {
-        "coffee-script": "1.12.7"
+        "is-finite": "^1.0.0"
       }
     },
-    "load-json-file": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz",
-      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+    "replace-in-file": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-4.3.1.tgz",
+      "integrity": "sha512-FqVvfmpqGTD2JRGI1JjJ86b24P17x/WWwGdxExeyJxnh/2rVQz2+jXfD1507UnnhEQw092X0u0DPCBf1WC4ooQ==",
       "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11",
-        "parse-json": "2.2.0",
-        "pify": "2.3.0",
-        "pinkie-promise": "2.0.1",
-        "strip-bom": "2.0.0"
+        "chalk": "^2.4.2",
+        "glob": "^7.1.6",
+        "yargs": "^15.0.2"
       },
       "dependencies": {
-        "strip-bom": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+          "dev": true
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "cliui": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+          "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+          "dev": true,
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^6.2.0"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "get-caller-file": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+          "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
+        "require-main-filename": {
           "version": "2.0.0",
-          "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz",
-          "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+          "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+          "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        },
+        "which-module": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+          "dev": true
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          },
+          "dependencies": {
+            "ansi-styles": {
+              "version": "4.2.1",
+              "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+              "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+              "dev": true,
+              "requires": {
+                "@types/color-name": "^1.1.1",
+                "color-convert": "^2.0.1"
+              }
+            },
+            "color-convert": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+              "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+              "dev": true,
+              "requires": {
+                "color-name": "~1.1.4"
+              }
+            }
+          }
+        },
+        "yargs": {
+          "version": "15.3.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
+          "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
+          "dev": true,
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.1"
+          }
+        },
+        "yargs-parser": {
+          "version": "18.1.2",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz",
+          "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==",
           "dev": true,
           "requires": {
-            "is-utf8": "0.2.1"
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
           }
         }
       }
     },
-    "lodash": {
-      "version": "4.17.4",
-      "resolved": "http://registry.npm.taobao.org/lodash/download/lodash-4.17.4.tgz",
-      "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
-      "dev": true
-    },
-    "lodash._baseassign": {
-      "version": "3.2.0",
-      "resolved": "http://registry.npm.taobao.org/lodash._baseassign/download/lodash._baseassign-3.2.0.tgz",
-      "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
-      "dev": true,
-      "requires": {
-        "lodash._basecopy": "3.0.1",
-        "lodash.keys": "3.1.2"
-      }
-    },
-    "lodash._basecopy": {
-      "version": "3.0.1",
-      "resolved": "http://registry.npm.taobao.org/lodash._basecopy/download/lodash._basecopy-3.0.1.tgz",
-      "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
-      "dev": true
-    },
-    "lodash._basecreate": {
-      "version": "3.0.3",
-      "resolved": "http://registry.npm.taobao.org/lodash._basecreate/download/lodash._basecreate-3.0.3.tgz",
-      "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=",
-      "dev": true
-    },
-    "lodash._basetostring": {
-      "version": "3.0.1",
-      "resolved": "http://registry.npm.taobao.org/lodash._basetostring/download/lodash._basetostring-3.0.1.tgz",
-      "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=",
-      "dev": true
-    },
-    "lodash._basevalues": {
-      "version": "3.0.0",
-      "resolved": "http://registry.npm.taobao.org/lodash._basevalues/download/lodash._basevalues-3.0.0.tgz",
-      "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=",
-      "dev": true
-    },
-    "lodash._getnative": {
-      "version": "3.9.1",
-      "resolved": "http://registry.npm.taobao.org/lodash._getnative/download/lodash._getnative-3.9.1.tgz",
-      "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
-      "dev": true
-    },
-    "lodash._isiterateecall": {
-      "version": "3.0.9",
-      "resolved": "http://registry.npm.taobao.org/lodash._isiterateecall/download/lodash._isiterateecall-3.0.9.tgz",
-      "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
-      "dev": true
-    },
-    "lodash._reescape": {
-      "version": "3.0.0",
-      "resolved": "http://registry.npm.taobao.org/lodash._reescape/download/lodash._reescape-3.0.0.tgz",
-      "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=",
-      "dev": true
-    },
-    "lodash._reevaluate": {
-      "version": "3.0.0",
-      "resolved": "http://registry.npm.taobao.org/lodash._reevaluate/download/lodash._reevaluate-3.0.0.tgz",
-      "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=",
-      "dev": true
-    },
-    "lodash._reinterpolate": {
-      "version": "3.0.0",
-      "resolved": "http://registry.npm.taobao.org/lodash._reinterpolate/download/lodash._reinterpolate-3.0.0.tgz",
-      "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
-      "dev": true
-    },
-    "lodash._root": {
-      "version": "3.0.1",
-      "resolved": "http://registry.npm.taobao.org/lodash._root/download/lodash._root-3.0.1.tgz",
-      "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=",
-      "dev": true
-    },
-    "lodash.clone": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
-      "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=",
+    "request": {
+      "version": "2.88.2",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+      "dev": true,
+      "requires": {
+        "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.3",
+        "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.5.0",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^3.3.2"
+      }
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
       "dev": true
     },
-    "lodash.create": {
-      "version": "3.1.1",
-      "resolved": "http://registry.npm.taobao.org/lodash.create/download/lodash.create-3.1.1.tgz",
-      "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=",
+    "resolve": {
+      "version": "1.15.1",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+      "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
       "dev": true,
       "requires": {
-        "lodash._baseassign": "3.2.0",
-        "lodash._basecreate": "3.0.3",
-        "lodash._isiterateecall": "3.0.9"
+        "path-parse": "^1.0.6"
       }
     },
-    "lodash.defaults": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
-      "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
-      "dev": true
-    },
-    "lodash.escape": {
-      "version": "3.2.0",
-      "resolved": "http://registry.npm.taobao.org/lodash.escape/download/lodash.escape-3.2.0.tgz",
-      "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
+    "resolve-cwd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
+      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
       "dev": true,
       "requires": {
-        "lodash._root": "3.0.1"
+        "resolve-from": "^3.0.0"
+      },
+      "dependencies": {
+        "resolve-from": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+          "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+          "dev": true
+        }
       }
     },
-    "lodash.find": {
-      "version": "4.6.0",
-      "resolved": "http://registry.npm.taobao.org/lodash.find/download/lodash.find-4.6.0.tgz",
-      "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=",
-      "dev": true
-    },
-    "lodash.flatten": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
-      "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=",
-      "dev": true
-    },
-    "lodash.isarguments": {
-      "version": "3.1.0",
-      "resolved": "http://registry.npm.taobao.org/lodash.isarguments/download/lodash.isarguments-3.1.0.tgz",
-      "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
-      "dev": true
-    },
-    "lodash.isarray": {
-      "version": "3.0.4",
-      "resolved": "http://registry.npm.taobao.org/lodash.isarray/download/lodash.isarray-3.0.4.tgz",
-      "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
-      "dev": true
-    },
-    "lodash.isplainobject": {
-      "version": "4.0.6",
-      "resolved": "http://registry.npm.taobao.org/lodash.isplainobject/download/lodash.isplainobject-4.0.6.tgz",
-      "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
-      "dev": true
-    },
-    "lodash.isstring": {
-      "version": "4.0.1",
-      "resolved": "http://registry.npm.taobao.org/lodash.isstring/download/lodash.isstring-4.0.1.tgz",
-      "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=",
-      "dev": true
-    },
-    "lodash.keys": {
-      "version": "3.1.2",
-      "resolved": "http://registry.npm.taobao.org/lodash.keys/download/lodash.keys-3.1.2.tgz",
-      "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+    "resolve-dir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+      "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
       "dev": true,
       "requires": {
-        "lodash._getnative": "3.9.1",
-        "lodash.isarguments": "3.1.0",
-        "lodash.isarray": "3.0.4"
+        "expand-tilde": "^2.0.0",
+        "global-modules": "^1.0.0"
       }
     },
-    "lodash.mapvalues": {
-      "version": "4.6.0",
-      "resolved": "http://registry.npm.taobao.org/lodash.mapvalues/download/lodash.mapvalues-4.6.0.tgz",
-      "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=",
-      "dev": true
-    },
-    "lodash.merge": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz",
-      "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=",
-      "dev": true
-    },
-    "lodash.partialright": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz",
-      "integrity": "sha1-ATDYDoM2MmTUAHTzKbij56ihzEs=",
-      "dev": true
-    },
-    "lodash.pick": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
-      "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=",
+    "resolve-from": {
+      "version": "4.0.0",
+      "resolved": "http://r.tnpm.oa.com/resolve-from/download/resolve-from-4.0.0.tgz",
+      "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=",
       "dev": true
     },
-    "lodash.restparam": {
-      "version": "3.6.1",
-      "resolved": "http://registry.npm.taobao.org/lodash.restparam/download/lodash.restparam-3.6.1.tgz",
-      "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=",
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
       "dev": true
     },
-    "lodash.template": {
-      "version": "3.6.2",
-      "resolved": "http://registry.npm.taobao.org/lodash.template/download/lodash.template-3.6.2.tgz",
-      "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
+    "restore-cursor": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+      "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
       "dev": true,
       "requires": {
-        "lodash._basecopy": "3.0.1",
-        "lodash._basetostring": "3.0.1",
-        "lodash._basevalues": "3.0.0",
-        "lodash._isiterateecall": "3.0.9",
-        "lodash._reinterpolate": "3.0.0",
-        "lodash.escape": "3.2.0",
-        "lodash.keys": "3.1.2",
-        "lodash.restparam": "3.6.1",
-        "lodash.templatesettings": "3.1.1"
+        "onetime": "^2.0.0",
+        "signal-exit": "^3.0.2"
       }
     },
-    "lodash.templatesettings": {
-      "version": "3.1.1",
-      "resolved": "http://registry.npm.taobao.org/lodash.templatesettings/download/lodash.templatesettings-3.1.1.tgz",
-      "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
+    "resumer": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz",
+      "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=",
       "dev": true,
       "requires": {
-        "lodash._reinterpolate": "3.0.0",
-        "lodash.escape": "3.2.0"
+        "through": "~2.3.4"
       }
     },
-    "lodash.unionwith": {
-      "version": "4.6.0",
-      "resolved": "http://registry.npm.taobao.org/lodash.unionwith/download/lodash.unionwith-4.6.0.tgz",
-      "integrity": "sha1-dNFAtcqBRubGQ8NyT1FSU42awfA=",
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
       "dev": true
     },
-    "lodash.uniq": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
-      "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
+    "retry": {
+      "version": "0.10.1",
+      "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz",
+      "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=",
       "dev": true
     },
-    "longest": {
+    "right-pad": {
       "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz",
-      "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
+      "resolved": "https://registry.npmjs.org/right-pad/-/right-pad-1.0.1.tgz",
+      "integrity": "sha1-jKCMLLtbVedNr6lr9/0aJ9VoyNA=",
       "dev": true
     },
-    "loose-envify": {
-      "version": "1.3.1",
-      "resolved": "http://registry.npm.taobao.org/loose-envify/download/loose-envify-1.3.1.tgz",
-      "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+    "rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-3.0.2.tgz?cache=0&sync_timestamp=1581257110269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-3.0.2.tgz",
+      "integrity": "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=",
       "dev": true,
       "requires": {
-        "js-tokens": "3.0.2"
+        "glob": "^7.1.3"
       }
     },
-    "loud-rejection": {
-      "version": "1.6.0",
-      "resolved": "http://registry.npm.taobao.org/loud-rejection/download/loud-rejection-1.6.0.tgz",
-      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+    "rollup": {
+      "version": "0.56.5",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.56.5.tgz",
+      "integrity": "sha512-IGPk5vdWrsc4vkiW9XMeXr5QMtxmvATTttTi59w2jBQWe9G/MMQtn8teIBAj+DdK51TrpVT6P0aQUaQUlUYCJA==",
+      "dev": true
+    },
+    "rollup-plugin-buble": {
+      "version": "0.19.8",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-buble/-/rollup-plugin-buble-0.19.8.tgz",
+      "integrity": "sha512-8J4zPk2DQdk3rxeZvxgzhHh/rm5nJkjwgcsUYisCQg1QbT5yagW+hehYEW7ZNns/NVbDCTv4JQ7h4fC8qKGOKw==",
       "dev": true,
       "requires": {
-        "currently-unhandled": "0.4.1",
-        "signal-exit": "3.0.2"
-      },
-      "dependencies": {
-        "signal-exit": {
-          "version": "3.0.2",
-          "resolved": "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz",
-          "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
-          "dev": true
-        }
+        "buble": "^0.19.8",
+        "rollup-pluginutils": "^2.3.3"
       }
     },
-    "lru-cache": {
-      "version": "2.7.3",
-      "resolved": "http://registry.npm.taobao.org/lru-cache/download/lru-cache-2.7.3.tgz",
-      "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
-      "dev": true
-    },
-    "map-cache": {
-      "version": "0.2.2",
-      "resolved": "http://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz",
-      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
-      "dev": true
-    },
-    "map-obj": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/map-obj/download/map-obj-1.0.1.tgz",
-      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
-      "dev": true
-    },
-    "meow": {
-      "version": "3.7.0",
-      "resolved": "http://registry.npm.taobao.org/meow/download/meow-3.7.0.tgz",
-      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+    "rollup-plugin-replace": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz",
+      "integrity": "sha512-/5bxtUPkDHyBJAKketb4NfaeZjL5yLZdeUihSfbF2PQMz+rSTEb8ARKoOl3UBT4m7/X+QOXJo3sLTcq+yMMYTA==",
       "dev": true,
       "requires": {
-        "camelcase-keys": "2.1.0",
-        "decamelize": "1.2.0",
-        "loud-rejection": "1.6.0",
-        "map-obj": "1.0.1",
-        "minimist": "1.2.0",
-        "normalize-package-data": "2.4.0",
-        "object-assign": "4.1.1",
-        "read-pkg-up": "1.0.1",
-        "redent": "1.0.0",
-        "trim-newlines": "1.0.0"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true
-        }
+        "magic-string": "^0.25.2",
+        "rollup-pluginutils": "^2.6.0"
       }
     },
-    "merge-stream": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/merge-stream/download/merge-stream-1.0.1.tgz",
-      "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
+    "rollup-pluginutils": {
+      "version": "2.8.2",
+      "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
+      "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
       "dev": true,
       "requires": {
-        "readable-stream": "2.3.3"
+        "estree-walker": "^0.6.1"
       }
     },
-    "micromatch": {
-      "version": "2.3.11",
-      "resolved": "http://registry.npm.taobao.org/micromatch/download/micromatch-2.3.11.tgz",
-      "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+    "run-async": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz",
+      "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==",
       "dev": true,
       "requires": {
-        "arr-diff": "2.0.0",
-        "array-unique": "0.2.1",
-        "braces": "1.8.5",
-        "expand-brackets": "0.1.5",
-        "extglob": "0.3.2",
-        "filename-regex": "2.0.1",
-        "is-extglob": "1.0.0",
-        "is-glob": "2.0.1",
-        "kind-of": "3.2.2",
-        "normalize-path": "2.1.1",
-        "object.omit": "2.0.1",
-        "parse-glob": "3.0.4",
-        "regex-cache": "0.4.4"
+        "is-promise": "^2.1.0"
       }
     },
-    "mime": {
-      "version": "1.3.4",
-      "resolved": "http://registry.npm.taobao.org/mime/download/mime-1.3.4.tgz",
-      "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=",
-      "dev": true
-    },
-    "mime-db": {
-      "version": "1.30.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
-      "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=",
+    "run-node": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz",
+      "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==",
       "dev": true
     },
-    "mime-types": {
-      "version": "2.1.17",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
-      "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
+    "run-queue": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
+      "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
       "dev": true,
       "requires": {
-        "mime-db": "1.30.0"
+        "aproba": "^1.1.1"
       }
     },
-    "minimatch": {
-      "version": "3.0.4",
-      "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz",
-      "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
+    "rxjs": {
+      "version": "6.5.5",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
+      "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
       "dev": true,
       "requires": {
-        "brace-expansion": "1.1.8"
+        "tslib": "^1.9.0"
       }
     },
-    "minimist": {
-      "version": "0.0.8",
-      "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz",
-      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
       "dev": true
     },
-    "mkdirp": {
-      "version": "0.5.1",
-      "resolved": "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz",
-      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
       "dev": true,
       "requires": {
-        "minimist": "0.0.8"
+        "ret": "~0.1.10"
       }
     },
-    "mkpath": {
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true
+    },
+    "semver": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+      "dev": true
+    },
+    "semver-compare": {
       "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/mkpath/download/mkpath-1.0.0.tgz",
-      "integrity": "sha1-67Opd+evHGg65v2hK1Raa6bFhT0=",
+      "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+      "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
       "dev": true
     },
-    "mocha": {
-      "version": "3.5.3",
-      "resolved": "http://registry.npm.taobao.org/mocha/download/mocha-3.5.3.tgz",
-      "integrity": "sha1-HgSA/jbS2lhY0etqzDhBiybqog0=",
+    "semver-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz",
+      "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=",
+      "dev": true
+    },
+    "send": {
+      "version": "0.17.1",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+      "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "destroy": "~1.0.4",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "~1.7.2",
+        "mime": "1.6.0",
+        "ms": "2.1.1",
+        "on-finished": "~2.3.0",
+        "range-parser": "~1.2.1",
+        "statuses": "~1.5.0"
+      },
+      "dependencies": {
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+          "dev": true
+        }
+      }
+    },
+    "serve-index": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
       "dev": true,
       "requires": {
-        "browser-stdout": "1.3.0",
-        "commander": "2.9.0",
-        "debug": "2.6.8",
-        "diff": "3.2.0",
-        "escape-string-regexp": "1.0.5",
-        "glob": "7.1.1",
-        "growl": "1.9.2",
-        "he": "1.1.1",
-        "json3": "3.3.2",
-        "lodash.create": "3.1.1",
-        "mkdirp": "0.5.1",
-        "supports-color": "3.1.2"
+        "accepts": "~1.3.4",
+        "batch": "0.6.1",
+        "debug": "2.6.9",
+        "escape-html": "~1.0.3",
+        "http-errors": "~1.6.2",
+        "mime-types": "~2.1.17",
+        "parseurl": "~1.3.2"
       },
       "dependencies": {
-        "commander": {
-          "version": "2.9.0",
-          "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.9.0.tgz",
-          "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
-          "dev": true,
-          "requires": {
-            "graceful-readlink": "1.0.1"
-          }
-        },
-        "glob": {
-          "version": "7.1.1",
-          "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.1.tgz",
-          "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=",
+        "http-errors": {
+          "version": "1.6.3",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+          "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
           "dev": true,
           "requires": {
-            "fs.realpath": "1.0.0",
-            "inflight": "1.0.6",
+            "depd": "~1.1.2",
             "inherits": "2.0.3",
-            "minimatch": "3.0.4",
-            "once": "1.4.0",
-            "path-is-absolute": "1.0.1"
+            "setprototypeof": "1.1.0",
+            "statuses": ">= 1.4.0 < 2"
           }
         },
-        "supports-color": {
-          "version": "3.1.2",
-          "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-3.1.2.tgz",
-          "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=",
-          "dev": true,
-          "requires": {
-            "has-flag": "1.0.0"
-          }
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        },
+        "setprototypeof": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+          "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+          "dev": true
         }
       }
     },
-    "ms": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "multipipe": {
-      "version": "0.1.2",
-      "resolved": "http://registry.npm.taobao.org/multipipe/download/multipipe-0.1.2.tgz",
-      "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
+    "serve-static": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+      "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
       "dev": true,
       "requires": {
-        "duplexer2": "0.0.2"
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.17.1"
       }
     },
-    "mute-stream": {
-      "version": "0.0.5",
-      "resolved": "http://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.5.tgz",
-      "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=",
-      "dev": true
-    },
-    "natives": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/natives/download/natives-1.1.0.tgz",
-      "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=",
-      "dev": true
-    },
-    "natural-compare": {
-      "version": "1.4.0",
-      "resolved": "http://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz",
-      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
       "dev": true
     },
-    "nomnom": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
-      "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=",
+    "set-value": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
       "dev": true,
       "requires": {
-        "chalk": "0.4.0",
-        "underscore": "1.6.0"
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
       },
       "dependencies": {
-        "ansi-styles": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz",
-          "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=",
-          "dev": true
-        },
-        "chalk": {
-          "version": "0.4.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz",
-          "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=",
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
           "dev": true,
           "requires": {
-            "ansi-styles": "1.0.0",
-            "has-color": "0.1.7",
-            "strip-ansi": "0.1.1"
+            "is-extendable": "^0.1.0"
           }
-        },
-        "strip-ansi": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz",
-          "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=",
-          "dev": true
         }
       }
     },
-    "nopt": {
-      "version": "3.0.6",
-      "resolved": "http://registry.npm.taobao.org/nopt/download/nopt-3.0.6.tgz",
-      "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
-      "dev": true,
-      "requires": {
-        "abbrev": "1.0.9"
-      }
+    "setprototypeof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+      "dev": true
     },
-    "normalize-package-data": {
-      "version": "2.4.0",
-      "resolved": "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.4.0.tgz",
-      "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=",
+    "shallow-clone": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npm.taobao.org/shallow-clone/download/shallow-clone-3.0.1.tgz",
+      "integrity": "sha1-jymBrZJTH1UDWwH7IwdppA4C76M=",
       "dev": true,
       "requires": {
-        "hosted-git-info": "2.5.0",
-        "is-builtin-module": "1.0.0",
-        "semver": "4.3.6",
-        "validate-npm-package-license": "3.0.1"
+        "kind-of": "^6.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz",
+          "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=",
+          "dev": true
+        }
       }
     },
-    "normalize-path": {
-      "version": "2.1.1",
-      "resolved": "http://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz",
-      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+    "shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
       "dev": true,
       "requires": {
-        "remove-trailing-separator": "1.1.0"
+        "shebang-regex": "^1.0.0"
       }
     },
-    "number-is-nan": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz",
-      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+    "shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
       "dev": true
     },
-    "oauth-sign": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
-      "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
+    "shelljs": {
+      "version": "0.7.6",
+      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.6.tgz",
+      "integrity": "sha1-N5zM+1a5HIYB5HkzVutTgpJN6a0=",
       "dev": true,
-      "optional": true
+      "requires": {
+        "glob": "^7.0.0",
+        "interpret": "^1.0.0",
+        "rechoir": "^0.6.2"
+      }
     },
-    "object-assign": {
-      "version": "4.1.1",
-      "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+    "signal-exit": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
       "dev": true
     },
-    "object-assign-sorted": {
+    "slash": {
       "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/object-assign-sorted/download/object-assign-sorted-1.0.0.tgz",
-      "integrity": "sha1-5zn2mBZAFOwfBQ843sq60emyKL8=",
-      "dev": true,
-      "requires": {
-        "object-assign": "4.1.1",
-        "sorted-object": "2.0.1"
-      }
+      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+      "dev": true
     },
-    "object.defaults": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/object.defaults/download/object.defaults-1.1.0.tgz",
-      "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+    "slice-ansi": {
+      "version": "2.1.0",
+      "resolved": "http://r.tnpm.oa.com/slice-ansi/download/slice-ansi-2.1.0.tgz",
+      "integrity": "sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY=",
       "dev": true,
       "requires": {
-        "array-each": "1.0.1",
-        "array-slice": "1.0.0",
-        "for-own": "1.0.0",
-        "isobject": "3.0.1"
+        "ansi-styles": "^3.2.0",
+        "astral-regex": "^1.0.0",
+        "is-fullwidth-code-point": "^2.0.0"
       },
       "dependencies": {
-        "for-own": {
-          "version": "1.0.0",
-          "resolved": "http://registry.npm.taobao.org/for-own/download/for-own-1.0.0.tgz",
-          "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "http://r.tnpm.oa.com/ansi-styles/download/ansi-styles-3.2.1.tgz",
+          "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
           "dev": true,
           "requires": {
-            "for-in": "1.0.2"
+            "color-convert": "^1.9.0"
           }
-        },
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-          "dev": true
         }
       }
     },
-    "object.omit": {
-      "version": "2.0.1",
-      "resolved": "http://registry.npm.taobao.org/object.omit/download/object.omit-2.0.1.tgz",
-      "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
-      "dev": true,
-      "requires": {
-        "for-own": "0.1.5",
-        "is-extendable": "0.1.1"
+    "slide": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
+      "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=",
+      "dev": true
+    },
+    "smart-buffer": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npm.taobao.org/smart-buffer/download/smart-buffer-4.1.0.tgz",
+      "integrity": "sha1-kWBcJdkWUvRmHqacz0XxszHKIbo=",
+      "dev": true
+    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
       }
     },
-    "object.pick": {
-      "version": "1.3.0",
-      "resolved": "http://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz",
-      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
       "dev": true,
       "requires": {
-        "isobject": "3.0.1"
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
       },
       "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        },
         "isobject": {
           "version": "3.0.1",
-          "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
           "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
           "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+          "dev": true
         }
       }
     },
-    "on-finished": {
-      "version": "2.3.0",
-      "resolved": "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz",
-      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
       "dev": true,
       "requires": {
-        "ee-first": "1.1.1"
+        "kind-of": "^3.2.0"
       }
     },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+    "socks": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npm.taobao.org/socks/download/socks-2.3.3.tgz",
+      "integrity": "sha1-ARKfCl1TTSuJdxLtis6rfuZdeOM=",
       "dev": true,
       "requires": {
-        "wrappy": "1.0.2"
+        "ip": "1.1.5",
+        "smart-buffer": "^4.1.0"
       }
     },
-    "onetime": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/onetime/download/onetime-1.1.0.tgz",
-      "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
-      "dev": true
-    },
-    "optimist": {
-      "version": "0.6.1",
-      "resolved": "http://registry.npm.taobao.org/optimist/download/optimist-0.6.1.tgz",
-      "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+    "socks-proxy-agent": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npm.taobao.org/socks-proxy-agent/download/socks-proxy-agent-4.0.2.tgz?cache=0&sync_timestamp=1580845554635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsocks-proxy-agent%2Fdownload%2Fsocks-proxy-agent-4.0.2.tgz",
+      "integrity": "sha1-PImR8xRbJ5nnDhG9X7yLGWMRY4Y=",
       "dev": true,
       "requires": {
-        "minimist": "0.0.8",
-        "wordwrap": "0.0.3"
+        "agent-base": "~4.2.1",
+        "socks": "~2.3.2"
       },
       "dependencies": {
-        "wordwrap": {
-          "version": "0.0.3",
-          "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz",
-          "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
-          "dev": true
+        "agent-base": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npm.taobao.org/agent-base/download/agent-base-4.2.1.tgz",
+          "integrity": "sha1-2J5ZmfeXh1Z0wH2H8mD8Qeg+jKk=",
+          "dev": true,
+          "requires": {
+            "es6-promisify": "^5.0.0"
+          }
         }
       }
     },
-    "optionator": {
-      "version": "0.8.2",
-      "resolved": "http://registry.npm.taobao.org/optionator/download/optionator-0.8.2.tgz",
-      "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+    "sort-keys": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
+      "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=",
       "dev": true,
       "requires": {
-        "deep-is": "0.1.3",
-        "fast-levenshtein": "2.0.6",
-        "levn": "0.3.0",
-        "prelude-ls": "1.1.2",
-        "type-check": "0.3.2",
-        "wordwrap": "1.0.0"
+        "is-plain-obj": "^1.0.0"
       }
     },
-    "orchestrator": {
-      "version": "0.3.8",
-      "resolved": "http://registry.npm.taobao.org/orchestrator/download/orchestrator-0.3.8.tgz",
-      "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=",
+    "source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+      "dev": true
+    },
+    "source-map-resolve": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
       "dev": true,
       "requires": {
-        "end-of-stream": "0.1.5",
-        "sequencify": "0.0.7",
-        "stream-consume": "0.1.0"
+        "atob": "^2.1.2",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
       }
     },
-    "ordered-read-streams": {
-      "version": "0.1.0",
-      "resolved": "http://registry.npm.taobao.org/ordered-read-streams/download/ordered-read-streams-0.1.0.tgz",
-      "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=",
-      "dev": true
-    },
-    "os-homedir": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz",
-      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
-      "dev": true
-    },
-    "os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
-      "dev": true
-    },
-    "output-file-sync": {
-      "version": "1.1.2",
-      "resolved": "http://registry.npm.taobao.org/output-file-sync/download/output-file-sync-1.1.2.tgz",
-      "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=",
+    "source-map-support": {
+      "version": "0.4.18",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+      "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
       "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11",
-        "mkdirp": "0.5.1",
-        "object-assign": "4.1.1"
+        "source-map": "^0.5.6"
       }
     },
-    "pad": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/pad/download/pad-1.1.0.tgz",
-      "integrity": "sha1-en0YUgDrrDL58S7nVsOh0IezGQs=",
+    "source-map-url": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
       "dev": true
     },
-    "parse-filepath": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/parse-filepath/download/parse-filepath-1.0.1.tgz",
-      "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=",
-      "dev": true,
-      "requires": {
-        "is-absolute": "0.2.6",
-        "map-cache": "0.2.2",
-        "path-root": "0.1.1"
-      }
+    "sourcemap-codec": {
+      "version": "1.4.8",
+      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+      "dev": true
     },
-    "parse-glob": {
-      "version": "3.0.4",
-      "resolved": "http://registry.npm.taobao.org/parse-glob/download/parse-glob-3.0.4.tgz",
-      "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+    "spawn-wrap": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz",
+      "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==",
       "dev": true,
       "requires": {
-        "glob-base": "0.3.0",
-        "is-dotfile": "1.0.3",
-        "is-extglob": "1.0.0",
-        "is-glob": "2.0.1"
+        "foreground-child": "^2.0.0",
+        "is-windows": "^1.0.2",
+        "make-dir": "^3.0.0",
+        "rimraf": "^3.0.0",
+        "signal-exit": "^3.0.2",
+        "which": "^2.0.1"
+      },
+      "dependencies": {
+        "make-dir": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz",
+          "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==",
+          "dev": true,
+          "requires": {
+            "semver": "^6.0.0"
+          }
+        },
+        "rimraf": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
       }
     },
-    "parse-json": {
-      "version": "2.2.0",
-      "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz",
-      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+    "spdx-correct": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
+      "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
       "dev": true,
       "requires": {
-        "error-ex": "1.3.1"
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
       }
     },
-    "parse-passwd": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/parse-passwd/download/parse-passwd-1.0.0.tgz",
-      "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
-      "dev": true
-    },
-    "parseurl": {
-      "version": "1.3.2",
-      "resolved": "http://registry.npm.taobao.org/parseurl/download/parseurl-1.3.2.tgz",
-      "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
-      "dev": true
-    },
-    "path-dirname": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz",
-      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+    "spdx-exceptions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
+      "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
       "dev": true
     },
-    "path-exists": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz",
-      "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+    "spdx-expression-parse": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+      "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
       "dev": true,
       "requires": {
-        "pinkie-promise": "2.0.1"
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
       }
     },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true
-    },
-    "path-is-inside": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz",
-      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
-      "dev": true
-    },
-    "path-parse": {
-      "version": "1.0.5",
-      "resolved": "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.5.tgz",
-      "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+    "spdx-license-ids": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
+      "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
       "dev": true
     },
-    "path-root": {
-      "version": "0.1.1",
-      "resolved": "http://registry.npm.taobao.org/path-root/download/path-root-0.1.1.tgz",
-      "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+    "split": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
+      "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
       "dev": true,
       "requires": {
-        "path-root-regex": "0.1.2"
+        "through": "2"
       }
     },
-    "path-root-regex": {
-      "version": "0.1.2",
-      "resolved": "http://registry.npm.taobao.org/path-root-regex/download/path-root-regex-0.1.2.tgz",
-      "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
-      "dev": true
-    },
-    "path-type": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz",
-      "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
       "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11",
-        "pify": "2.3.0",
-        "pinkie-promise": "2.0.1"
+        "extend-shallow": "^3.0.0"
       }
     },
-    "performance-now": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
-      "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=",
-      "dev": true,
-      "optional": true
-    },
-    "pify": {
-      "version": "2.3.0",
-      "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-      "dev": true
-    },
-    "pinkie": {
-      "version": "2.0.4",
-      "resolved": "http://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
-      "dev": true
-    },
-    "pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "http://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+    "split2": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npm.taobao.org/split2/download/split2-2.2.0.tgz",
+      "integrity": "sha1-GGsldbz4PoW30YRldWI47k7kJJM=",
       "dev": true,
       "requires": {
-        "pinkie": "2.0.4"
+        "through2": "^2.0.2"
       }
     },
-    "pluralize": {
-      "version": "1.2.1",
-      "resolved": "http://registry.npm.taobao.org/pluralize/download/pluralize-1.2.1.tgz",
-      "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=",
-      "dev": true
-    },
-    "prelude-ls": {
-      "version": "1.1.2",
-      "resolved": "http://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz",
-      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
-      "dev": true
-    },
-    "preserve": {
-      "version": "0.2.0",
-      "resolved": "http://registry.npm.taobao.org/preserve/download/preserve-0.2.0.tgz",
-      "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
-      "dev": true
-    },
-    "pretty-hrtime": {
+    "sprintf-js": {
       "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/pretty-hrtime/download/pretty-hrtime-1.0.3.tgz",
-      "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
-      "dev": true
-    },
-    "private": {
-      "version": "0.1.7",
-      "resolved": "http://registry.npm.taobao.org/private/download/private-0.1.7.tgz",
-      "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=",
-      "dev": true
-    },
-    "process-nextick-args": {
-      "version": "1.0.7",
-      "resolved": "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-1.0.7.tgz",
-      "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
-      "dev": true
-    },
-    "progress": {
-      "version": "1.1.8",
-      "resolved": "http://registry.npm.taobao.org/progress/download/progress-1.1.8.tgz",
-      "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
       "dev": true
     },
-    "promise": {
-      "version": "7.3.1",
-      "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
-      "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+    "sshpk": {
+      "version": "1.16.1",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+      "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
       "dev": true,
-      "optional": true,
       "requires": {
-        "asap": "2.0.6"
+        "asn1": "~0.2.3",
+        "assert-plus": "^1.0.0",
+        "bcrypt-pbkdf": "^1.0.0",
+        "dashdash": "^1.12.0",
+        "ecc-jsbn": "~0.1.1",
+        "getpass": "^0.1.1",
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.0.2",
+        "tweetnacl": "~0.14.0"
       }
     },
-    "prr": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz",
-      "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=",
-      "dev": true,
-      "optional": true
-    },
-    "pseudomap": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz",
-      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
-      "dev": true
-    },
-    "punycode": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
-      "dev": true,
-      "optional": true
-    },
-    "qs": {
-      "version": "6.4.0",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
-      "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
+    "ssri": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz",
+      "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==",
       "dev": true,
-      "optional": true
+      "requires": {
+        "figgy-pudding": "^3.5.1"
+      }
     },
-    "randomatic": {
-      "version": "1.1.7",
-      "resolved": "http://registry.npm.taobao.org/randomatic/download/randomatic-1.1.7.tgz",
-      "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=",
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
       "dev": true,
       "requires": {
-        "is-number": "3.0.0",
-        "kind-of": "4.0.0"
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
       },
       "dependencies": {
-        "is-number": {
-          "version": "3.0.0",
-          "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz",
-          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-          "dev": true,
-          "requires": {
-            "kind-of": "3.2.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "1.1.5"
-              }
-            }
-          }
-        },
-        "kind-of": {
-          "version": "4.0.0",
-          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz",
-          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
           "dev": true,
           "requires": {
-            "is-buffer": "1.1.5"
+            "is-descriptor": "^0.1.0"
           }
         }
       }
     },
-    "range-parser": {
-      "version": "1.2.0",
-      "resolved": "http://registry.npm.taobao.org/range-parser/download/range-parser-1.2.0.tgz",
-      "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+    "statuses": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
       "dev": true
     },
-    "read-cmd-shim": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/read-cmd-shim/download/read-cmd-shim-1.0.1.tgz",
-      "integrity": "sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs=",
+    "stream-combiner": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
+      "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
       "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11"
+        "duplexer": "~0.1.1"
       }
     },
-    "read-pkg": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz",
-      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+    "stream-each": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npm.taobao.org/stream-each/download/stream-each-1.2.3.tgz",
+      "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=",
       "dev": true,
       "requires": {
-        "load-json-file": "1.1.0",
-        "normalize-package-data": "2.4.0",
-        "path-type": "1.1.0"
+        "end-of-stream": "^1.1.0",
+        "stream-shift": "^1.0.0"
       }
     },
-    "read-pkg-up": {
+    "stream-shift": {
       "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz",
-      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+      "resolved": "https://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.1.tgz",
+      "integrity": "sha1-1wiCgVWasneEJCebCHfaPDktWj0=",
+      "dev": true
+    },
+    "string-width": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+      "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
       "dev": true,
       "requires": {
-        "find-up": "1.1.2",
-        "read-pkg": "1.1.0"
+        "is-fullwidth-code-point": "^2.0.0",
+        "strip-ansi": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        }
       }
     },
-    "readable-stream": {
-      "version": "2.3.3",
-      "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.3.tgz",
-      "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=",
+    "string.prototype.trimend": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz",
+      "integrity": "sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA==",
       "dev": true,
       "requires": {
-        "core-util-is": "1.0.2",
-        "inherits": "2.0.3",
-        "isarray": "1.0.0",
-        "process-nextick-args": "1.0.7",
-        "safe-buffer": "5.1.1",
-        "string_decoder": "1.0.3",
-        "util-deprecate": "1.0.2"
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5"
       }
     },
-    "readdirp": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npm.taobao.org/readdirp/download/readdirp-2.1.0.tgz",
-      "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
+    "string.prototype.trimleft": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz",
+      "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==",
       "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11",
-        "minimatch": "3.0.4",
-        "readable-stream": "2.3.3",
-        "set-immediate-shim": "1.0.1"
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5",
+        "string.prototype.trimstart": "^1.0.0"
       }
     },
-    "readline2": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/readline2/download/readline2-1.0.1.tgz",
-      "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=",
+    "string.prototype.trimright": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz",
+      "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==",
       "dev": true,
       "requires": {
-        "code-point-at": "1.1.0",
-        "is-fullwidth-code-point": "1.0.0",
-        "mute-stream": "0.0.5"
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5",
+        "string.prototype.trimend": "^1.0.0"
       }
     },
-    "rechoir": {
-      "version": "0.6.2",
-      "resolved": "http://registry.npm.taobao.org/rechoir/download/rechoir-0.6.2.tgz",
-      "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+    "string.prototype.trimstart": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz",
+      "integrity": "sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w==",
       "dev": true,
       "requires": {
-        "resolve": "1.4.0"
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5"
       }
     },
-    "redent": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/redent/download/redent-1.0.0.tgz",
-      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
       "dev": true,
       "requires": {
-        "indent-string": "2.1.0",
-        "strip-indent": "1.0.1"
+        "safe-buffer": "~5.1.0"
       }
     },
-    "regenerate": {
-      "version": "1.3.2",
-      "resolved": "http://registry.npm.taobao.org/regenerate/download/regenerate-1.3.2.tgz",
-      "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=",
+    "strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      }
+    },
+    "strip-bom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
       "dev": true
     },
-    "regenerator-runtime": {
-      "version": "0.11.0",
-      "resolved": "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.0.tgz",
-      "integrity": "sha1-flT+W1zNXWYk6mJVw0c74JC4AuE=",
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
       "dev": true
     },
-    "regenerator-transform": {
-      "version": "0.10.1",
-      "resolved": "http://registry.npm.taobao.org/regenerator-transform/download/regenerator-transform-0.10.1.tgz",
-      "integrity": "sha1-HkmWg3Ix2ot/PPQRTXG1aRoGgN0=",
+    "strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true
+    },
+    "strip-indent": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/strip-indent/download/strip-indent-3.0.0.tgz",
+      "integrity": "sha1-wy4c7pQLazQyx3G8LFS8znPNMAE=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0",
-        "private": "0.1.7"
+        "min-indent": "^1.0.0"
       }
     },
-    "regex-cache": {
-      "version": "0.4.4",
-      "resolved": "http://registry.npm.taobao.org/regex-cache/download/regex-cache-0.4.4.tgz",
-      "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=",
+    "strip-json-comments": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+      "dev": true
+    },
+    "strong-log-transformer": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/strong-log-transformer/download/strong-log-transformer-2.1.0.tgz",
+      "integrity": "sha1-D17XjTJeBCGsb5D38Q5pHWrjrhA=",
       "dev": true,
       "requires": {
-        "is-equal-shallow": "0.1.3"
+        "duplexer": "^0.1.1",
+        "minimist": "^1.2.0",
+        "through": "^2.3.4"
       }
     },
-    "regexpu-core": {
+    "supports-color": {
       "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/regexpu-core/download/regexpu-core-2.0.0.tgz",
-      "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+      "dev": true
+    },
+    "table": {
+      "version": "5.4.6",
+      "resolved": "http://r.tnpm.oa.com/table/download/table-5.4.6.tgz",
+      "integrity": "sha1-EpLRlQDOP4YFOwXw6Ofko7shB54=",
       "dev": true,
       "requires": {
-        "regenerate": "1.3.2",
-        "regjsgen": "0.2.0",
-        "regjsparser": "0.1.5"
+        "ajv": "^6.10.2",
+        "lodash": "^4.17.14",
+        "slice-ansi": "^2.1.0",
+        "string-width": "^3.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "http://r.tnpm.oa.com/ansi-regex/download/ansi-regex-4.1.0.tgz",
+          "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "http://r.tnpm.oa.com/string-width/download/string-width-3.1.0.tgz",
+          "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "http://r.tnpm.oa.com/strip-ansi/download/strip-ansi-5.2.0.tgz",
+          "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
       }
     },
-    "regjsgen": {
-      "version": "0.2.0",
-      "resolved": "http://registry.npm.taobao.org/regjsgen/download/regjsgen-0.2.0.tgz",
-      "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+    "tar": {
+      "version": "4.4.19",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz",
+      "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==",
+      "dev": true,
+      "requires": {
+        "chownr": "^1.1.4",
+        "fs-minipass": "^1.2.7",
+        "minipass": "^2.9.0",
+        "minizlib": "^1.3.3",
+        "mkdirp": "^0.5.5",
+        "safe-buffer": "^5.2.1",
+        "yallist": "^3.1.1"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+          "dev": true
+        }
+      }
+    },
+    "temp-dir": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz",
+      "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=",
       "dev": true
     },
-    "regjsparser": {
-      "version": "0.1.5",
-      "resolved": "http://registry.npm.taobao.org/regjsparser/download/regjsparser-0.1.5.tgz",
-      "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+    "temp-write": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-3.4.0.tgz",
+      "integrity": "sha1-jP9jD7fp2gXwR8dM5M5NaFRX1JI=",
       "dev": true,
       "requires": {
-        "jsesc": "0.5.0"
+        "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"
       },
       "dependencies": {
-        "jsesc": {
-          "version": "0.5.0",
-          "resolved": "http://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz",
-          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
           "dev": true
         }
       }
     },
-    "remove-trailing-separator": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz",
-      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
-      "dev": true
+    "terminal-menu": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/terminal-menu/-/terminal-menu-2.1.1.tgz",
+      "integrity": "sha1-uQhiCAAARHtFYBFOLSqBEf7MOnk=",
+      "dev": true,
+      "requires": {
+        "charm": "~0.1.2",
+        "duplexer2": "0.0.2",
+        "inherits": "~2.0.0",
+        "resumer": "~0.0.0",
+        "through2": "^0.6.3",
+        "visualwidth": "~0.0.1"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "1.0.34",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+          "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+          "dev": true,
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.1",
+            "isarray": "0.0.1",
+            "string_decoder": "~0.10.x"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true
+        },
+        "through2": {
+          "version": "0.6.5",
+          "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+          "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+          "dev": true,
+          "requires": {
+            "readable-stream": ">=1.0.33-1 <1.1.0-0",
+            "xtend": ">=4.0.0 <4.1.0-0"
+          }
+        }
+      }
     },
-    "repeat-element": {
-      "version": "1.1.2",
-      "resolved": "http://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.2.tgz",
-      "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+    "test-exclude": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+      "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+      "dev": true,
+      "requires": {
+        "@istanbuljs/schema": "^0.1.2",
+        "glob": "^7.1.4",
+        "minimatch": "^3.0.4"
+      }
+    },
+    "text-extensions": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npm.taobao.org/text-extensions/download/text-extensions-1.9.0.tgz?cache=0&sync_timestamp=1581860820119&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftext-extensions%2Fdownload%2Ftext-extensions-1.9.0.tgz",
+      "integrity": "sha1-GFPkX+45yUXOb2w2stZZtaq8KiY=",
       "dev": true
     },
-    "repeat-string": {
-      "version": "1.6.1",
-      "resolved": "http://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz",
-      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+    "text-table": {
+      "version": "0.2.0",
+      "resolved": "http://r.tnpm.oa.com/text-table/download/text-table-0.2.0.tgz",
+      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
       "dev": true
     },
-    "repeating": {
-      "version": "2.0.1",
-      "resolved": "http://registry.npm.taobao.org/repeating/download/repeating-2.0.1.tgz",
-      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+    "thenify": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npm.taobao.org/thenify/download/thenify-3.3.1.tgz?cache=0&sync_timestamp=1592413466879&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fthenify%2Fdownload%2Fthenify-3.3.1.tgz",
+      "integrity": "sha1-iTLmhqQGYDigFt2eLKRq3Zg4qV8=",
       "dev": true,
       "requires": {
-        "is-finite": "1.0.2"
+        "any-promise": "^1.0.0"
       }
     },
-    "replace-ext": {
-      "version": "0.0.1",
-      "resolved": "http://registry.npm.taobao.org/replace-ext/download/replace-ext-0.0.1.tgz",
-      "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+    "thenify-all": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+      "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
+      "dev": true,
+      "requires": {
+        "thenify": ">= 3.1.0 < 4"
+      }
+    },
+    "through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
       "dev": true
     },
-    "request": {
-      "version": "2.81.0",
-      "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
-      "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
+    "through2": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
       "dev": true,
-      "optional": true,
       "requires": {
-        "aws-sign2": "0.6.0",
-        "aws4": "1.6.0",
-        "caseless": "0.12.0",
-        "combined-stream": "1.0.5",
-        "extend": "3.0.1",
-        "forever-agent": "0.6.1",
-        "form-data": "2.1.4",
-        "har-validator": "4.2.1",
-        "hawk": "3.1.3",
-        "http-signature": "1.1.1",
-        "is-typedarray": "1.0.0",
-        "isstream": "0.1.2",
-        "json-stringify-safe": "5.0.1",
-        "mime-types": "2.1.17",
-        "oauth-sign": "0.8.2",
-        "performance-now": "0.2.0",
-        "qs": "6.4.0",
-        "safe-buffer": "5.1.1",
-        "stringstream": "0.0.5",
-        "tough-cookie": "2.3.3",
-        "tunnel-agent": "0.6.0",
-        "uuid": "3.1.0"
-      }
-    },
-    "require-uncached": {
+        "readable-stream": "~2.3.6",
+        "xtend": "~4.0.1"
+      }
+    },
+    "tildify": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz",
+      "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=",
+      "dev": true,
+      "requires": {
+        "os-homedir": "^1.0.0"
+      }
+    },
+    "tmp": {
+      "version": "0.0.33",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+      "dev": true,
+      "requires": {
+        "os-tmpdir": "~1.0.2"
+      }
+    },
+    "to-fast-properties": {
       "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/require-uncached/download/require-uncached-1.0.3.tgz",
-      "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+      "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+      "dev": true
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
       "dev": true,
       "requires": {
-        "caller-path": "0.1.0",
-        "resolve-from": "1.0.1"
+        "kind-of": "^3.0.2"
       }
     },
-    "resolve": {
-      "version": "1.4.0",
-      "resolved": "http://registry.npm.taobao.org/resolve/download/resolve-1.4.0.tgz",
-      "integrity": "sha1-p1vgHFPaJdk0qY69DkxKcxL5KoY=",
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
       "dev": true,
       "requires": {
-        "path-parse": "1.0.5"
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
       }
     },
-    "resolve-dir": {
-      "version": "0.1.1",
-      "resolved": "http://registry.npm.taobao.org/resolve-dir/download/resolve-dir-0.1.1.tgz",
-      "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=",
+    "to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "dev": true,
+      "requires": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          }
+        }
+      }
+    },
+    "toidentifier": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+      "dev": true
+    },
+    "tough-cookie": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+      "dev": true,
+      "requires": {
+        "psl": "^1.1.28",
+        "punycode": "^2.1.1"
+      }
+    },
+    "tr46": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+      "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
       "dev": true,
       "requires": {
-        "expand-tilde": "1.2.2",
-        "global-modules": "0.2.3"
+        "punycode": "^2.1.0"
       }
     },
-    "resolve-from": {
+    "trim-newlines": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/trim-newlines/download/trim-newlines-3.0.0.tgz",
+      "integrity": "sha1-eXJjBKaomKqDc0JymNVMLuixyzA=",
+      "dev": true
+    },
+    "trim-off-newlines": {
       "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/resolve-from/download/resolve-from-1.0.1.tgz",
-      "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
+      "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz",
+      "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=",
       "dev": true
     },
-    "restore-cursor": {
+    "trim-right": {
       "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/restore-cursor/download/restore-cursor-1.0.1.tgz",
-      "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
+      "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+      "dev": true
+    },
+    "tslib": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz",
+      "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==",
+      "dev": true
+    },
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
       "dev": true,
       "requires": {
-        "exit-hook": "1.1.1",
-        "onetime": "1.1.0"
+        "safe-buffer": "^5.0.1"
       }
     },
-    "right-align": {
-      "version": "0.1.3",
-      "resolved": "http://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz",
-      "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+    "tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+      "dev": true
+    },
+    "type-check": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
       "dev": true,
       "requires": {
-        "align-text": "0.1.4"
+        "prelude-ls": "~1.1.2"
       }
     },
-    "rimraf": {
-      "version": "2.6.2",
-      "resolved": "http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.2.tgz",
-      "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=",
+    "type-detect": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+      "dev": true
+    },
+    "type-fest": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npm.taobao.org/type-fest/download/type-fest-0.3.1.tgz?cache=0&sync_timestamp=1591686750124&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype-fest%2Fdownload%2Ftype-fest-0.3.1.tgz",
+      "integrity": "sha1-Y9ANIE4FlHT+Xht8ARESu9HcKeE=",
+      "dev": true
+    },
+    "type-is": {
+      "version": "1.6.18",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
       "dev": true,
       "requires": {
-        "glob": "7.1.2"
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.24"
       }
     },
-    "run-async": {
-      "version": "0.1.0",
-      "resolved": "http://registry.npm.taobao.org/run-async/download/run-async-0.1.0.tgz",
-      "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=",
+    "typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+      "dev": true
+    },
+    "typedarray-to-buffer": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
       "dev": true,
       "requires": {
-        "once": "1.4.0"
+        "is-typedarray": "^1.0.0"
       }
     },
-    "rx-lite": {
-      "version": "3.1.2",
-      "resolved": "http://registry.npm.taobao.org/rx-lite/download/rx-lite-3.1.2.tgz",
-      "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=",
+    "uid-number": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz",
+      "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=",
       "dev": true
     },
-    "safe-buffer": {
-      "version": "5.1.1",
-      "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.1.tgz",
-      "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=",
+    "umask": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz",
+      "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=",
       "dev": true
     },
-    "semver": {
-      "version": "4.3.6",
-      "resolved": "http://registry.npm.taobao.org/semver/download/semver-4.3.6.tgz",
-      "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
+    "underscore": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
+      "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
       "dev": true
     },
-    "send": {
-      "version": "0.15.4",
-      "resolved": "http://registry.npm.taobao.org/send/download/send-0.15.4.tgz",
-      "integrity": "sha1-mF+qPihLAnPHkzZKNcZze9k5Bbk=",
-      "dev": true,
-      "requires": {
-        "debug": "2.6.8",
-        "depd": "1.1.1",
-        "destroy": "1.0.4",
-        "encodeurl": "1.0.1",
-        "escape-html": "1.0.3",
-        "etag": "1.8.1",
-        "fresh": "0.5.0",
-        "http-errors": "1.6.2",
-        "mime": "1.3.4",
-        "ms": "2.0.0",
-        "on-finished": "2.3.0",
-        "range-parser": "1.2.0",
-        "statuses": "1.3.1"
-      }
-    },
-    "sequencify": {
-      "version": "0.0.7",
-      "resolved": "http://registry.npm.taobao.org/sequencify/download/sequencify-0.0.7.tgz",
-      "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=",
+    "unicode-canonical-property-names-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
+      "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
       "dev": true
     },
-    "serve-static": {
-      "version": "1.12.4",
-      "resolved": "http://registry.npm.taobao.org/serve-static/download/serve-static-1.12.4.tgz",
-      "integrity": "sha1-m2qpjutyU8Tu3Ewfb9vKYJkBqWE=",
+    "unicode-match-property-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
+      "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
       "dev": true,
       "requires": {
-        "encodeurl": "1.0.1",
-        "escape-html": "1.0.3",
-        "parseurl": "1.3.2",
-        "send": "0.15.4"
+        "unicode-canonical-property-names-ecmascript": "^1.0.4",
+        "unicode-property-aliases-ecmascript": "^1.0.4"
       }
     },
-    "set-immediate-shim": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/set-immediate-shim/download/set-immediate-shim-1.0.1.tgz",
-      "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
+    "unicode-match-property-value-ecmascript": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
+      "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
       "dev": true
     },
-    "setprototypeof": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.0.3.tgz",
-      "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
+    "unicode-property-aliases-ecmascript": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
+      "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
       "dev": true
     },
-    "shelljs": {
-      "version": "0.7.8",
-      "resolved": "http://registry.npm.taobao.org/shelljs/download/shelljs-0.7.8.tgz",
-      "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=",
+    "union-value": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
       "dev": true,
       "requires": {
-        "glob": "7.1.2",
-        "interpret": "1.0.3",
-        "rechoir": "0.6.2"
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^2.0.1"
       }
     },
-    "sigmund": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/sigmund/download/sigmund-1.0.1.tgz",
-      "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
-      "dev": true
-    },
-    "signal-exit": {
-      "version": "2.1.2",
-      "resolved": "http://registry.npm.taobao.org/signal-exit/download/signal-exit-2.1.2.tgz",
-      "integrity": "sha1-N1h5sfkuvDszRIDQONxUam1VhWQ=",
-      "dev": true
-    },
-    "slash": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz",
-      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
-      "dev": true
+    "unique-filename": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/unique-filename/download/unique-filename-1.1.1.tgz",
+      "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=",
+      "dev": true,
+      "requires": {
+        "unique-slug": "^2.0.0"
+      }
     },
-    "slice-ansi": {
-      "version": "0.0.4",
-      "resolved": "http://registry.npm.taobao.org/slice-ansi/download/slice-ansi-0.0.4.tgz",
-      "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=",
-      "dev": true
+    "unique-slug": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npm.taobao.org/unique-slug/download/unique-slug-2.0.2.tgz",
+      "integrity": "sha1-uqvOkQg/xk6UWw861hPiZPfNTmw=",
+      "dev": true,
+      "requires": {
+        "imurmurhash": "^0.1.4"
+      }
     },
-    "sntp": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
-      "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+    "universal-user-agent": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npm.taobao.org/universal-user-agent/download/universal-user-agent-4.0.1.tgz",
+      "integrity": "sha1-/Y1st3OmeacJ6WfvgoijH8wD5Vc=",
       "dev": true,
-      "optional": true,
       "requires": {
-        "hoek": "2.16.3"
+        "os-name": "^3.1.0"
       }
     },
-    "sorted-object": {
-      "version": "2.0.1",
-      "resolved": "http://registry.npm.taobao.org/sorted-object/download/sorted-object-2.0.1.tgz",
-      "integrity": "sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw=",
+    "universalify": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
       "dev": true
     },
-    "source-map": {
-      "version": "0.5.7",
-      "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+    "unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
       "dev": true
     },
-    "source-map-support": {
-      "version": "0.4.18",
-      "resolved": "http://registry.npm.taobao.org/source-map-support/download/source-map-support-0.4.18.tgz",
-      "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=",
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
       "dev": true,
       "requires": {
-        "source-map": "0.5.7"
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "dev": true,
+          "requires": {
+            "get-value": "^2.0.3",
+            "has-values": "^0.1.4",
+            "isobject": "^2.0.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "dev": true,
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+          "dev": true
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        }
       }
     },
-    "sparkles": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/sparkles/download/sparkles-1.0.0.tgz",
-      "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=",
+    "upath": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/upath/download/upath-1.2.0.tgz",
+      "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=",
       "dev": true
     },
-    "spdx-correct": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-1.0.2.tgz",
-      "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
+    "uri-js": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+      "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
       "dev": true,
       "requires": {
-        "spdx-license-ids": "1.2.2"
+        "punycode": "^2.1.0"
       }
     },
-    "spdx-expression-parse": {
-      "version": "1.0.4",
-      "resolved": "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-1.0.4.tgz",
-      "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=",
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
       "dev": true
     },
-    "spdx-license-ids": {
-      "version": "1.2.2",
-      "resolved": "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-1.2.2.tgz",
-      "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
+    "use": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
       "dev": true
     },
-    "sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+    "user-home": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
+      "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
       "dev": true
     },
-    "sshpk": {
-      "version": "1.13.1",
-      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz",
-      "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
+    },
+    "util-promisify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz",
+      "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=",
       "dev": true,
-      "optional": true,
       "requires": {
-        "asn1": "0.2.3",
-        "assert-plus": "1.0.0",
-        "bcrypt-pbkdf": "1.0.1",
-        "dashdash": "1.14.1",
-        "ecc-jsbn": "0.1.1",
-        "getpass": "0.1.7",
-        "jsbn": "0.1.1",
-        "tweetnacl": "0.14.5"
-      },
-      "dependencies": {
-        "assert-plus": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
-          "dev": true,
-          "optional": true
-        }
+        "object.getownpropertydescriptors": "^2.0.3"
       }
     },
-    "statuses": {
-      "version": "1.3.1",
-      "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.3.1.tgz",
-      "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+    "utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
       "dev": true
     },
-    "stream-consume": {
-      "version": "0.1.0",
-      "resolved": "http://registry.npm.taobao.org/stream-consume/download/stream-consume-0.1.0.tgz",
-      "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=",
+    "uuid": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
       "dev": true
     },
-    "stream-shift": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.0.tgz",
-      "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
+    "v8-compile-cache": {
+      "version": "2.1.1",
+      "resolved": "http://r.tnpm.oa.com/v8-compile-cache/download/v8-compile-cache-2.1.1.tgz",
+      "integrity": "sha1-VLw83UMxe8qR413K8wWxpyN950U=",
       "dev": true
     },
-    "string-width": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz",
-      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+    "v8flags": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
+      "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
       "dev": true,
       "requires": {
-        "code-point-at": "1.1.0",
-        "is-fullwidth-code-point": "1.0.0",
-        "strip-ansi": "3.0.1"
+        "user-home": "^1.1.1"
       }
     },
-    "string_decoder": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.0.3.tgz",
-      "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=",
+    "validate-commit-msg": {
+      "version": "2.14.0",
+      "resolved": "https://registry.npmjs.org/validate-commit-msg/-/validate-commit-msg-2.14.0.tgz",
+      "integrity": "sha1-5Tg2kQEsuycNzAvCpO/+vhSJDqw=",
       "dev": true,
       "requires": {
-        "safe-buffer": "5.1.1"
+        "conventional-commit-types": "^2.0.0",
+        "find-parent-dir": "^0.3.0",
+        "findup": "0.1.5",
+        "semver-regex": "1.0.0"
       }
     },
-    "stringstream": {
-      "version": "0.0.5",
-      "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
-      "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
+    "validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
       "dev": true,
-      "optional": true
+      "requires": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
     },
-    "strip-ansi": {
-      "version": "3.0.1",
-      "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz",
-      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+    "validate-npm-package-name": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
+      "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=",
       "dev": true,
       "requires": {
-        "ansi-regex": "2.1.1"
+        "builtins": "^1.0.3"
       }
     },
-    "strip-bom": {
-      "version": "3.0.0",
-      "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz",
-      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+    "vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
       "dev": true
     },
-    "strip-bom-stream": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/strip-bom-stream/download/strip-bom-stream-2.0.0.tgz",
-      "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=",
-      "dev": true,
-      "requires": {
-        "first-chunk-stream": "2.0.0",
-        "strip-bom": "2.0.0"
+    "verpub": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/verpub/-/verpub-0.1.2.tgz",
+      "integrity": "sha512-9ewC0leYwEbGu3Na3orPigbI53FVJDXqnM36eJWChrvFndS+1lrpxtnqGJuL0SdtY1zR9a4lZo/txQO/671zsA==",
+      "dev": true,
+      "requires": {
+        "commander": "^3.0.1",
+        "deepmerge": "^4.2.2",
+        "enquirer": "^2.3.1",
+        "execa": "^3.4.0",
+        "node-time-ago": "^1.0.0",
+        "promise-timeout": "^1.3.0",
+        "read-pkg": "^5.2.0",
+        "replace-in-file": "^4.1.3",
+        "semver": "^6.3.0",
+        "write-json-file": "^4.2.0"
       },
       "dependencies": {
-        "first-chunk-stream": {
-          "version": "2.0.0",
-          "resolved": "http://registry.npm.taobao.org/first-chunk-stream/download/first-chunk-stream-2.0.0.tgz",
-          "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=",
+        "commander": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz",
+          "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==",
+          "dev": true
+        },
+        "cross-spawn": {
+          "version": "7.0.2",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz",
+          "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==",
           "dev": true,
           "requires": {
-            "readable-stream": "2.3.3"
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
           }
         },
-        "strip-bom": {
+        "detect-indent": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz",
+          "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==",
+          "dev": true
+        },
+        "execa": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz",
+          "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^7.0.0",
+            "get-stream": "^5.0.0",
+            "human-signals": "^1.1.1",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^4.0.0",
+            "onetime": "^5.1.0",
+            "p-finally": "^2.0.0",
+            "signal-exit": "^3.0.2",
+            "strip-final-newline": "^2.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
+          "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "is-plain-obj": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+          "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+          "dev": true
+        },
+        "is-stream": {
           "version": "2.0.0",
-          "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz",
-          "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+          "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+          "dev": true
+        },
+        "make-dir": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz",
+          "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==",
           "dev": true,
           "requires": {
-            "is-utf8": "0.2.1"
+            "semver": "^6.0.0"
           }
-        }
-      }
-    },
-    "strip-indent": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/strip-indent/download/strip-indent-1.0.1.tgz",
-      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
-      "dev": true,
-      "requires": {
-        "get-stdin": "4.0.1"
-      }
-    },
-    "strip-json-comments": {
-      "version": "2.0.1",
-      "resolved": "http://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz",
-      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
-      "dev": true
-    },
-    "supports-color": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz",
-      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-      "dev": true
-    },
-    "sync-exec": {
-      "version": "0.6.2",
-      "resolved": "http://registry.npm.taobao.org/sync-exec/download/sync-exec-0.6.2.tgz",
-      "integrity": "sha1-cX0izFPwzh3vVZQ2LzqJouu5EQU=",
-      "dev": true
-    },
-    "table": {
-      "version": "3.8.3",
-      "resolved": "http://registry.npm.taobao.org/table/download/table-3.8.3.tgz",
-      "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=",
-      "dev": true,
-      "requires": {
-        "ajv": "4.11.8",
-        "ajv-keywords": "1.5.1",
-        "chalk": "1.1.3",
-        "lodash": "4.17.4",
-        "slice-ansi": "0.0.4",
-        "string-width": "2.1.1"
-      },
-      "dependencies": {
-        "ansi-regex": {
+        },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+          "dev": true
+        },
+        "npm-run-path": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.0.0"
+          }
+        },
+        "onetime": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
+          "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
+        "p-finally": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz",
+          "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
+          "dev": true
+        },
+        "parse-json": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
+          "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1",
+            "lines-and-columns": "^1.1.6"
+          }
+        },
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+          "dev": true
+        },
+        "pump": {
           "version": "3.0.0",
-          "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz",
-          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        },
+        "read-pkg": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+          "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+          "dev": true,
+          "requires": {
+            "@types/normalize-package-data": "^2.4.0",
+            "normalize-package-data": "^2.5.0",
+            "parse-json": "^5.0.0",
+            "type-fest": "^0.6.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
           "dev": true
         },
-        "is-fullwidth-code-point": {
+        "shebang-command": {
           "version": "2.0.0",
-          "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
           "dev": true
         },
-        "string-width": {
-          "version": "2.1.1",
-          "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz",
-          "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
+        "sort-keys": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-4.0.0.tgz",
+          "integrity": "sha512-hlJLzrn/VN49uyNkZ8+9b+0q9DjmmYcYOnbMQtpkLrYpPwRApDPZfmqbUfJnAA3sb/nRib+nDot7Zi/1ER1fuA==",
           "dev": true,
           "requires": {
-            "is-fullwidth-code-point": "2.0.0",
-            "strip-ansi": "4.0.0"
+            "is-plain-obj": "^2.0.0"
           }
         },
-        "strip-ansi": {
-          "version": "4.0.0",
-          "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz",
-          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+        "type-fest": {
+          "version": "0.6.0",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+          "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+          "dev": true
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        },
+        "write-file-atomic": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+          "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+          "dev": true,
+          "requires": {
+            "imurmurhash": "^0.1.4",
+            "is-typedarray": "^1.0.0",
+            "signal-exit": "^3.0.2",
+            "typedarray-to-buffer": "^3.1.5"
+          }
+        },
+        "write-json-file": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-4.3.0.tgz",
+          "integrity": "sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ==",
           "dev": true,
           "requires": {
-            "ansi-regex": "3.0.0"
+            "detect-indent": "^6.0.0",
+            "graceful-fs": "^4.1.15",
+            "is-plain-obj": "^2.0.0",
+            "make-dir": "^3.0.0",
+            "sort-keys": "^4.0.0",
+            "write-file-atomic": "^3.0.0"
           }
         }
       }
     },
-    "ternary-stream": {
-      "version": "2.0.1",
-      "resolved": "http://registry.npm.taobao.org/ternary-stream/download/ternary-stream-2.0.1.tgz",
-      "integrity": "sha1-Bk5Im0tb9gumpre8fy9cJ07Pgmk=",
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
       "dev": true,
       "requires": {
-        "duplexify": "3.5.1",
-        "fork-stream": "0.0.4",
-        "merge-stream": "1.0.1",
-        "through2": "2.0.3"
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
       }
     },
-    "text-table": {
-      "version": "0.2.0",
-      "resolved": "http://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz",
-      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
-      "dev": true
-    },
-    "through": {
-      "version": "2.3.8",
-      "resolved": "http://registry.npm.taobao.org/through/download/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+    "visualwidth": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/visualwidth/-/visualwidth-0.0.1.tgz",
+      "integrity": "sha1-I3Z1q5pyEVY5JrpjMJRYx9qRWrc=",
       "dev": true
     },
-    "through2": {
-      "version": "2.0.3",
-      "resolved": "http://registry.npm.taobao.org/through2/download/through2-2.0.3.tgz",
-      "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
-      "dev": true,
-      "requires": {
-        "readable-stream": "2.3.3",
-        "xtend": "4.0.1"
-      }
-    },
-    "tildify": {
-      "version": "1.2.0",
-      "resolved": "http://registry.npm.taobao.org/tildify/download/tildify-1.2.0.tgz",
-      "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=",
+    "wcwidth": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+      "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
       "dev": true,
       "requires": {
-        "os-homedir": "1.0.2"
+        "defaults": "^1.0.3"
       }
     },
-    "time-stamp": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/time-stamp/download/time-stamp-1.1.0.tgz",
-      "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
-      "dev": true
-    },
-    "to-fast-properties": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-1.0.3.tgz",
-      "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+    "webidl-conversions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npm.taobao.org/webidl-conversions/download/webidl-conversions-4.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebidl-conversions%2Fdownload%2Fwebidl-conversions-4.0.2.tgz",
+      "integrity": "sha1-qFWYCx8LazWbodXZ+zmulB+qY60=",
       "dev": true
     },
-    "tough-cookie": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz",
-      "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=",
+    "whatwg-url": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npm.taobao.org/whatwg-url/download/whatwg-url-7.1.0.tgz",
+      "integrity": "sha1-wsSS8eymEpiO/T0iZr4bn8YXDQY=",
       "dev": true,
-      "optional": true,
       "requires": {
-        "punycode": "1.4.1"
+        "lodash.sortby": "^4.7.0",
+        "tr46": "^1.0.1",
+        "webidl-conversions": "^4.0.2"
       }
     },
-    "trim-newlines": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/trim-newlines/download/trim-newlines-1.0.0.tgz",
-      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
-      "dev": true
-    },
-    "trim-right": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/trim-right/download/trim-right-1.0.1.tgz",
-      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
-      "dev": true
-    },
-    "tryit": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/tryit/download/tryit-1.0.3.tgz",
-      "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=",
-      "dev": true
-    },
-    "tunnel-agent": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+    "which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
       "dev": true,
-      "optional": true,
       "requires": {
-        "safe-buffer": "5.1.1"
+        "isexe": "^2.0.0"
       }
     },
-    "tweetnacl": {
-      "version": "0.14.5",
-      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
-      "dev": true,
-      "optional": true
-    },
-    "type-check": {
-      "version": "0.3.2",
-      "resolved": "http://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz",
-      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+    "wide-align": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+      "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
       "dev": true,
       "requires": {
-        "prelude-ls": "1.1.2"
+        "string-width": "^1.0.2 || 2"
       }
     },
-    "typedarray": {
-      "version": "0.0.6",
-      "resolved": "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz",
-      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
-      "dev": true
-    },
-    "uglify-js": {
-      "version": "2.8.29",
-      "resolved": "http://registry.npm.taobao.org/uglify-js/download/uglify-js-2.8.29.tgz",
-      "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+    "windows-release": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npm.taobao.org/windows-release/download/windows-release-3.3.1.tgz?cache=0&sync_timestamp=1591611986956&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwindows-release%2Fdownload%2Fwindows-release-3.3.1.tgz",
+      "integrity": "sha1-y06AOF+FUPcJcnKHv3EDXiCcSs4=",
       "dev": true,
       "requires": {
-        "source-map": "0.5.7",
-        "uglify-to-browserify": "1.0.2",
-        "yargs": "3.10.0"
+        "execa": "^1.0.0"
       }
     },
-    "uglify-to-browserify": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz",
-      "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
-      "dev": true,
-      "optional": true
-    },
-    "unc-path-regex": {
-      "version": "0.1.2",
-      "resolved": "http://registry.npm.taobao.org/unc-path-regex/download/unc-path-regex-0.1.2.tgz",
-      "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
-      "dev": true
-    },
-    "underscore": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
-      "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
-      "dev": true
-    },
-    "unique-stream": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/unique-stream/download/unique-stream-1.0.0.tgz",
-      "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=",
-      "dev": true
-    },
-    "user-home": {
-      "version": "1.1.1",
-      "resolved": "http://registry.npm.taobao.org/user-home/download/user-home-1.1.1.tgz",
-      "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
+    "word-wrap": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
       "dev": true
     },
-    "util-deprecate": {
+    "wrappy": {
       "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
       "dev": true
     },
-    "uuid": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
-      "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==",
-      "dev": true,
-      "optional": true
+    "wrench": {
+      "version": "1.5.9",
+      "resolved": "https://registry.npmjs.org/wrench/-/wrench-1.5.9.tgz",
+      "integrity": "sha1-QRaRxjqbJTGxcAJnJ5veyiOyFCo=",
+      "dev": true
     },
-    "v8flags": {
-      "version": "2.1.1",
-      "resolved": "http://registry.npm.taobao.org/v8flags/download/v8flags-2.1.1.tgz",
-      "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
+    "write": {
+      "version": "1.0.3",
+      "resolved": "http://r.tnpm.oa.com/write/download/write-1.0.3.tgz",
+      "integrity": "sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM=",
       "dev": true,
       "requires": {
-        "user-home": "1.1.1"
+        "mkdirp": "^0.5.1"
       }
     },
-    "validate-npm-package-license": {
-      "version": "3.0.1",
-      "resolved": "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.1.tgz",
-      "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
+    "write-file-atomic": {
+      "version": "2.4.3",
+      "resolved": "https://registry.npm.taobao.org/write-file-atomic/download/write-file-atomic-2.4.3.tgz?cache=0&sync_timestamp=1582584103455&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwrite-file-atomic%2Fdownload%2Fwrite-file-atomic-2.4.3.tgz",
+      "integrity": "sha1-H9Lprh3z51uNjDZ0Q8aS1MqB9IE=",
       "dev": true,
       "requires": {
-        "spdx-correct": "1.0.2",
-        "spdx-expression-parse": "1.0.4"
+        "graceful-fs": "^4.1.11",
+        "imurmurhash": "^0.1.4",
+        "signal-exit": "^3.0.2"
       }
     },
-    "verror": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
-      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+    "write-json-file": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npm.taobao.org/write-json-file/download/write-json-file-3.2.0.tgz?cache=0&sync_timestamp=1588415739223&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwrite-json-file%2Fdownload%2Fwrite-json-file-3.2.0.tgz",
+      "integrity": "sha1-Zbvcns2KFFjhWVJ3DMut/P9f5io=",
       "dev": true,
-      "optional": true,
       "requires": {
-        "assert-plus": "1.0.0",
-        "core-util-is": "1.0.2",
-        "extsprintf": "1.3.0"
+        "detect-indent": "^5.0.0",
+        "graceful-fs": "^4.1.15",
+        "make-dir": "^2.1.0",
+        "pify": "^4.0.1",
+        "sort-keys": "^2.0.0",
+        "write-file-atomic": "^2.4.2"
       },
       "dependencies": {
-        "assert-plus": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+        "detect-indent": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz",
+          "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=",
+          "dev": true
+        },
+        "make-dir": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz?cache=0&sync_timestamp=1587567572251&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmake-dir%2Fdownload%2Fmake-dir-2.1.0.tgz",
+          "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=",
           "dev": true,
-          "optional": true
+          "requires": {
+            "pify": "^4.0.1",
+            "semver": "^5.6.0"
+          }
         }
       }
     },
-    "vinyl": {
-      "version": "0.5.3",
-      "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-0.5.3.tgz",
-      "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
-      "dev": true,
-      "requires": {
-        "clone": "1.0.2",
-        "clone-stats": "0.0.1",
-        "replace-ext": "0.0.1"
-      }
-    },
-    "vinyl-file": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/vinyl-file/download/vinyl-file-2.0.0.tgz",
-      "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=",
+    "write-pkg": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npm.taobao.org/write-pkg/download/write-pkg-3.2.0.tgz",
+      "integrity": "sha1-DheP6Xgg04mokovHlTXb5ows/yE=",
       "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11",
-        "pify": "2.3.0",
-        "pinkie-promise": "2.0.1",
-        "strip-bom": "2.0.0",
-        "strip-bom-stream": "2.0.0",
-        "vinyl": "1.2.0"
+        "sort-keys": "^2.0.0",
+        "write-json-file": "^2.2.0"
       },
       "dependencies": {
-        "strip-bom": {
-          "version": "2.0.0",
-          "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz",
-          "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
-          "dev": true,
-          "requires": {
-            "is-utf8": "0.2.1"
-          }
+        "detect-indent": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz",
+          "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=",
+          "dev": true
         },
-        "vinyl": {
-          "version": "1.2.0",
-          "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-1.2.0.tgz",
-          "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        },
+        "write-json-file": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz",
+          "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=",
           "dev": true,
           "requires": {
-            "clone": "1.0.2",
-            "clone-stats": "0.0.1",
-            "replace-ext": "0.0.1"
+            "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"
           }
         }
       }
     },
-    "vinyl-fs": {
-      "version": "0.3.14",
-      "resolved": "http://registry.npm.taobao.org/vinyl-fs/download/vinyl-fs-0.3.14.tgz",
-      "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=",
+    "xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "dev": true
+    },
+    "y18n": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+      "dev": true
+    },
+    "yallist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+      "dev": true
+    },
+    "yargs-unparser": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
+      "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
       "dev": true,
       "requires": {
-        "defaults": "1.0.3",
-        "glob-stream": "3.1.18",
-        "glob-watcher": "0.0.6",
-        "graceful-fs": "3.0.11",
-        "mkdirp": "0.5.1",
-        "strip-bom": "1.0.0",
-        "through2": "0.6.5",
-        "vinyl": "0.4.6"
+        "flat": "^4.1.0",
+        "lodash": "^4.17.15",
+        "yargs": "^13.3.0"
       },
       "dependencies": {
-        "clone": {
-          "version": "0.2.0",
-          "resolved": "http://registry.npm.taobao.org/clone/download/clone-0.2.0.tgz",
-          "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
           "dev": true
         },
-        "graceful-fs": {
-          "version": "3.0.11",
-          "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-3.0.11.tgz",
-          "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
           "dev": true,
           "requires": {
-            "natives": "1.1.0"
+            "color-convert": "^1.9.0"
           }
         },
-        "isarray": {
-          "version": "0.0.1",
-          "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz",
-          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
           "dev": true
         },
-        "readable-stream": {
-          "version": "1.0.34",
-          "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.0.34.tgz",
-          "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+        "cliui": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
           "dev": true,
           "requires": {
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
-            "isarray": "0.0.1",
-            "string_decoder": "0.10.31"
+            "string-width": "^3.1.0",
+            "strip-ansi": "^5.2.0",
+            "wrap-ansi": "^5.1.0"
           }
         },
-        "string_decoder": {
-          "version": "0.10.31",
-          "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz",
-          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "get-caller-file": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+          "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
           "dev": true
         },
-        "strip-bom": {
-          "version": "1.0.0",
-          "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-1.0.0.tgz",
-          "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=",
+        "require-main-filename": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+          "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
           "dev": true,
           "requires": {
-            "first-chunk-stream": "1.0.0",
-            "is-utf8": "0.2.1"
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
           }
         },
-        "through2": {
-          "version": "0.6.5",
-          "resolved": "http://registry.npm.taobao.org/through2/download/through2-0.6.5.tgz",
-          "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
+        "which-module": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+          "dev": true
+        },
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          }
+        },
+        "yargs": {
+          "version": "13.3.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
           "dev": true,
           "requires": {
-            "readable-stream": "1.0.34",
-            "xtend": "4.0.1"
+            "cliui": "^5.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^3.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^13.1.2"
           }
         },
-        "vinyl": {
-          "version": "0.4.6",
-          "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-0.4.6.tgz",
-          "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+        "yargs-parser": {
+          "version": "13.1.2",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+          "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
           "dev": true,
           "requires": {
-            "clone": "0.2.0",
-            "clone-stats": "0.0.1"
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
           }
         }
       }
-    },
-    "vinyl-sourcemaps-apply": {
-      "version": "0.2.1",
-      "resolved": "http://registry.npm.taobao.org/vinyl-sourcemaps-apply/download/vinyl-sourcemaps-apply-0.2.1.tgz",
-      "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=",
-      "dev": true,
-      "requires": {
-        "source-map": "0.5.7"
-      }
-    },
-    "when": {
-      "version": "3.7.8",
-      "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz",
-      "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=",
-      "dev": true
-    },
-    "which": {
-      "version": "1.3.0",
-      "resolved": "http://registry.npm.taobao.org/which/download/which-1.3.0.tgz",
-      "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=",
-      "dev": true,
-      "requires": {
-        "isexe": "2.0.0"
-      }
-    },
-    "window-size": {
-      "version": "0.1.0",
-      "resolved": "http://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz",
-      "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
-      "dev": true
-    },
-    "wordwrap": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-1.0.0.tgz",
-      "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
-      "dev": true
-    },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
-    },
-    "write": {
-      "version": "0.2.1",
-      "resolved": "http://registry.npm.taobao.org/write/download/write-0.2.1.tgz",
-      "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
-      "dev": true,
-      "requires": {
-        "mkdirp": "0.5.1"
-      }
-    },
-    "xtend": {
-      "version": "4.0.1",
-      "resolved": "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz",
-      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
-      "dev": true
-    },
-    "yallist": {
-      "version": "2.1.2",
-      "resolved": "http://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz",
-      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
-      "dev": true
-    },
-    "yargs": {
-      "version": "3.10.0",
-      "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz",
-      "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
-      "dev": true,
-      "requires": {
-        "camelcase": "1.2.1",
-        "cliui": "2.1.0",
-        "decamelize": "1.2.0",
-        "window-size": "0.1.0"
-      }
     }
   }
 }
diff --git a/package.json b/package.json
index 4d8e8dece..d3c50359f 100644
--- a/package.json
+++ b/package.json
@@ -1,54 +1,74 @@
 {
   "name": "wepy",
-  "version": "1.1.8",
+  "version": "0.0.0",
   "description": "",
-  "main": "lib/wepy.js",
+  "main": "",
   "scripts": {
-    "docs": "cd docs && node server.js",
-    "prepublish": "npm run build",
-    "bootstrap": "sh ./scripts/bootstrap.sh && npm run build",
-    "build": "node ./node_modules/gulp/bin/gulp build",
-    "watch-compile": "npm run build -- --watch",
-    "watch": "node ./node_modules/gulp/bin/gulp watch",
-    "test": "sh ./scripts/test.sh",
-    "clean": "sh ./scripts/clean.sh",
-    "publish": "npm run clean && npm run build && npm run test && sh ./node_modules/.bin/lerna publish --only-explicit-updates"
+    "lint": "eslint ./ --ext .js",
+    "dev": "chokidar '**/*.wpy' '**/*.js' -c 'npm run dev:all' -i '/dist/'",
+    "build": "node ./scripts/build.js",
+    "build:core": "rollup -w -c scripts/config.js --environment TARGET:core",
+    "bootstrap": "./node_modules/.bin/lerna bootstrap --loglevel silly",
+    "bootstrap:prod": "./node_modules/.bin/lerna bootstrap --loglevel -- --production --no-optional",
+    "test": "npm run lint -- --fix && npm run test:cov",
+    "test:unit": "node ./test/unit.js",
+    "test:cov": "nyc npm run test:unit",
+    "test:build": "./test/build.sh",
+    "clean": "node ./scripts/clean.js",
+    "view": "./node_modules/.bin/verpub view -l",
+    "release": "./node_modules/.bin/verpub publish",
+    "release:dry": "./node_modules/.bin/verpub publish --dry-run",
+    "changelog": "lerna-changelog",
+    "commit": "git cz"
   },
   "repository": {
     "type": "git",
-    "url": "git@github.com:wepyjs/wepy.git"
+    "url": "git@github.com:Tencent/wepy.git"
   },
   "author": "Gcaufy",
   "license": "MIT",
   "bugs": {
-    "url": "https://github.com/wepyjs/wepy/issues"
+    "url": "https://github.com/Tencent/wepy/issues"
   },
-  "homepage": "https://github.com/wepyjs/wepy#readme",
+  "homepage": "https://github.com/Tencent/wepy#readme",
   "devDependencies": {
     "babel": "^6.5.2",
     "babel-cli": "^6.18.0",
     "babel-eslint": "^7.1.1",
     "babel-preset-es2015": "^6.18.0",
     "babel-preset-stage-1": "^6.16.0",
+    "chai": "^4.1.2",
     "chalk": "^1.1.3",
-    "eslint": "^3.11.1",
-    "gulp": "^3.9.1",
-    "gulp-babel": "^6.1.2",
-    "gulp-if": "^2.0.2",
-    "gulp-less": "^3.3.2",
-    "gulp-line-ending-corrector": "^1.0.1",
-    "gulp-newer": "^1.3.0",
-    "gulp-plumber": "^1.1.0",
-    "gulp-util": "^3.0.7",
-    "gulp-watch": "^4.3.11",
+    "chokidar": "^3.4.0",
+    "commitizen": "^3.1.1",
+    "cz-conventional-changelog": "^2.1.0",
+    "enquirer": "^2.3.0",
+    "eslint": "^7.5.0",
+    "eslint-config-prettier": "^6.10.0",
+    "eslint-plugin-prettier": "^3.1.2",
+    "esm": "^3.2.25",
+    "event-stream": "3.3.4",
+    "fs-extra": "^5.0.0",
+    "husky": "^1.3.1",
     "istanbul": "^0.4.5",
     "jsonlint": "^1.6.2",
-    "lerna": "2.0.0-beta.31",
-    "less": "^2.7.3",
+    "learn": "^0.1.5",
+    "lerna": "^3.22.1",
+    "lerna-changelog": "^1.0.1",
+    "less": "^3.9.0",
     "mkpath": "^1.0.0",
-    "mocha": "^3.2.0",
+    "mocha": "^6.2.3",
+    "nyc": "^15.0.0",
+    "prettier": "^1.18.2",
+    "read-pkg": "^4.0.1",
+    "rimraf": "^3.0.2",
+    "rollup": "^0.56.5",
+    "rollup-plugin-buble": "^0.19.2",
+    "rollup-plugin-replace": "^2.0.0",
     "serve-static": "^1.11.1",
-    "through2": "^2.0.3"
+    "through2": "^2.0.3",
+    "validate-commit-msg": "^2.14.0",
+    "verpub": "^0.1.2"
   },
   "babel": {
     "comments": false,
@@ -74,5 +94,47 @@
       }
     }
   },
-  "dependencies": {}
+  "engines": {
+    "node": ">=8.9.4"
+  },
+  "husky": {
+    "hooks": {
+      "pre-commit": "npm run lint",
+      "pre-push": "npm run test",
+      "commit-msg": "npx validate-commit-msg"
+    }
+  },
+  "changelog": {
+    "labels": {
+      "feat": ":rocket: New Feature",
+      "bug": ":bug: Bug Fix",
+      "doc": ":memo: Documentation",
+      "internal": ":house: Internal",
+      "breaking": ":boom: Breaking Change"
+    }
+  },
+  "config": {
+    "validate-commit-msg": {
+      "helpMessage": "\nPlease fix your commit message (and consider using http://npm.im/commitizen)\n",
+      "types": [
+        "feat",
+        "fix",
+        "docs",
+        "style",
+        "refactor",
+        "perf",
+        "test",
+        "chore",
+        "revert",
+        "build",
+        "release",
+        "custom"
+      ],
+      "warnOnFail": false,
+      "autoFix": true
+    },
+    "commitizen": {
+      "path": "./node_modules/cz-conventional-changelog"
+    }
+  }
 }
diff --git a/packages/babel-plugin-import-regenerator/CHANGELOG.md b/packages/babel-plugin-import-regenerator/CHANGELOG.md
new file mode 100644
index 000000000..a56264efa
--- /dev/null
+++ b/packages/babel-plugin-import-regenerator/CHANGELOG.md
@@ -0,0 +1,64 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# 2.1.0 (2020-07-04)
+
+**Note:** Version bump only for package @wepy/babel-plugin-import-regenerator
+
+
+
+
+
+# 2.1.0-alpha.10 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/babel-plugin-import-regenerator
+
+
+
+
+
+# 2.1.0-alpha.9 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/babel-plugin-import-regenerator
+
+
+
+
+
+# 2.1.0-alpha.8 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/babel-plugin-import-regenerator
+
+
+
+
+
+# 2.1.0-alpha.7 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/babel-plugin-import-regenerator
+
+
+
+
+
+# 2.1.0-alpha.6 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/babel-plugin-import-regenerator
+
+
+
+
+
+# 2.1.0-alpha.5 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/babel-plugin-import-regenerator
+
+
+
+
+
+# [2.1.0-alpha.4](https://github.com/Tencent/wepy/compare/v2.1.0-alpha.2...v2.1.0-alpha.4) (2020-06-20)
+
+**Note:** Version bump only for package @wepy/babel-plugin-import-regenerator
diff --git a/packages/babel-plugin-import-regenerator/README.md b/packages/babel-plugin-import-regenerator/README.md
new file mode 100644
index 000000000..98ad9d372
--- /dev/null
+++ b/packages/babel-plugin-import-regenerator/README.md
@@ -0,0 +1,41 @@
+[English](./README_EN.md) | [简体中文]
+
+# @wepy/babel-plugin-import-regenerator
+
+允许wepy使用 `Async Functions`.
+
+## 安装
+
+```
+# Install regenerator-runtime dependence
+$ npm install regenerator-runtime --save
+
+# Install babel plugin 
+$ npm install @wepy/babel-plugin-import-regenerator --save-dev
+```
+
+## 用法
+
+在 wepy.config.js 中放入以下内容:
+
+
+```js
+
+{
+  ....
+    compilers: {
+      babel: {
+        presets: [
+          '@babel/preset-env'
+        ],
+        plugins: [
+          '@wepy/babel-plugin-import-regenerator'
+        ]
+      }
+    }
+}
+```
+
+## License
+
+MIT
diff --git a/packages/babel-plugin-import-regenerator/README_EN.md b/packages/babel-plugin-import-regenerator/README_EN.md
new file mode 100644
index 000000000..9aacc0b94
--- /dev/null
+++ b/packages/babel-plugin-import-regenerator/README_EN.md
@@ -0,0 +1,41 @@
+English | [简体中文](./README.md)
+
+# @wepy/babel-plugin-import-regenerator
+
+Allow wepy to use `Async Functions`.
+
+## Installation
+
+```
+# Install regenerator-runtime dependence
+$ npm install regenerator-runtime --save
+
+# Install babel plugin 
+$ npm install @wepy/babel-plugin-import-regenerator --save-dev
+```
+
+## Usage
+
+Put something like this in your wepy.config.js:
+
+
+```js
+
+{
+  ....
+    compilers: {
+      babel: {
+        presets: [
+          '@babel/preset-env'
+        ],
+        plugins: [
+          '@wepy/babel-plugin-import-regenerator'
+        ]
+      }
+    }
+}
+```
+
+## License
+
+MIT
diff --git a/packages/babel-plugin-import-regenerator/index.js b/packages/babel-plugin-import-regenerator/index.js
new file mode 100644
index 000000000..653c95300
--- /dev/null
+++ b/packages/babel-plugin-import-regenerator/index.js
@@ -0,0 +1,32 @@
+const helperModelImports = require('@babel/helper-module-imports');
+
+let wm = new WeakMap();
+
+exports = module.exports = ({ types: t }) => {
+  return {
+    visitor: {
+      CallExpression(path) {
+        let callee = path.get('callee');
+
+        if (callee.node && callee.node.object && callee.node.property) {
+          if (t.isIdentifier(callee.node.object, { name: 'regeneratorRuntime' })) {
+            let programPath = path.scope.getProgramParent().path;
+            let runtimeId;
+
+            if (wm.has(programPath.node)) {
+              runtimeId = t.identifier(wm.get(programPath.node));
+            } else {
+              runtimeId = helperModelImports.addDefault(programPath, 'regenerator-runtime', {
+                nameHint: 'regeneratorRuntime',
+                importedInterop: 'uncompiled',
+                blockHoist: 3
+              });
+              wm.set(programPath.node, runtimeId.name);
+            }
+            callee.node.object.name = runtimeId.name;
+          }
+        }
+      }
+    }
+  };
+};
diff --git a/packages/babel-plugin-import-regenerator/package-lock.json b/packages/babel-plugin-import-regenerator/package-lock.json
new file mode 100644
index 000000000..e77b18c13
--- /dev/null
+++ b/packages/babel-plugin-import-regenerator/package-lock.json
@@ -0,0 +1,1179 @@
+{
+	"name": "@wepy/babel-plugin-import-regenerator",
+	"version": "2.1.0",
+	"lockfileVersion": 1,
+	"requires": true,
+	"dependencies": {
+		"@babel/code-frame": {
+			"version": "7.8.3",
+			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
+			"integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+			"dev": true,
+			"requires": {
+				"@babel/highlight": "^7.8.3"
+			}
+		},
+		"@babel/core": {
+			"version": "7.9.0",
+			"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz",
+			"integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==",
+			"dev": true,
+			"requires": {
+				"@babel/code-frame": "^7.8.3",
+				"@babel/generator": "^7.9.0",
+				"@babel/helper-module-transforms": "^7.9.0",
+				"@babel/helpers": "^7.9.0",
+				"@babel/parser": "^7.9.0",
+				"@babel/template": "^7.8.6",
+				"@babel/traverse": "^7.9.0",
+				"@babel/types": "^7.9.0",
+				"convert-source-map": "^1.7.0",
+				"debug": "^4.1.0",
+				"gensync": "^1.0.0-beta.1",
+				"json5": "^2.1.2",
+				"lodash": "^4.17.13",
+				"resolve": "^1.3.2",
+				"semver": "^5.4.1",
+				"source-map": "^0.5.0"
+			}
+		},
+		"@babel/generator": {
+			"version": "7.9.5",
+			"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz",
+			"integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==",
+			"dev": true,
+			"requires": {
+				"@babel/types": "^7.9.5",
+				"jsesc": "^2.5.1",
+				"lodash": "^4.17.13",
+				"source-map": "^0.5.0"
+			}
+		},
+		"@babel/helper-function-name": {
+			"version": "7.9.5",
+			"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz",
+			"integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==",
+			"dev": true,
+			"requires": {
+				"@babel/helper-get-function-arity": "^7.8.3",
+				"@babel/template": "^7.8.3",
+				"@babel/types": "^7.9.5"
+			}
+		},
+		"@babel/helper-get-function-arity": {
+			"version": "7.8.3",
+			"resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
+			"integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+			"dev": true,
+			"requires": {
+				"@babel/types": "^7.8.3"
+			}
+		},
+		"@babel/helper-member-expression-to-functions": {
+			"version": "7.8.3",
+			"resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz",
+			"integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==",
+			"dev": true,
+			"requires": {
+				"@babel/types": "^7.8.3"
+			}
+		},
+		"@babel/helper-module-imports": {
+			"version": "7.8.3",
+			"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz",
+			"integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==",
+			"requires": {
+				"@babel/types": "^7.8.3"
+			}
+		},
+		"@babel/helper-module-transforms": {
+			"version": "7.9.0",
+			"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz",
+			"integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==",
+			"dev": true,
+			"requires": {
+				"@babel/helper-module-imports": "^7.8.3",
+				"@babel/helper-replace-supers": "^7.8.6",
+				"@babel/helper-simple-access": "^7.8.3",
+				"@babel/helper-split-export-declaration": "^7.8.3",
+				"@babel/template": "^7.8.6",
+				"@babel/types": "^7.9.0",
+				"lodash": "^4.17.13"
+			}
+		},
+		"@babel/helper-optimise-call-expression": {
+			"version": "7.8.3",
+			"resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz",
+			"integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==",
+			"dev": true,
+			"requires": {
+				"@babel/types": "^7.8.3"
+			}
+		},
+		"@babel/helper-replace-supers": {
+			"version": "7.8.6",
+			"resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz",
+			"integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==",
+			"dev": true,
+			"requires": {
+				"@babel/helper-member-expression-to-functions": "^7.8.3",
+				"@babel/helper-optimise-call-expression": "^7.8.3",
+				"@babel/traverse": "^7.8.6",
+				"@babel/types": "^7.8.6"
+			}
+		},
+		"@babel/helper-simple-access": {
+			"version": "7.8.3",
+			"resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz",
+			"integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==",
+			"dev": true,
+			"requires": {
+				"@babel/template": "^7.8.3",
+				"@babel/types": "^7.8.3"
+			}
+		},
+		"@babel/helper-split-export-declaration": {
+			"version": "7.8.3",
+			"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
+			"integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+			"dev": true,
+			"requires": {
+				"@babel/types": "^7.8.3"
+			}
+		},
+		"@babel/helper-validator-identifier": {
+			"version": "7.9.5",
+			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz",
+			"integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g=="
+		},
+		"@babel/helpers": {
+			"version": "7.9.2",
+			"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz",
+			"integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==",
+			"dev": true,
+			"requires": {
+				"@babel/template": "^7.8.3",
+				"@babel/traverse": "^7.9.0",
+				"@babel/types": "^7.9.0"
+			}
+		},
+		"@babel/highlight": {
+			"version": "7.9.0",
+			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
+			"integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
+			"dev": true,
+			"requires": {
+				"@babel/helper-validator-identifier": "^7.9.0",
+				"chalk": "^2.0.0",
+				"js-tokens": "^4.0.0"
+			}
+		},
+		"@babel/parser": {
+			"version": "7.9.4",
+			"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
+			"integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==",
+			"dev": true
+		},
+		"@babel/template": {
+			"version": "7.8.6",
+			"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
+			"integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+			"dev": true,
+			"requires": {
+				"@babel/code-frame": "^7.8.3",
+				"@babel/parser": "^7.8.6",
+				"@babel/types": "^7.8.6"
+			}
+		},
+		"@babel/traverse": {
+			"version": "7.9.5",
+			"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz",
+			"integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==",
+			"dev": true,
+			"requires": {
+				"@babel/code-frame": "^7.8.3",
+				"@babel/generator": "^7.9.5",
+				"@babel/helper-function-name": "^7.9.5",
+				"@babel/helper-split-export-declaration": "^7.8.3",
+				"@babel/parser": "^7.9.0",
+				"@babel/types": "^7.9.5",
+				"debug": "^4.1.0",
+				"globals": "^11.1.0",
+				"lodash": "^4.17.13"
+			}
+		},
+		"@babel/types": {
+			"version": "7.9.5",
+			"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
+			"integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
+			"requires": {
+				"@babel/helper-validator-identifier": "^7.9.5",
+				"lodash": "^4.17.13",
+				"to-fast-properties": "^2.0.0"
+			}
+		},
+		"ansi-regex": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+			"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+			"dev": true
+		},
+		"ansi-styles": {
+			"version": "3.2.1",
+			"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+			"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+			"dev": true,
+			"requires": {
+				"color-convert": "^1.9.0"
+			}
+		},
+		"assertion-error": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+			"integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+			"dev": true
+		},
+		"babel-code-frame": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+			"integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+			"dev": true,
+			"requires": {
+				"chalk": "^1.1.3",
+				"esutils": "^2.0.2",
+				"js-tokens": "^3.0.2"
+			},
+			"dependencies": {
+				"ansi-styles": {
+					"version": "2.2.1",
+					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+					"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+					"dev": true
+				},
+				"chalk": {
+					"version": "1.1.3",
+					"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+					"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+					"dev": true,
+					"requires": {
+						"ansi-styles": "^2.2.1",
+						"escape-string-regexp": "^1.0.2",
+						"has-ansi": "^2.0.0",
+						"strip-ansi": "^3.0.0",
+						"supports-color": "^2.0.0"
+					}
+				},
+				"js-tokens": {
+					"version": "3.0.2",
+					"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+					"integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+					"dev": true
+				},
+				"supports-color": {
+					"version": "2.0.0",
+					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+					"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+					"dev": true
+				}
+			}
+		},
+		"babel-helper-builder-binary-assignment-operator-visitor": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
+			"integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+			"dev": true,
+			"requires": {
+				"babel-helper-explode-assignable-expression": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-call-delegate": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+			"integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+			"dev": true,
+			"requires": {
+				"babel-helper-hoist-variables": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-define-map": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+			"integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+			"dev": true,
+			"requires": {
+				"babel-helper-function-name": "^6.24.1",
+				"babel-runtime": "^6.26.0",
+				"babel-types": "^6.26.0",
+				"lodash": "^4.17.4"
+			}
+		},
+		"babel-helper-explode-assignable-expression": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
+			"integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-function-name": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+			"integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+			"dev": true,
+			"requires": {
+				"babel-helper-get-function-arity": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-get-function-arity": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+			"integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-hoist-variables": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+			"integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-optimise-call-expression": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+			"integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-regex": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+			"integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.26.0",
+				"babel-types": "^6.26.0",
+				"lodash": "^4.17.4"
+			}
+		},
+		"babel-helper-remap-async-to-generator": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
+			"integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
+			"dev": true,
+			"requires": {
+				"babel-helper-function-name": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-replace-supers": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+			"integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+			"dev": true,
+			"requires": {
+				"babel-helper-optimise-call-expression": "^6.24.1",
+				"babel-messages": "^6.23.0",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-messages": {
+			"version": "6.23.0",
+			"resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+			"integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-check-es2015-constants": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+			"integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-syntax-async-functions": {
+			"version": "6.13.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+			"integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
+			"dev": true
+		},
+		"babel-plugin-syntax-exponentiation-operator": {
+			"version": "6.13.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+			"integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
+			"dev": true
+		},
+		"babel-plugin-syntax-trailing-function-commas": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
+			"integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
+			"dev": true
+		},
+		"babel-plugin-transform-async-to-generator": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
+			"integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
+			"dev": true,
+			"requires": {
+				"babel-helper-remap-async-to-generator": "^6.24.1",
+				"babel-plugin-syntax-async-functions": "^6.8.0",
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-arrow-functions": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+			"integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-block-scoped-functions": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+			"integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-block-scoping": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+			"integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.26.0",
+				"babel-template": "^6.26.0",
+				"babel-traverse": "^6.26.0",
+				"babel-types": "^6.26.0",
+				"lodash": "^4.17.4"
+			}
+		},
+		"babel-plugin-transform-es2015-classes": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+			"integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+			"dev": true,
+			"requires": {
+				"babel-helper-define-map": "^6.24.1",
+				"babel-helper-function-name": "^6.24.1",
+				"babel-helper-optimise-call-expression": "^6.24.1",
+				"babel-helper-replace-supers": "^6.24.1",
+				"babel-messages": "^6.23.0",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-computed-properties": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+			"integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-destructuring": {
+			"version": "6.23.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+			"integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-duplicate-keys": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+			"integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-for-of": {
+			"version": "6.23.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+			"integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-function-name": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+			"integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+			"dev": true,
+			"requires": {
+				"babel-helper-function-name": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-literals": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+			"integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-modules-amd": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+			"integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+			"dev": true,
+			"requires": {
+				"babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-modules-commonjs": {
+			"version": "6.26.2",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
+			"integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
+			"dev": true,
+			"requires": {
+				"babel-plugin-transform-strict-mode": "^6.24.1",
+				"babel-runtime": "^6.26.0",
+				"babel-template": "^6.26.0",
+				"babel-types": "^6.26.0"
+			}
+		},
+		"babel-plugin-transform-es2015-modules-systemjs": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+			"integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+			"dev": true,
+			"requires": {
+				"babel-helper-hoist-variables": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-modules-umd": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+			"integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+			"dev": true,
+			"requires": {
+				"babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-object-super": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+			"integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+			"dev": true,
+			"requires": {
+				"babel-helper-replace-supers": "^6.24.1",
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-parameters": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+			"integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+			"dev": true,
+			"requires": {
+				"babel-helper-call-delegate": "^6.24.1",
+				"babel-helper-get-function-arity": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-shorthand-properties": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+			"integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-spread": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+			"integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-sticky-regex": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+			"integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+			"dev": true,
+			"requires": {
+				"babel-helper-regex": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-template-literals": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+			"integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-typeof-symbol": {
+			"version": "6.23.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+			"integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-unicode-regex": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+			"integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+			"dev": true,
+			"requires": {
+				"babel-helper-regex": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"regexpu-core": "^2.0.0"
+			}
+		},
+		"babel-plugin-transform-exponentiation-operator": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
+			"integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+			"dev": true,
+			"requires": {
+				"babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
+				"babel-plugin-syntax-exponentiation-operator": "^6.8.0",
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-regenerator": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+			"integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+			"dev": true,
+			"requires": {
+				"regenerator-transform": "^0.10.0"
+			}
+		},
+		"babel-plugin-transform-strict-mode": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+			"integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-preset-env": {
+			"version": "1.7.0",
+			"resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz",
+			"integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==",
+			"dev": true,
+			"requires": {
+				"babel-plugin-check-es2015-constants": "^6.22.0",
+				"babel-plugin-syntax-trailing-function-commas": "^6.22.0",
+				"babel-plugin-transform-async-to-generator": "^6.22.0",
+				"babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
+				"babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
+				"babel-plugin-transform-es2015-block-scoping": "^6.23.0",
+				"babel-plugin-transform-es2015-classes": "^6.23.0",
+				"babel-plugin-transform-es2015-computed-properties": "^6.22.0",
+				"babel-plugin-transform-es2015-destructuring": "^6.23.0",
+				"babel-plugin-transform-es2015-duplicate-keys": "^6.22.0",
+				"babel-plugin-transform-es2015-for-of": "^6.23.0",
+				"babel-plugin-transform-es2015-function-name": "^6.22.0",
+				"babel-plugin-transform-es2015-literals": "^6.22.0",
+				"babel-plugin-transform-es2015-modules-amd": "^6.22.0",
+				"babel-plugin-transform-es2015-modules-commonjs": "^6.23.0",
+				"babel-plugin-transform-es2015-modules-systemjs": "^6.23.0",
+				"babel-plugin-transform-es2015-modules-umd": "^6.23.0",
+				"babel-plugin-transform-es2015-object-super": "^6.22.0",
+				"babel-plugin-transform-es2015-parameters": "^6.23.0",
+				"babel-plugin-transform-es2015-shorthand-properties": "^6.22.0",
+				"babel-plugin-transform-es2015-spread": "^6.22.0",
+				"babel-plugin-transform-es2015-sticky-regex": "^6.22.0",
+				"babel-plugin-transform-es2015-template-literals": "^6.22.0",
+				"babel-plugin-transform-es2015-typeof-symbol": "^6.23.0",
+				"babel-plugin-transform-es2015-unicode-regex": "^6.22.0",
+				"babel-plugin-transform-exponentiation-operator": "^6.22.0",
+				"babel-plugin-transform-regenerator": "^6.22.0",
+				"browserslist": "^3.2.6",
+				"invariant": "^2.2.2",
+				"semver": "^5.3.0"
+			}
+		},
+		"babel-runtime": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+			"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+			"dev": true,
+			"requires": {
+				"core-js": "^2.4.0",
+				"regenerator-runtime": "^0.11.0"
+			}
+		},
+		"babel-template": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+			"integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.26.0",
+				"babel-traverse": "^6.26.0",
+				"babel-types": "^6.26.0",
+				"babylon": "^6.18.0",
+				"lodash": "^4.17.4"
+			}
+		},
+		"babel-traverse": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+			"integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+			"dev": true,
+			"requires": {
+				"babel-code-frame": "^6.26.0",
+				"babel-messages": "^6.23.0",
+				"babel-runtime": "^6.26.0",
+				"babel-types": "^6.26.0",
+				"babylon": "^6.18.0",
+				"debug": "^2.6.8",
+				"globals": "^9.18.0",
+				"invariant": "^2.2.2",
+				"lodash": "^4.17.4"
+			},
+			"dependencies": {
+				"debug": {
+					"version": "2.6.9",
+					"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+					"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+					"dev": true,
+					"requires": {
+						"ms": "2.0.0"
+					}
+				},
+				"globals": {
+					"version": "9.18.0",
+					"resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+					"integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+					"dev": true
+				},
+				"ms": {
+					"version": "2.0.0",
+					"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+					"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+					"dev": true
+				}
+			}
+		},
+		"babel-types": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+			"integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.26.0",
+				"esutils": "^2.0.2",
+				"lodash": "^4.17.4",
+				"to-fast-properties": "^1.0.3"
+			},
+			"dependencies": {
+				"to-fast-properties": {
+					"version": "1.0.3",
+					"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+					"integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+					"dev": true
+				}
+			}
+		},
+		"babylon": {
+			"version": "6.18.0",
+			"resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+			"integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+			"dev": true
+		},
+		"browserslist": {
+			"version": "3.2.8",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
+			"integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
+			"dev": true,
+			"requires": {
+				"caniuse-lite": "^1.0.30000844",
+				"electron-to-chromium": "^1.3.47"
+			}
+		},
+		"caniuse-lite": {
+			"version": "1.0.30001039",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz",
+			"integrity": "sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q==",
+			"dev": true
+		},
+		"chai": {
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
+			"integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
+			"dev": true,
+			"requires": {
+				"assertion-error": "^1.1.0",
+				"check-error": "^1.0.2",
+				"deep-eql": "^3.0.1",
+				"get-func-name": "^2.0.0",
+				"pathval": "^1.1.0",
+				"type-detect": "^4.0.5"
+			}
+		},
+		"chalk": {
+			"version": "2.4.2",
+			"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+			"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+			"dev": true,
+			"requires": {
+				"ansi-styles": "^3.2.1",
+				"escape-string-regexp": "^1.0.5",
+				"supports-color": "^5.3.0"
+			}
+		},
+		"check-error": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+			"integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+			"dev": true
+		},
+		"color-convert": {
+			"version": "1.9.3",
+			"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+			"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+			"dev": true,
+			"requires": {
+				"color-name": "1.1.3"
+			}
+		},
+		"color-name": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+			"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+			"dev": true
+		},
+		"convert-source-map": {
+			"version": "1.7.0",
+			"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+			"integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+			"dev": true,
+			"requires": {
+				"safe-buffer": "~5.1.1"
+			}
+		},
+		"core-js": {
+			"version": "2.6.11",
+			"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
+			"integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
+			"dev": true
+		},
+		"debug": {
+			"version": "4.1.1",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+			"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+			"dev": true,
+			"requires": {
+				"ms": "^2.1.1"
+			}
+		},
+		"deep-eql": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+			"integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+			"dev": true,
+			"requires": {
+				"type-detect": "^4.0.0"
+			}
+		},
+		"electron-to-chromium": {
+			"version": "1.3.398",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.398.tgz",
+			"integrity": "sha512-BJjxuWLKFbM5axH3vES7HKMQgAknq9PZHBkMK/rEXUQG9i1Iw5R+6hGkm6GtsQSANjSUrh/a6m32nzCNDNo/+w==",
+			"dev": true
+		},
+		"escape-string-regexp": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+			"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+			"dev": true
+		},
+		"esutils": {
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+			"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+			"dev": true
+		},
+		"gensync": {
+			"version": "1.0.0-beta.1",
+			"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
+			"integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==",
+			"dev": true
+		},
+		"get-func-name": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+			"integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+			"dev": true
+		},
+		"globals": {
+			"version": "11.12.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+			"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+			"dev": true
+		},
+		"has-ansi": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+			"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+			"dev": true,
+			"requires": {
+				"ansi-regex": "^2.0.0"
+			}
+		},
+		"has-flag": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+			"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+			"dev": true
+		},
+		"invariant": {
+			"version": "2.2.4",
+			"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+			"integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+			"dev": true,
+			"requires": {
+				"loose-envify": "^1.0.0"
+			}
+		},
+		"js-tokens": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+			"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+			"dev": true
+		},
+		"jsesc": {
+			"version": "2.5.2",
+			"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+			"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+			"dev": true
+		},
+		"json5": {
+			"version": "2.1.3",
+			"resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+			"integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+			"dev": true,
+			"requires": {
+				"minimist": "^1.2.5"
+			}
+		},
+		"lodash": {
+			"version": "4.17.21",
+			"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+			"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+		},
+		"loose-envify": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+			"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+			"dev": true,
+			"requires": {
+				"js-tokens": "^3.0.0 || ^4.0.0"
+			}
+		},
+		"minimist": {
+			"version": "1.2.6",
+			"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+			"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
+			"dev": true
+		},
+		"ms": {
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+			"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+			"dev": true
+		},
+		"path-parse": {
+			"version": "1.0.7",
+			"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+			"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+			"dev": true
+		},
+		"pathval": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+			"integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+			"dev": true
+		},
+		"private": {
+			"version": "0.1.8",
+			"resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+			"integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+			"dev": true
+		},
+		"regenerate": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
+			"integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
+			"dev": true
+		},
+		"regenerator-runtime": {
+			"version": "0.11.1",
+			"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+			"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+			"dev": true
+		},
+		"regenerator-transform": {
+			"version": "0.10.1",
+			"resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+			"integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.18.0",
+				"babel-types": "^6.19.0",
+				"private": "^0.1.6"
+			}
+		},
+		"regexpu-core": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+			"integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+			"dev": true,
+			"requires": {
+				"regenerate": "^1.2.1",
+				"regjsgen": "^0.2.0",
+				"regjsparser": "^0.1.4"
+			}
+		},
+		"regjsgen": {
+			"version": "0.2.0",
+			"resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+			"integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+			"dev": true
+		},
+		"regjsparser": {
+			"version": "0.1.5",
+			"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+			"integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+			"dev": true,
+			"requires": {
+				"jsesc": "~0.5.0"
+			},
+			"dependencies": {
+				"jsesc": {
+					"version": "0.5.0",
+					"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+					"integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+					"dev": true
+				}
+			}
+		},
+		"resolve": {
+			"version": "1.15.1",
+			"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+			"integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+			"dev": true,
+			"requires": {
+				"path-parse": "^1.0.6"
+			}
+		},
+		"safe-buffer": {
+			"version": "5.1.2",
+			"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+			"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+			"dev": true
+		},
+		"semver": {
+			"version": "5.7.1",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+			"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+			"dev": true
+		},
+		"source-map": {
+			"version": "0.5.7",
+			"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+			"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+			"dev": true
+		},
+		"strip-ansi": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+			"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+			"dev": true,
+			"requires": {
+				"ansi-regex": "^2.0.0"
+			}
+		},
+		"supports-color": {
+			"version": "5.5.0",
+			"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+			"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+			"dev": true,
+			"requires": {
+				"has-flag": "^3.0.0"
+			}
+		},
+		"to-fast-properties": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+			"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+		},
+		"type-detect": {
+			"version": "4.0.8",
+			"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+			"integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+			"dev": true
+		}
+	}
+}
diff --git a/packages/babel-plugin-import-regenerator/package.json b/packages/babel-plugin-import-regenerator/package.json
new file mode 100644
index 000000000..9374f1c24
--- /dev/null
+++ b/packages/babel-plugin-import-regenerator/package.json
@@ -0,0 +1,36 @@
+{
+  "name": "@wepy/babel-plugin-import-regenerator",
+  "version": "2.1.0",
+  "description": "A babel plugin to add a global generator import",
+  "main": "index.js",
+  "scripts": {
+    "test": "mocha ./test/*.test.js"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/Tencent/wepy.git"
+  },
+  "keywords": [
+    "regenerator-runtime"
+  ],
+  "author": {
+    "name": "Gcaufy"
+  },
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/Tencent/wepy/issues"
+  },
+  "homepage": "https://github.com/Tencent/wepy#readme",
+  "dependencies": {
+    "@babel/helper-module-imports": "^7.0.0"
+  },
+  "devDependencies": {
+    "@babel/core": "^7.1.0",
+    "babel-preset-env": "^1.7.0",
+    "chai": "^4.1.2"
+  },
+  "readme": "ERROR: No README data found!",
+  "_id": "@wepy/babel-plugin-import-regenerator@0.0.5",
+  "_commitid": "ebdaf08",
+  "gitHead": "5a25776457360bbbbc54a4d059f6bc7c032d5df3"
+}
diff --git a/packages/babel-plugin-import-regenerator/test/fixtures/mutiple-async/actual.js b/packages/babel-plugin-import-regenerator/test/fixtures/mutiple-async/actual.js
new file mode 100644
index 000000000..beddd3c9b
--- /dev/null
+++ b/packages/babel-plugin-import-regenerator/test/fixtures/mutiple-async/actual.js
@@ -0,0 +1,15 @@
+exports = module.exports = {
+  foo () {
+    return Promise.resolve(1);
+  },
+  async bar () {
+    console.log(await foo());
+  },
+  async bar2 () {
+    return await foo();
+  },
+  async bar3 () {
+    let result = await bar2();
+    console.log(result);
+  }
+}
diff --git a/packages/babel-plugin-import-regenerator/test/fixtures/mutiple-async/expected.js b/packages/babel-plugin-import-regenerator/test/fixtures/mutiple-async/expected.js
new file mode 100644
index 000000000..66b92f9cb
--- /dev/null
+++ b/packages/babel-plugin-import-regenerator/test/fixtures/mutiple-async/expected.js
@@ -0,0 +1,100 @@
+"use strict";
+
+var _regeneratorRuntime2 = require("regenerator-runtime");
+
+var _regeneratorRuntime3 = _interopRequireDefault(_regeneratorRuntime2);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
+
+function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+
+exports = module.exports = {
+  foo: function foo() {
+    return Promise.resolve(1);
+  },
+  bar: function () {
+    var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime3.default.mark(function _callee() {
+      return _regeneratorRuntime3.default.wrap(function _callee$(_context) {
+        while (1) {
+          switch (_context.prev = _context.next) {
+            case 0:
+              _context.t0 = console;
+              _context.next = 3;
+              return foo();
+
+            case 3:
+              _context.t1 = _context.sent;
+
+              _context.t0.log.call(_context.t0, _context.t1);
+
+            case 5:
+            case "end":
+              return _context.stop();
+          }
+        }
+      }, _callee, this);
+    }));
+
+    function bar() {
+      return _ref.apply(this, arguments);
+    }
+
+    return bar;
+  }(),
+  bar2: function () {
+    var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime3.default.mark(function _callee2() {
+      return _regeneratorRuntime3.default.wrap(function _callee2$(_context2) {
+        while (1) {
+          switch (_context2.prev = _context2.next) {
+            case 0:
+              _context2.next = 2;
+              return foo();
+
+            case 2:
+              return _context2.abrupt("return", _context2.sent);
+
+            case 3:
+            case "end":
+              return _context2.stop();
+          }
+        }
+      }, _callee2, this);
+    }));
+
+    function bar2() {
+      return _ref2.apply(this, arguments);
+    }
+
+    return bar2;
+  }(),
+  bar3: function () {
+    var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime3.default.mark(function _callee3() {
+      var result;
+      return _regeneratorRuntime3.default.wrap(function _callee3$(_context3) {
+        while (1) {
+          switch (_context3.prev = _context3.next) {
+            case 0:
+              _context3.next = 2;
+              return bar2();
+
+            case 2:
+              result = _context3.sent;
+              console.log(result);
+
+            case 4:
+            case "end":
+              return _context3.stop();
+          }
+        }
+      }, _callee3, this);
+    }));
+
+    function bar3() {
+      return _ref3.apply(this, arguments);
+    }
+
+    return bar3;
+  }()
+};
diff --git a/packages/babel-plugin-import-regenerator/test/fixtures/normal/actual.js b/packages/babel-plugin-import-regenerator/test/fixtures/normal/actual.js
new file mode 100644
index 000000000..dde154fe8
--- /dev/null
+++ b/packages/babel-plugin-import-regenerator/test/fixtures/normal/actual.js
@@ -0,0 +1,17 @@
+import wepy from '@wepy/core'
+
+wepy.page({
+  methods: {
+    sleep (s) {
+      return new Promise((resolve, reject) => {
+        setTimeout(() => {
+          resolve('promise resolved')
+        }, s * 1000)
+      })
+    },
+    async testAsync () {
+      const result = await this.sleep(3)
+      console.log(result)
+    }
+  }
+})
\ No newline at end of file
diff --git a/packages/babel-plugin-import-regenerator/test/fixtures/normal/expected.js b/packages/babel-plugin-import-regenerator/test/fixtures/normal/expected.js
new file mode 100644
index 000000000..4cb3ba0dd
--- /dev/null
+++ b/packages/babel-plugin-import-regenerator/test/fixtures/normal/expected.js
@@ -0,0 +1,55 @@
+"use strict";
+
+var _regeneratorRuntime2 = require("regenerator-runtime");
+
+var _regeneratorRuntime3 = _interopRequireDefault(_regeneratorRuntime2);
+
+var _core = require("@wepy/core");
+
+var _core2 = _interopRequireDefault(_core);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
+
+function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+
+_core2.default.page({
+  methods: {
+    sleep: function sleep(s) {
+      return new Promise(function (resolve, reject) {
+        setTimeout(function () {
+          resolve('promise resolved');
+        }, s * 1000);
+      });
+    },
+    testAsync: function () {
+      var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime3.default.mark(function _callee() {
+        var result;
+        return _regeneratorRuntime3.default.wrap(function _callee$(_context) {
+          while (1) {
+            switch (_context.prev = _context.next) {
+              case 0:
+                _context.next = 2;
+                return this.sleep(3);
+
+              case 2:
+                result = _context.sent;
+                console.log(result);
+
+              case 4:
+              case "end":
+                return _context.stop();
+            }
+          }
+        }, _callee, this);
+      }));
+
+      function testAsync() {
+        return _ref.apply(this, arguments);
+      }
+
+      return testAsync;
+    }()
+  }
+});
diff --git a/packages/babel-plugin-import-regenerator/test/index.test.js b/packages/babel-plugin-import-regenerator/test/index.test.js
new file mode 100644
index 000000000..93ac41e02
--- /dev/null
+++ b/packages/babel-plugin-import-regenerator/test/index.test.js
@@ -0,0 +1,25 @@
+const { transform } = require('@babel/core');
+const { readdirSync, readFileSync } = require('fs');
+const { join } = require('path');
+const plugin = require('../index');
+const expect = require('chai').expect;
+
+describe('babel-plugin-import-regenerator', () => {
+  let fixturesDir = join(__dirname, 'fixtures');
+  let fixtures = readdirSync(fixturesDir);
+
+  fixtures.forEach(caseName => {
+    const actualFile = join(fixturesDir, caseName, 'actual.js');
+    const expectedFile = join(fixturesDir, caseName, 'expected.js');
+
+    it(`should work with ${caseName.split('-').join(' ')}`, () => {
+      const actual = transform(readFileSync(actualFile), {
+        presets: ['env'],
+        plugins: [plugin]
+      }).code;
+
+      const expected = readFileSync(expectedFile, 'utf-8');
+      expect(actual.trim()).to.equal(expected.trim());
+    });
+  });
+});
diff --git a/packages/wepy-cli/.gitignore b/packages/cli/.gitignore
similarity index 100%
rename from packages/wepy-cli/.gitignore
rename to packages/cli/.gitignore
diff --git a/packages/wepy-cli/.npmignore b/packages/cli/.npmignore
similarity index 100%
rename from packages/wepy-cli/.npmignore
rename to packages/cli/.npmignore
diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md
new file mode 100644
index 000000000..06387b258
--- /dev/null
+++ b/packages/cli/CHANGELOG.md
@@ -0,0 +1,64 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# 2.1.0 (2020-07-04)
+
+**Note:** Version bump only for package @wepy/cli
+
+
+
+
+
+# 2.1.0-alpha.10 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/cli
+
+
+
+
+
+# 2.1.0-alpha.9 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/cli
+
+
+
+
+
+# 2.1.0-alpha.8 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/cli
+
+
+
+
+
+# 2.1.0-alpha.7 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/cli
+
+
+
+
+
+# 2.1.0-alpha.6 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/cli
+
+
+
+
+
+# 2.1.0-alpha.5 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/cli
+
+
+
+
+
+# [2.1.0-alpha.4](https://github.com/wepyjs/wepy/compare/v2.1.0-alpha.2...v2.1.0-alpha.4) (2020-06-20)
+
+**Note:** Version bump only for package @wepy/cli
diff --git a/packages/wepy-cli/README.md b/packages/cli/README.md
similarity index 100%
rename from packages/wepy-cli/README.md
rename to packages/cli/README.md
diff --git a/packages/cli/bin/cli/ask.js b/packages/cli/bin/cli/ask.js
new file mode 100644
index 000000000..e8c45ceec
--- /dev/null
+++ b/packages/cli/bin/cli/ask.js
@@ -0,0 +1,76 @@
+const async = require('async');
+const inquirer = require('inquirer');
+const evaluate = require('./eval');
+
+// Support types from prompt-for which was used before
+const promptMapping = {
+  string: 'input',
+  boolean: 'confirm'
+};
+
+/**
+ * Ask questions, return results.
+ *
+ * @param {Object} prompts
+ * @param {Object} data
+ * @param {Function} done
+ */
+
+exports = module.exports = function ask(prompts, data, done) {
+  async.eachSeries(
+    Object.keys(prompts),
+    (key, next) => {
+      prompt(data, key, prompts[key], next);
+    },
+    done
+  );
+};
+
+/**
+ * Inquirer prompt wrapper.
+ *
+ * @param {Object} data
+ * @param {String} key
+ * @param {Object} prompt
+ * @param {Function} done
+ */
+
+function prompt(data, key, prompt, done) {
+  // skip prompts whose when condition is not met
+  if (prompt.when && !evaluate(prompt.when, data)) {
+    return done();
+  }
+
+  let promptDefault = prompt.default;
+  if (typeof prompt.default === 'function') {
+    promptDefault = function() {
+      return prompt.default.bind(this)(data);
+    };
+  }
+
+  inquirer
+    .prompt([
+      {
+        type: promptMapping[prompt.type] || prompt.type,
+        name: key,
+        message: prompt.message || prompt.label || key,
+        default: promptDefault,
+        choices: prompt.choices || [],
+        validate: prompt.validate || (() => true)
+      }
+    ])
+    .then(answers => {
+      if (Array.isArray(answers[key])) {
+        data[key] = {};
+        answers[key].forEach(multiChoiceAnswer => {
+          data[key][multiChoiceAnswer] = true;
+        });
+      } else if (typeof answers[key] === 'string') {
+        data[key] = answers[key].replace(/"/g, '\\"');
+      } else {
+        data[key] = answers[key];
+      }
+      done();
+    })
+    .catch(done);
+}
diff --git a/packages/cli/bin/cli/check-version.js b/packages/cli/bin/cli/check-version.js
new file mode 100644
index 000000000..1723baa07
--- /dev/null
+++ b/packages/cli/bin/cli/check-version.js
@@ -0,0 +1,39 @@
+const semver = require('semver');
+const request = require('request');
+const chalk = require('chalk');
+const pkgConfig = require('../../package.json');
+
+exports = module.exports = function checkVersion() {
+  /**
+   * 检测当前node版本是否符合要求
+   */
+  return new Promise((resolve, reject) => {
+    if (!semver.satisfies(process.version, pkgConfig.engines.node)) {
+      // eslint-disable-next-line no-console
+      reject(new Error('  You must upgrade node to >=' + pkgConfig.engines.node + '.x to use @wepy/cli'));
+      return;
+    }
+    request(
+      {
+        url: 'https://registry.npmjs.org/@wepy/cli',
+        timeout: 1000
+      },
+      (err, res, body) => {
+        if (!err && res.statusCode === 200) {
+          const latestVersion = JSON.parse(body)['dist-tags'].latest;
+          const localVersion = pkgConfig.version;
+          if (semver.lt(localVersion, latestVersion)) {
+            /* eslint-disable no-console */
+            console.log(chalk.yellow('  A newer version of @wepy/cli is available.'));
+            console.log();
+            console.log('  latest:    ' + chalk.green(latestVersion));
+            console.log('  installed: ' + chalk.red(localVersion));
+            console.log();
+            /* eslint-enable no-console */
+          }
+        }
+        resolve(true);
+      }
+    );
+  });
+};
diff --git a/packages/cli/bin/cli/download.js b/packages/cli/bin/cli/download.js
new file mode 100644
index 000000000..482b5f2f0
--- /dev/null
+++ b/packages/cli/bin/cli/download.js
@@ -0,0 +1,45 @@
+const download = require('download');
+const downloadGitRepo = require('download-git-repo');
+
+/**
+ * download official template zip
+ * @param {*} template template name
+ */
+exports = module.exports = {
+  downloadOfficialZip(template, dist, options) {
+    const templateName = template.split('#')[0];
+    const branch = template.split('#')[1] || '2.0.x';
+    if (branch === '2.0.x') {
+      return this.downloadFromCos(templateName, dist, options).catch(() => {
+        return this.downloadFromGitRaw(branch, templateName, dist, options);
+      });
+    } else {
+      return this.downloadFromGitRaw(branch, templateName, dist, options);
+    }
+  },
+  downloadFromGitRaw(template, dist, options, branch = '2.0.x') {
+    const rawUrl = `https://raw.githubusercontent.com/wepyjs/wepy_templates/${branch}/zips/${template}.zip`;
+    return download(rawUrl, dist, options).catch(e => {
+      e.url = rawUrl;
+      throw e;
+    });
+  },
+  downloadFromCos(template, dist, options) {
+    const cosUrl = `https://wepy-templates-1251238373.cos.ap-guangzhou.myqcloud.com/${template}.zip`;
+    return download(cosUrl, dist, options).catch(e => {
+      e.url = cosUrl;
+      throw e;
+    });
+  },
+  downloadRepo(template, dist, opt) {
+    return new Promise((resolve, reject) => {
+      downloadGitRepo(template, dist, opt, err => {
+        if (err) {
+          reject(err);
+        } else {
+          resolve(true);
+        }
+      });
+    });
+  }
+};
diff --git a/packages/cli/bin/cli/eval.js b/packages/cli/bin/cli/eval.js
new file mode 100644
index 000000000..1cf0c086d
--- /dev/null
+++ b/packages/cli/bin/cli/eval.js
@@ -0,0 +1,13 @@
+/**
+ * Evaluate an expression in meta.json in the context of
+ * prompt answers data.
+ */
+exports = module.exports = function evaluate(exp, data) {
+  const fn = new Function('data', 'with (data) { return ' + exp + '}');
+  try {
+    return fn(data);
+  } catch (e) {
+    return null;
+    //console.error(chalk.red('Error when evaluating filter condition: ' + exp));
+  }
+};
diff --git a/packages/cli/bin/cli/filter.js b/packages/cli/bin/cli/filter.js
new file mode 100644
index 000000000..b9ba090f9
--- /dev/null
+++ b/packages/cli/bin/cli/filter.js
@@ -0,0 +1,20 @@
+const match = require('minimatch');
+const evaluate = require('./eval');
+
+exports = module.exports = function filter(files, filters, data, done) {
+  if (!filters) {
+    return done();
+  }
+  const fileNames = Object.keys(files);
+  Object.keys(filters).forEach(glob => {
+    fileNames.forEach(file => {
+      if (match(file, glob, { dot: true })) {
+        const condition = filters[glob];
+        if (!evaluate(condition, data)) {
+          delete files[file];
+        }
+      }
+    });
+  });
+  done();
+};
diff --git a/packages/cli/bin/cli/generate.js b/packages/cli/bin/cli/generate.js
new file mode 100644
index 000000000..b1f3074f8
--- /dev/null
+++ b/packages/cli/bin/cli/generate.js
@@ -0,0 +1,221 @@
+const chalk = require('chalk');
+const Metalsmith = require('metalsmith');
+const Handlebars = require('handlebars');
+const async = require('async');
+const ncp = require('ncp');
+const handlebars = require('consolidate').handlebars;
+const path = require('path');
+const multimatch = require('multimatch');
+const getOptions = require('./options');
+const ask = require('./ask');
+const filter = require('./filter');
+const logger = require('./logger');
+
+// register handlebars helper
+Handlebars.registerHelper('if_eq', function(a, b, opts) {
+  return a === b ? opts.fn(this) : opts.inverse(this);
+});
+
+Handlebars.registerHelper('unless_eq', function(a, b, opts) {
+  return a === b ? opts.inverse(this) : opts.fn(this);
+});
+
+/**
+ * Generate a template given a `src` and `dest`.
+ *
+ * @param {String} name
+ * @param {String} src
+ * @param {String} dest
+ * @param {Function} done
+ */
+
+exports = module.exports = function generate(name, src, dest, done) {
+  const opts = getOptions(name, src);
+
+  // This is a github project, and there is no meta.json or meta.js
+  if (opts.status === false) {
+    // Directly copy the project to dest.
+    ncp.ncp(src, dest, function(err) {
+      done(err);
+    });
+    return {};
+  }
+  const metalsmith = Metalsmith(path.join(src, 'template'));
+  const data = Object.assign(metalsmith.metadata(), {
+    destDirName: name,
+    inPlace: dest === process.cwd(),
+    noEscape: true
+  });
+  opts.helpers &&
+    Object.keys(opts.helpers).map(key => {
+      Handlebars.registerHelper(key, opts.helpers[key]);
+    });
+
+  const helpers = { chalk, logger };
+
+  if (opts.metalsmith && typeof opts.metalsmith.before === 'function') {
+    opts.metalsmith.before(metalsmith, opts, helpers);
+  }
+
+  metalsmith
+    .use((process.argv.indexOf('--no-interactive') > -1 ? buildInlineArgs : askQuestions)(opts.prompts))
+    .use(filterFiles(opts.filters))
+    .use(renderTemplateFiles(opts.skipInterpolation));
+
+  if (typeof opts.metalsmith === 'function') {
+    opts.metalsmith(metalsmith, opts, helpers);
+  } else if (opts.metalsmith && typeof opts.metalsmith.after === 'function') {
+    opts.metalsmith.after(metalsmith, opts, helpers);
+  }
+
+  metalsmith
+    .clean(false)
+    .source('.') // start = require('emplate root instead of `./src` which is Metalsmith's default for `source);
+    .destination(dest)
+    .build((err, files) => {
+      done(err);
+      if (typeof opts.complete === 'function') {
+        const helpers = { chalk, logger, files };
+        opts.complete(data, helpers);
+      } else {
+        logMessage(opts.completeMessage, data);
+      }
+    });
+
+  return data;
+};
+
+/**
+ * Create a middleware for asking questions.
+ *
+ * @param {Object} prompts
+ * @return {Function}
+ */
+
+function askQuestions(prompts) {
+  return (files, metalsmith, done) => {
+    ask(prompts, metalsmith.metadata(), done);
+  };
+}
+
+/**
+ * Get default value of a prompt item
+ *
+ * @param {String} value
+ * @return {Function}
+ */
+
+function getDefault(item) {
+  if (item.type === 'string') {
+    return item.default || '';
+  } else if (item.type === 'confirm') {
+    return item.default || true;
+  } else if (item.type === 'list') {
+    return item.default || item.choices[0];
+  } else {
+    throw new Error('Unrecongnize type: ' + item.type + ' in ' + JSON.stringify(item));
+  }
+}
+
+/**
+ * Create a middleware using inline arguments.
+ *
+ * @param {Object} prompts
+ * @return {Function}
+ */
+
+function buildInlineArgs(prompts) {
+  const inlineArgs = {};
+  for (const k in prompts) {
+    const argIndex = process.argv.indexOf('--' + k);
+    if (argIndex > -1) {
+      inlineArgs[k] = process.argv[argIndex + 1];
+    } else {
+      inlineArgs[k] = getDefault(prompts[k]);
+    }
+    // eslint-disable-next-line no-console
+    console.log([chalk.green('?'), chalk.bold(prompts[k].message), chalk.cyan(inlineArgs[k])].join(' '));
+  }
+  return (files, metalsmith, done) => {
+    Object.assign(metalsmith.metadata(), inlineArgs);
+    done();
+  };
+}
+
+/**
+ * Create a middleware for filtering files.
+ *
+ * @param {Object} filters
+ * @return {Function}
+ */
+
+function filterFiles(filters) {
+  return (files, metalsmith, done) => {
+    filter(files, filters, metalsmith.metadata(), done);
+  };
+}
+
+/**
+ * Template in place plugin.
+ *
+ * @param {Object} files
+ * @param {Metalsmith} metalsmith
+ * @param {Function} done
+ */
+
+function renderTemplateFiles(skipInterpolation) {
+  skipInterpolation = typeof skipInterpolation === 'string' ? [skipInterpolation] : skipInterpolation;
+  return (files, metalsmith, done) => {
+    const keys = Object.keys(files);
+    const metalsmithMetadata = metalsmith.metadata();
+    async.each(
+      keys,
+      (file, next) => {
+        // skipping files with skipInterpolation option
+        if (skipInterpolation && multimatch([file], skipInterpolation, { dot: true }).length) {
+          return next();
+        }
+        const str = files[file].contents.toString();
+        // do not attempt to render files that do not have mustaches
+        if (!/{{([^{}]+)}}/g.test(str)) {
+          return next();
+        }
+        handlebars.render(str, metalsmithMetadata, (err, res) => {
+          if (err) {
+            err.message = `[${file}] ${err.message}`;
+            return next(err);
+          }
+          files[file].contents = Buffer.from(res);
+          next();
+        });
+      },
+      done
+    );
+  };
+}
+
+/**
+ * Display template complete message.
+ *
+ * @param {String} message
+ * @param {Object} data
+ */
+
+function logMessage(message, data) {
+  if (!message) return;
+  handlebars.render(message, data, (err, res) => {
+    if (err) {
+      // eslint-disable-next-line no-console
+      console.error('\n   Error when rendering template complete message: ' + err.message.trim());
+    } else {
+      // eslint-disable-next-line no-console
+      console.log(
+        '\n' +
+          res
+            .split(/\r?\n/g)
+            .map(line => '   ' + line)
+            .join('\n')
+      );
+    }
+  });
+}
diff --git a/packages/cli/bin/cli/git-user.js b/packages/cli/bin/cli/git-user.js
new file mode 100644
index 000000000..aaa7fcc44
--- /dev/null
+++ b/packages/cli/bin/cli/git-user.js
@@ -0,0 +1,15 @@
+const execSync = require('child_process').execSync;
+
+exports = module.exports = function getGitUser() {
+  let name;
+  let email;
+
+  try {
+    name = execSync('git config --get user.name');
+    email = execSync('git config --get user.email');
+  } catch (e) {}
+
+  name = name && name.toString().trim();
+  email = email && ' <' + email.toString().trim() + '>';
+  return (name || '') + (email || '');
+};
diff --git a/packages/cli/bin/cli/local-path.js b/packages/cli/bin/cli/local-path.js
new file mode 100644
index 000000000..f6f59851c
--- /dev/null
+++ b/packages/cli/bin/cli/local-path.js
@@ -0,0 +1,13 @@
+const path = require('path');
+
+exports = module.exports = {
+  isLocalPath(templatePath) {
+    // templatePath example:
+    // .wepy_templates
+    // E:\workspace\wepy_templates\standard
+    return /^[./]|(^[a-zA-Z]:)/.test(templatePath);
+  },
+  getTemplatePath(templatePath) {
+    return path.isAbsolute(templatePath) ? templatePath : path.normalize(path.join(process.cwd(), templatePath));
+  }
+};
diff --git a/packages/cli/bin/cli/logger.js b/packages/cli/bin/cli/logger.js
new file mode 100644
index 000000000..fbd333c6e
--- /dev/null
+++ b/packages/cli/bin/cli/logger.js
@@ -0,0 +1,49 @@
+const chalk = require('chalk');
+const format = require('util').format;
+
+/**
+ * Prefix.
+ */
+
+const prefix = '   @wepy/cli';
+const sep = chalk.gray('·');
+
+/**
+ * Log a `message` to the console.
+ *
+ * @param {String} message
+ */
+
+exports = module.exports = {
+  log(...args) {
+    const msg = format.apply(format, args);
+    // eslint-disable-next-line no-console
+    console.log(chalk.white(prefix), sep, msg);
+  },
+
+  /**
+   * Log an error `message` to the console and exit.
+   *
+   * @param {String} message
+   */
+
+  fatal(...args) {
+    if (args[0] instanceof Error) args[0] = args[0].message.trim();
+    const msg = format.apply(format, args);
+    // eslint-disable-next-line no-console
+    console.error(chalk.red(prefix), sep, msg);
+    process.exit(1);
+  },
+
+  /**
+   * Log a success `message` to the console and exit.
+   *
+   * @param {String} message
+   */
+
+  success(...args) {
+    const msg = format.apply(format, args);
+    // eslint-disable-next-line no-console
+    console.log(chalk.white(prefix), sep, msg);
+  }
+};
diff --git a/packages/cli/bin/cli/options.js b/packages/cli/bin/cli/options.js
new file mode 100644
index 000000000..adcd24491
--- /dev/null
+++ b/packages/cli/bin/cli/options.js
@@ -0,0 +1,92 @@
+const path = require('path');
+const metadata = require('read-metadata');
+const fs = require('fs');
+const getGitUser = require('./git-user');
+const validateName = require('validate-npm-package-name');
+
+/**
+ * Read prompts metadata.
+ *
+ * @param {String} dir
+ * @return {Object}
+ */
+
+exports = module.exports = function options(name, dir) {
+  const opts = getMetadata(dir);
+
+  setDefault(opts, 'name', name);
+  setValidateName(opts);
+
+  const author = getGitUser();
+  if (author) {
+    setDefault(opts, 'author', author);
+  }
+
+  return opts;
+};
+
+/**
+ * Gets the metadata from either a meta.json or meta.js file.
+ *
+ * @param  {String} dir
+ * @return {Object}
+ */
+
+function getMetadata(dir) {
+  const json = path.join(dir, 'meta.json');
+  const js = path.join(dir, 'meta.js');
+  let opts = {};
+  opts.status = true;
+
+  if (fs.existsSync(json)) {
+    opts = metadata.sync(json);
+  } else if (fs.existsSync(js)) {
+    const req = require(path.resolve(js));
+    if (req !== Object(req)) {
+      throw new Error('meta.js needs to expose an object');
+    }
+    opts = req;
+  } else {
+    opts.status = false;
+  }
+
+  return opts;
+}
+
+/**
+ * Set the default value for a prompt question
+ *
+ * @param {Object} opts
+ * @param {String} key
+ * @param {String} val
+ */
+
+function setDefault(opts, key, val) {
+  if (opts.schema) {
+    opts.prompts = opts.schema;
+    delete opts.schema;
+  }
+  const prompts = opts.prompts || (opts.prompts = {});
+  if (!prompts[key] || typeof prompts[key] !== 'object') {
+    prompts[key] = {
+      type: 'string',
+      default: val
+    };
+  } else {
+    prompts[key]['default'] = val;
+  }
+}
+
+function setValidateName(opts) {
+  const name = opts.prompts.name;
+  const customValidate = name.validate;
+  name.validate = name => {
+    const its = validateName(name);
+    if (!its.validForNewPackages) {
+      const errors = (its.errors || []).concat(its.warnings || []);
+      return 'Sorry, ' + errors.join(' and ') + '.';
+    }
+    if (typeof customValidate === 'function') return customValidate(name);
+    return true;
+  };
+}
diff --git a/packages/cli/bin/wepy-build.js b/packages/cli/bin/wepy-build.js
new file mode 100644
index 000000000..52f67646d
--- /dev/null
+++ b/packages/cli/bin/wepy-build.js
@@ -0,0 +1,23 @@
+const compile = require('../core/compile');
+const parseOptions = require('../core/parseOptions');
+const logger = require('../core/util/logger');
+
+exports = module.exports = program => {
+  let options;
+  try {
+    options = parseOptions.convert(program);
+  } catch (e) {
+    const msg = e.message;
+    if (msg.indexOf('plugins expect a Array') > -1) {
+      logger.error(`Parse WePY config failed. Are you trying to use WePY 2 to build WePY 1 project?`);
+    } else {
+      logger.error(`Parse WePY config failed.`);
+    }
+    logger.error(e.message);
+    process.exit();
+  }
+  const compilation = compile(options || {});
+  compilation.run().catch(e => {
+    compilation.logger.error('init', e.message);
+  });
+};
diff --git a/packages/cli/bin/wepy-init.js b/packages/cli/bin/wepy-init.js
new file mode 100644
index 000000000..014d6ba43
--- /dev/null
+++ b/packages/cli/bin/wepy-init.js
@@ -0,0 +1,171 @@
+const fs = require('fs');
+const path = require('path');
+const chalk = require('chalk');
+const tildify = require('tildify');
+const inquirer = require('inquirer');
+const home = require('user-home');
+const rm = require('rimraf').sync;
+const download = require('./cli/download');
+const localPath = require('./cli/local-path');
+const checkVersion = require('./cli/check-version');
+const generate = require('./cli/generate');
+const logger = require('./../util/logger');
+
+exports = module.exports = (template, rawName, program) => {
+  function gen(templatePath) {
+    logger.verbose('Start to generate project');
+    // eslint-disable-next-line no-console
+    console.log();
+    return new Promise((resolve, reject) => {
+      return generate(name, templatePath, to, err => {
+        if (err) {
+          reject(err);
+        } else {
+          resolve(true);
+        }
+      });
+    })
+      .catch(e => {
+        logger.error('Generate project failed');
+        logger.error(e);
+        return false;
+      })
+      .then(conti => {
+        if (conti) {
+          // eslint-disable-next-line no-console
+          console.log();
+          logger.info(`Generated "${name}".`);
+        }
+      });
+  }
+
+  function run() {
+    if (localPath.isLocalPath(template)) {
+      logger.verbose('Use local path template');
+      // use local/cache template
+      // Example:
+      // wepy init E:\workspace\wepy_templates\standard my-wepy-project
+      // wepy init standard my-wepy-project --offline
+      const templatePath = localPath.getTemplatePath(template);
+      if (fs.existsSync(templatePath)) {
+        gen(templatePath);
+      } else {
+        logger.error(`Local template "${template}" not found.`);
+      }
+    } else {
+      logger.verbose(`Version check`);
+      checkVersion().then(() => {
+        downloadAndGenerate(template);
+      });
+    }
+  }
+
+  function downloadLog(msg, type = 'verbose') {
+    logger[type](msg);
+  }
+
+  function downloadOfficialTemplate(templateName, dist, opt, branch) {
+    downloadLog(`Download template "${templateName}" in branch "${branch}" from Github Raw`);
+    return download
+      .downloadFromGitRaw(templateName, dist, opt, branch)
+      .catch(e => {
+        if (branch === '2.0.x') {
+          downloadLog(`Download URL is: ${e.url}`);
+          downloadLog(`Download from Github raw failed, try Tencent COS download`, 'warn');
+          downloadLog(e, 'warn');
+          return download.downloadFromCos(templateName, tmp, opt);
+        } else {
+          throw e;
+        }
+      })
+      .catch(e => {
+        downloadLog(`Download URL is: ${e.url}`);
+        throw e;
+      });
+  }
+
+  function downloadAndGenerate(template) {
+    if (fs.existsSync(tmp)) {
+      rm(tmp);
+    }
+    if (!hasSlash) {
+      let [templateName, branch] = template.split('#');
+      downloadLog(`Donwnloading template "${templateName}"`);
+      return downloadOfficialTemplate(templateName, tmp, { extract: true }, branch || '2.0.x')
+        .then(() => {
+          downloadLog('Download success, start generate template');
+          return true;
+        })
+        .catch(e => {
+          if (e.statusCode === 404) {
+            logger.error(`Unrecongnized template: "${template}". Try "wepy list" to show all available templates `);
+          } else {
+            logger.error(`Download template failed`);
+            logger.error(e);
+          }
+          return false;
+        })
+        .then(conti => {
+          if (conti) {
+            return gen(tmp);
+          }
+        });
+    } else {
+      // use third party template
+      downloadLog('Donwnloading github repo "${template}"');
+      return download
+        .downloadRepo(template, tmp, { clone })
+        .then(() => {
+          downloadLog('Download repository success, start generate template');
+          return true;
+        })
+        .catch(e => {
+          logger.error('Failed to download repo ' + template);
+          logger.error(e);
+          return false;
+        })
+        .then(conti => {
+          if (conti) {
+            return gen(tmp);
+          }
+        });
+    }
+  }
+
+  const hasSlash = template.indexOf('/') > -1;
+  const inPlace = !rawName || rawName === '.';
+  const name = inPlace ? path.relative('../', process.cwd()) : rawName;
+  const to = path.resolve(rawName || '.');
+  const clone = program.clone || false;
+  const offline = program.offline || false;
+
+  let tmp = path.join(home, '.wepy_templates', template.replace(/\//g, '-'));
+
+  /**
+   * use offline cache
+   */
+  if (offline) {
+    // eslint-disable-next-line no-console
+    logger.notice(`Use cached template at ${chalk.yellow(tildify(tmp))}`);
+    template = tmp;
+  }
+
+  if (fs.existsSync(to)) {
+    inquirer
+      .prompt([
+        {
+          type: 'confirm',
+          message: inPlace ? 'Generate project in current directory?' : 'Target directory exists. Continue?',
+          name: 'ok'
+        }
+      ])
+      .then(answers => {
+        if (answers.ok) {
+          run();
+        }
+      })
+      .catch();
+  } else {
+    run();
+  }
+};
diff --git a/packages/cli/bin/wepy-list.js b/packages/cli/bin/wepy-list.js
new file mode 100644
index 000000000..efe20becb
--- /dev/null
+++ b/packages/cli/bin/wepy-list.js
@@ -0,0 +1,158 @@
+#!/usr/bin/env node
+
+const chalk = require('chalk');
+const request = require('request');
+const Table = require('tty-table');
+const ta = require('time-ago');
+
+exports = module.exports = program => {
+  request(
+    {
+      url: 'https://raw.githubusercontent.com/wepyjs/wepy-templates/2.0.x/meta.json',
+      headers: {
+        'User-Agent': 'wepy-cli'
+      }
+    },
+    (err, res, body) => {
+      if (!body) {
+        // eslint-disable-next-line no-console
+        console.error('Something wrong with your network');
+        return;
+      }
+      if (body.message) {
+        // eslint-disable-next-line no-console
+        console.error(body.messge);
+        return;
+      }
+      let official, github;
+      try {
+        body = JSON.parse(body);
+        official = body.official;
+        github = body.github;
+      } catch (e) {
+        // eslint-disable-next-line no-console
+        console.error('Something wrong with your network');
+      }
+      if (!program.github && Array.isArray(official)) {
+        // eslint-disable-next-line no-console
+        console.log('\n  Available official templates:\n');
+        /*
+            official.forEach(repo => {
+
+              console.log(
+            '  ' + chalk.yellow('♚') +
+            '  ' + chalk.blue(repo.name) +
+            ' - ' + repo.description);
+            });
+            */
+        let tableHead = [
+          {
+            value: 'Name',
+            width: 20,
+            color: 'blue'
+          },
+          {
+            value: 'Description',
+            width: 60,
+            align: 'left',
+            paddingLeft: 2,
+            key: 'description'
+          }
+        ];
+        let rows = [];
+        official.forEach(repo => {
+          rows.push([repo.name, repo.description]);
+        });
+
+        let offical = Table(tableHead, rows, {
+          borderStyle: 2
+        });
+        // eslint-disable-next-line no-console
+        console.log(`     e.g., wepy init ${rows[0][0]} myproject`);
+        // eslint-disable-next-line no-console
+        console.log(offical.render());
+      }
+      if (Array.isArray(github)) {
+        // eslint-disable-next-line no-console
+        console.log('\n  Available github projects:\n');
+
+        let tableHead = [
+          {
+            value: 'Repository',
+            width: 30,
+            color: 'blue',
+            key: 'repo'
+          },
+          {
+            value: 'Stars',
+            width: 8,
+            key: 'star'
+          },
+          {
+            value: 'Description',
+            width: 60,
+            align: 'left',
+            paddingLeft: 2,
+            key: 'description'
+          },
+          {
+            value: 'Last Updated',
+            width: 25,
+            key: 'last_update',
+            formatter: function(v) {
+              let date = new Date(v);
+              if (date.toString() === 'Invalid Date') {
+                return '----';
+              } else {
+                return ta.ago(v);
+              }
+            }
+          }
+        ];
+
+        let map = tableHead.map(v => v.key);
+
+        let showItems = [];
+        let rows = [];
+        let MAX_COUNT = program.github ? 0 : 5;
+        if (MAX_COUNT && github.length > MAX_COUNT) {
+          for (let i = 0, l = github.length; i < l; i++) {
+            if (i >= MAX_COUNT) break;
+            showItems.push(github[i]);
+          }
+        } else {
+          showItems = github;
+        }
+        showItems.forEach(repo => {
+          let row = [];
+          map.forEach(title => {
+            row.push(repo[title] || '');
+          });
+          rows.push(row);
+        });
+        if (MAX_COUNT && github.length > MAX_COUNT) {
+          rows.push(['....', '..', '....', '....']);
+        }
+
+        let githubTable = Table(tableHead, rows, {
+          borderStyle: 2
+        });
+        // eslint-disable-next-line no-console
+        console.log(`     e.g., wepy init ${rows[0][0]} myproject`);
+        // eslint-disable-next-line no-console
+        console.log(githubTable.render());
+
+        if (MAX_COUNT && github.length > MAX_COUNT) {
+          // eslint-disable-next-line no-console
+          console.log(chalk.gray(`  use 'wepy list --github' to see all github projects`));
+        }
+        if (program.github) {
+          // eslint-disable-next-line no-console
+          console.log(chalk.gray(`  You can registe your project from here: https://github.com/wepyjs/wepy_templates`));
+        }
+        // eslint-disable-next-line no-console
+        console.log('\n');
+      }
+    }
+  );
+};
diff --git a/packages/cli/bin/wepy-new.js b/packages/cli/bin/wepy-new.js
new file mode 100644
index 000000000..6a285d1ab
--- /dev/null
+++ b/packages/cli/bin/wepy-new.js
@@ -0,0 +1,13 @@
+#!/usr/bin/env node
+
+const chalk = require('chalk');
+
+exports = module.exports = proj => {
+  if (typeof proj !== 'string') proj = 'myproject';
+  // eslint-disable-next-line no-console
+  console.log('');
+  // eslint-disable-next-line no-console
+  console.log(`deprecated command, please use ` + chalk.blue(`wepy init standard ${proj}`) + ` instead`);
+  // eslint-disable-next-line no-console
+  console.log('');
+};
diff --git a/packages/cli/bin/wepy-upgrade.js b/packages/cli/bin/wepy-upgrade.js
new file mode 100644
index 000000000..4fec8bdd3
--- /dev/null
+++ b/packages/cli/bin/wepy-upgrade.js
@@ -0,0 +1,49 @@
+const exec = require('child_process').exec;
+const util = require('../util');
+
+function upgradeCLI(cb) {
+  let cmd = 'npm install wepy-cli -g';
+  util.log('升级中，可能需要几分钟, 请耐心等待...', '信息');
+  util.log('执行命令: ' + cmd, '执行');
+  let fcmd = exec(cmd, () => {
+    util.log('完成安装最新版本wepy-cli', '完成');
+    cb && cb();
+  });
+  fcmd.stdout.on('data', d => {
+    // eslint-disable-next-line no-console
+    console.log(d.substring(d, d.length - 1));
+  });
+}
+
+function upgradeWepy(cb) {
+  let cmd = 'npm install wepy --save';
+  util.log('升级中，可能需要几分钟, 请耐心等待...', '信息');
+  util.log('执行命令: ' + cmd, '执行');
+  let fcmd = exec(cmd, () => {
+    util.log('完成安装最新版本wepy', '完成');
+
+    let cmd = 'wepy build --no-cache';
+    util.log('执行命令: ' + cmd, '执行');
+
+    let fcmd3 = exec(cmd, () => {
+      util.log('完成升级', '完成');
+      cb && cb();
+    });
+    fcmd3.stdout.on('data', d => {
+      // eslint-disable-next-line no-console
+      console.log(d.substring(d, d.length - 1));
+    });
+  });
+  fcmd.stdout.on('data', d => {
+    // eslint-disable-next-line no-console
+    console.log(d.substring(d, d.length - 1));
+  });
+}
+
+exports = module.exports = program => {
+  if (program.cli) {
+    upgradeCLI();
+  } else {
+    upgradeWepy();
+  }
+};
diff --git a/packages/cli/bin/wepy.js b/packages/cli/bin/wepy.js
new file mode 100755
index 000000000..3fade98e4
--- /dev/null
+++ b/packages/cli/bin/wepy.js
@@ -0,0 +1,73 @@
+#!/usr/bin/env node
+
+const chalk = require('chalk');
+const program = require('commander');
+const logger = require('../core/util/logger');
+
+program
+  .version(require('../package.json').version, '-v, --version')
+  .option('-l, --log <level>', 'change the log level')
+  .usage('<command> [options]');
+
+program
+  .command('init <template-name> [project-name]')
+  .allowUnknownOption()
+  .description('generate a new project from a template')
+  .action(require('./wepy-init'))
+  .usage('<template-name> [project-name]')
+  .option('-c --clone', 'use git clone')
+  .option('--offline', 'use cached template')
+  .option('--no-interactive', 'no interactive to use the options to create template')
+  .on('--help', () => {
+    /* eslint-disable no-console */
+    console.log();
+    console.log('  Example:');
+    console.log();
+    console.log(chalk.gray('   # create a new project with an official template'));
+    console.log('  $ wepy init standard my-project');
+    console.log();
+    console.log(chalk.gray('   # create a new project straight from a github template'));
+    console.log('  $ wepy init username/repo my-project');
+    console.log();
+    /* eslint-enable no-console */
+  });
+
+program
+  .command('build')
+  .description('build your project')
+  .action(require('./wepy-build'))
+
+  .option('-f, --file <file>', '待编译wpy文件')
+  .option('-s, --source <source>', '源码目录')
+  .option('-t, --target <target>', '生成代码目录')
+  .option('-o, --output <type>', '编译类型：web，weapp。默认为weapp')
+  .option('-p, --platform <type>', '编译平台：browser, wechat，qq。默认为browser')
+  .option('-w, --watch', '监听文件改动')
+  .option('--no-cache', '对于引用到的文件，即使无改动也会再次编译');
+
+program
+  .command('list')
+  .description('list available official templates')
+  .action(require('./wepy-list'))
+
+  .option('-g, --github', 'list all registered github projects');
+
+/*
+program
+  .command('upgrade')
+  .description('upgrade to the latest version')
+  .action(require('./wepy-upgrade'))
+  .option('--cli', 'upgrade wepy-cli')
+  .option('--wepy', 'upgrade wepy');
+*/
+
+program
+  .command('new')
+  .description('deprecated command, use "wepy init <template-name> <project-name>" instead')
+  .action(require('./wepy-new'));
+
+program.parse(process.argv);
+
+if (program.log) {
+  logger.level(program.log);
+}
diff --git a/packages/cli/core/ast/index.js b/packages/cli/core/ast/index.js
new file mode 100644
index 000000000..e69de29bb
diff --git a/packages/cli/core/ast/paramsDetect.js b/packages/cli/core/ast/paramsDetect.js
new file mode 100644
index 000000000..128e5309a
--- /dev/null
+++ b/packages/cli/core/ast/paramsDetect.js
@@ -0,0 +1,205 @@
+const acorn = require('acorn');
+const walk = require('acorn/dist/walk');
+
+function isScope(node) {
+  return (
+    node.type === 'FunctionExpression' ||
+    node.type === 'FunctionDeclaration' ||
+    node.type === 'ArrowFunctionExpression' ||
+    node.type === 'Program'
+  );
+}
+function isBlockScope(node) {
+  return node.type === 'BlockStatement' || isScope(node);
+}
+
+function declaresArguments(node) {
+  return node.type === 'FunctionExpression' || node.type === 'FunctionDeclaration';
+}
+
+function declaresThis(node) {
+  return node.type === 'FunctionExpression' || node.type === 'FunctionDeclaration';
+}
+
+function reallyParse(source, options) {
+  var parseOptions = Object.assign({}, options, {
+    allowReturnOutsideFunction: true,
+    allowImportExportEverywhere: true,
+    allowHashBang: true
+  });
+  return acorn.parse(source, parseOptions);
+}
+module.exports = findGlobals;
+module.exports.parse = reallyParse;
+function findGlobals(source, options) {
+  options = options || {};
+  let globals = [];
+  let expressions = [];
+  let callee;
+  var ast;
+  // istanbul ignore else
+  if (typeof source === 'string') {
+    ast = reallyParse(source, options);
+  } else {
+    ast = source;
+  }
+  // istanbul ignore if
+  if (!(ast && typeof ast === 'object' && ast.type === 'Program')) {
+    throw new TypeError('Source must be either a string of JavaScript or an acorn AST');
+  }
+  var declareFunction = function(node) {
+    var fn = node;
+    fn.locals = fn.locals || {};
+    node.params.forEach(function(node) {
+      declarePattern(node, fn);
+    });
+    if (node.id) {
+      fn.locals[node.id.name] = true;
+    }
+  };
+  var declarePattern = function(node, parent) {
+    switch (node.type) {
+      case 'Identifier':
+        parent.locals[node.name] = true;
+        break;
+      case 'ObjectPattern':
+        node.properties.forEach(function(node) {
+          declarePattern(node.value, parent);
+        });
+        break;
+      case 'ArrayPattern':
+        node.elements.forEach(function(node) {
+          if (node) declarePattern(node, parent);
+        });
+        break;
+      case 'RestElement':
+        declarePattern(node.argument, parent);
+        break;
+      case 'AssignmentPattern':
+        declarePattern(node.left, parent);
+        break;
+      // istanbul ignore next
+      default:
+        throw new Error('Unrecognized pattern type: ' + node.type);
+    }
+  };
+  var declareModuleSpecifier = function(node) {
+    ast.locals = ast.locals || {};
+    ast.locals[node.local.name] = true;
+  };
+  walk.ancestor(ast, {
+    VariableDeclaration: function(node, parents) {
+      var parent = null;
+      for (var i = parents.length - 1; i >= 0 && parent === null; i--) {
+        if (node.kind === 'var' ? isScope(parents[i]) : isBlockScope(parents[i])) {
+          parent = parents[i];
+        }
+      }
+      parent.locals = parent.locals || {};
+      node.declarations.forEach(function(declaration) {
+        declarePattern(declaration.id, parent);
+      });
+    },
+    FunctionDeclaration: function(node, parents) {
+      var parent = null;
+      for (var i = parents.length - 2; i >= 0 && parent === null; i--) {
+        if (isScope(parents[i])) {
+          parent = parents[i];
+        }
+      }
+      parent.locals = parent.locals || {};
+      parent.locals[node.id.name] = true;
+      declareFunction(node);
+    },
+    Function: declareFunction,
+    ClassDeclaration: function(node, parents) {
+      var parent = null;
+      for (var i = parents.length - 2; i >= 0 && parent === null; i--) {
+        if (isScope(parents[i])) {
+          parent = parents[i];
+        }
+      }
+      parent.locals = parent.locals || {};
+      parent.locals[node.id.name] = true;
+    },
+    TryStatement: function(node) {
+      if (node.handler === null) return;
+      node.handler.locals = node.handler.locals || {};
+      node.handler.locals[node.handler.param.name] = true;
+    },
+    ImportDefaultSpecifier: declareModuleSpecifier,
+    ImportSpecifier: declareModuleSpecifier,
+    ImportNamespaceSpecifier: declareModuleSpecifier
+  });
+  function identifier(node, parents) {
+    var name = node.name;
+    if (name === 'undefined') return;
+    for (var i = 0; i < parents.length; i++) {
+      if (name === 'arguments' && declaresArguments(parents[i])) {
+        return;
+      }
+      if (parents[i].locals && name in parents[i].locals) {
+        return;
+      }
+    }
+    node.parents = parents;
+    globals[name] = globals[name] || {};
+    let callable = false;
+    if (parents && parents.length > 2) {
+      let parent = parents[parents.length - 2];
+      callable = parent.type === 'CallExpression' && parent.callee === node;
+    }
+    globals[name].callable = globals[name].callable || callable;
+    globals[name].nodes = globals[name].nodes || [];
+    globals[name].nodes.push(node);
+  }
+  walk.ancestor(ast, {
+    VariablePattern: identifier,
+    Identifier: identifier,
+    CallExpression: function(node) {
+      callee = getNameForExpression(node.callee);
+      expressions = node.arguments.map(arg => {
+        let p = getNameForExpression(arg);
+        p.node = arg;
+        return p;
+      });
+    },
+    ThisExpression: function(node, parents) {
+      for (var i = 0; i < parents.length; i++) {
+        if (declaresThis(parents[i])) {
+          return;
+        }
+      }
+      node.parents = parents;
+      globals.push(node);
+    }
+  });
+  return {
+    identifiers: globals,
+    callee,
+    params: expressions
+  };
+}
+
+function getNameForExpression(expression) {
+  let expr = expression;
+  const exprName = [];
+  while (expr.type === 'MemberExpression' && expr.property.type === (expr.computed ? 'Literal' : 'Identifier')) {
+    exprName.push(expr.computed ? expr.property.value : expr.property.name);
+    expr = expr.object;
+  }
+  if (expr.type === 'Identifier') {
+    exprName.push(expr.name);
+  } else if (expr.type === 'Literal') {
+    exprName.push(expr.value);
+  }
+  let name = exprName.pop();
+  let t;
+  while ((t = exprName.pop())) {
+    name += typeof t === 'number' ? `[${t}]` : `.${t}`;
+  }
+  return {
+    name,
+    type: expr.type
+  };
+}
diff --git a/packages/cli/core/ast/parseClass.js b/packages/cli/core/ast/parseClass.js
new file mode 100644
index 000000000..374ac6b2c
--- /dev/null
+++ b/packages/cli/core/ast/parseClass.js
@@ -0,0 +1,38 @@
+const walk = require('acorn/dist/walk');
+const toAST = require('./toAST');
+
+exports = module.exports = function parseClass(source) {
+  source = '(' + source + ');';
+  const ast = toAST(source);
+  let result = [];
+  walk.ancestor(ast, {
+    ObjectExpression(node) {
+      node.properties.forEach(p => {
+        let value = p.key.type === 'Identifier' ? p.key.name : p.key.type === 'Literal' ? p.key.value : undefined;
+        if (value) {
+          if (p.value.type === 'Identifier') {
+            result.push({
+              [value]: p.value.name
+            });
+          } else {
+            result.push({
+              [value]: source.substring(p.value.start, p.value.end)
+            });
+          }
+        }
+      });
+    },
+    ArrayExpression(node) {
+      node.elements.forEach(p => {
+        if (p.type === 'Identifier') {
+          result.push(p.name);
+        }
+      });
+    },
+    ConditionalExpression() {
+      result.push(source);
+    }
+  });
+
+  return result;
+};
diff --git a/packages/cli/core/ast/toAST.js b/packages/cli/core/ast/toAST.js
new file mode 100644
index 000000000..f42a79edc
--- /dev/null
+++ b/packages/cli/core/ast/toAST.js
@@ -0,0 +1,58 @@
+const acorn = require('acorn-dynamic-import').default;
+
+const ECMA_VERSION = 2017;
+
+const POSSIBLE_AST_OPTIONS = [
+  {
+    ranges: true,
+    locations: true,
+    ecmaVersion: ECMA_VERSION,
+    sourceType: 'module',
+    plugins: {
+      dynamicImport: true
+    }
+  },
+  {
+    ranges: true,
+    locations: true,
+    ecmaVersion: ECMA_VERSION,
+    sourceType: 'script',
+    plugins: {
+      dynamicImport: true
+    }
+  }
+];
+
+exports = module.exports = function ast(source) {
+  let ast;
+  const comments = [];
+  for (let i = 0, len = POSSIBLE_AST_OPTIONS.length; i < len; i++) {
+    if (!ast) {
+      try {
+        comments.length = 0;
+        POSSIBLE_AST_OPTIONS[i].onComment = comments;
+        ast = acorn.parse(source, POSSIBLE_AST_OPTIONS[i]);
+      } catch (e) {
+        // ignore the error
+      }
+    }
+  }
+
+  if (!ast) {
+    ast = acorn.parse(source, {
+      ranges: true,
+      locations: true,
+      ecmaVersion: ECMA_VERSION,
+      sourceType: 'module',
+      plugins: {
+        dynamicImport: true
+      },
+      onComment: comments
+    });
+  }
+
+  if (!ast || typeof ast !== 'object') {
+    throw new Error(`Source could't be parsed`);
+  }
+  return ast;
+};
diff --git a/packages/cli/core/ast/walker.js b/packages/cli/core/ast/walker.js
new file mode 100644
index 000000000..debbf8c0b
--- /dev/null
+++ b/packages/cli/core/ast/walker.js
@@ -0,0 +1,1350 @@
+class AstWalker {
+  constructor(compilation, ast, lang) {
+    this.ast = ast;
+    this.state = {};
+    this.deps = [];
+    this.replacements = [];
+    this.compilation = compilation;
+    this.lang = lang;
+  }
+
+  run() {
+    this.scope = {
+      inTry: false,
+      definitions: [],
+      instances: [],
+      renames: {}
+    };
+    this.prewalkStatements(this.ast.body);
+    this.walkStatements(this.ast.body);
+  }
+  // Walking iterates the statements and expressions and processes them
+  walkStatements(statements) {
+    for (let index = 0, len = statements.length; index < len; index++) {
+      const statement = statements[index];
+      this.walkStatement(statement);
+    }
+  }
+  walkStatement(statement) {
+    // if(this.applyPluginsBailResult1("statement", statement) !== undefined) return;
+    const handler = this['walk' + statement.type];
+    if (handler) handler.call(this, statement);
+  }
+
+  walkClass(classy) {
+    if (classy.superClass) this.walkExpression(classy.superClass);
+    if (classy.body && classy.body.type === 'ClassBody') {
+      classy.body.body.forEach(methodDefinition => {
+        if (methodDefinition.type === 'MethodDefinition') this.walkMethodDefinition(methodDefinition);
+      });
+    }
+  }
+
+  walkMethodDefinition(methodDefinition) {
+    if (methodDefinition.computed && methodDefinition.key) this.walkExpression(methodDefinition.key);
+    if (methodDefinition.value) this.walkExpression(methodDefinition.value);
+  }
+
+  // Prewalking iterates the scope for variable declarations
+  prewalkStatements(statements) {
+    for (let index = 0, len = statements.length; index < len; index++) {
+      const statement = statements[index];
+      this.prewalkStatement(statement);
+    }
+  }
+
+  prewalkStatement(statement) {
+    const handler = this['prewalk' + statement.type];
+    if (handler) handler.call(this, statement);
+  }
+
+  // Real Statements
+  prewalkBlockStatement(statement) {
+    this.prewalkStatements(statement.body);
+  }
+
+  walkBlockStatement(statement) {
+    this.walkStatements(statement.body);
+  }
+
+  walkExpressionStatement(statement) {
+    this.walkExpression(statement.expression);
+  }
+
+  prewalkIfStatement(statement) {
+    this.prewalkStatement(statement.consequent);
+    if (statement.alternate) this.prewalkStatement(statement.alternate);
+  }
+
+  walkIfStatement(statement) {
+    const result = undefined;
+    // const result = this.applyPluginsBailResult1("statement if", statement);
+    if (result === undefined) {
+      this.walkExpression(statement.test);
+      this.walkStatement(statement.consequent);
+      if (statement.alternate) this.walkStatement(statement.alternate);
+    } else {
+      if (result) this.walkStatement(statement.consequent);
+      else if (statement.alternate) this.walkStatement(statement.alternate);
+    }
+  }
+
+  prewalkLabeledStatement(statement) {
+    this.prewalkStatement(statement.body);
+  }
+
+  walkLabeledStatement(statement) {
+    const result = undefined;
+    // const result = this.applyPluginsBailResult1("label " + statement.label.name, statement);
+    if (result !== true) this.walkStatement(statement.body);
+  }
+
+  prewalkWithStatement(statement) {
+    this.prewalkStatement(statement.body);
+  }
+
+  walkWithStatement(statement) {
+    this.walkExpression(statement.object);
+    this.walkStatement(statement.body);
+  }
+
+  prewalkSwitchStatement(statement) {
+    this.prewalkSwitchCases(statement.cases);
+  }
+
+  walkSwitchStatement(statement) {
+    this.walkExpression(statement.discriminant);
+    this.walkSwitchCases(statement.cases);
+  }
+
+  walkTerminatingStatement(statement) {
+    if (statement.argument) this.walkExpression(statement.argument);
+  }
+
+  walkReturnStatement(statement) {
+    this.walkTerminatingStatement(statement);
+  }
+
+  walkThrowStatement(statement) {
+    this.walkTerminatingStatement(statement);
+  }
+
+  prewalkTryStatement(statement) {
+    this.prewalkStatement(statement.block);
+  }
+
+  walkTryStatement(statement) {
+    if (this.scope.inTry) {
+      this.walkStatement(statement.block);
+    } else {
+      this.scope.inTry = true;
+      this.walkStatement(statement.block);
+      this.scope.inTry = false;
+    }
+    if (statement.handler) this.walkCatchClause(statement.handler);
+    if (statement.finalizer) this.walkStatement(statement.finalizer);
+  }
+
+  prewalkWhileStatement(statement) {
+    this.prewalkStatement(statement.body);
+  }
+
+  walkWhileStatement(statement) {
+    this.walkExpression(statement.test);
+    this.walkStatement(statement.body);
+  }
+
+  prewalkDoWhileStatement(statement) {
+    this.prewalkStatement(statement.body);
+  }
+
+  walkDoWhileStatement(statement) {
+    this.walkStatement(statement.body);
+    this.walkExpression(statement.test);
+  }
+
+  prewalkForStatement(statement) {
+    if (statement.init) {
+      if (statement.init.type === 'VariableDeclaration') this.prewalkStatement(statement.init);
+    }
+    this.prewalkStatement(statement.body);
+  }
+
+  walkForStatement(statement) {
+    if (statement.init) {
+      if (statement.init.type === 'VariableDeclaration') this.walkStatement(statement.init);
+      else this.walkExpression(statement.init);
+    }
+    if (statement.test) this.walkExpression(statement.test);
+    if (statement.update) this.walkExpression(statement.update);
+    this.walkStatement(statement.body);
+  }
+
+  prewalkForInStatement(statement) {
+    if (statement.left.type === 'VariableDeclaration') this.prewalkStatement(statement.left);
+    this.prewalkStatement(statement.body);
+  }
+
+  walkForInStatement(statement) {
+    if (statement.left.type === 'VariableDeclaration') this.walkStatement(statement.left);
+    else this.walkExpression(statement.left);
+    this.walkExpression(statement.right);
+    this.walkStatement(statement.body);
+  }
+
+  prewalkForOfStatement(statement) {
+    if (statement.left.type === 'VariableDeclaration') this.prewalkStatement(statement.left);
+    this.prewalkStatement(statement.body);
+  }
+
+  walkForOfStatement(statement) {
+    if (statement.left.type === 'VariableDeclaration') this.walkStatement(statement.left);
+    else this.walkExpression(statement.left);
+    this.walkExpression(statement.right);
+    this.walkStatement(statement.body);
+  }
+
+  // Declarations
+  prewalkFunctionDeclaration(statement) {
+    if (statement.id) {
+      this.scope.renames['$' + statement.id.name] = undefined;
+      this.scope.definitions.push(statement.id.name);
+    }
+  }
+
+  walkFunctionDeclaration(statement) {
+    statement.params.forEach(param => {
+      this.walkPattern(param);
+    });
+    this.inScope(statement.params, () => {
+      if (statement.body.type === 'BlockStatement') {
+        this.prewalkStatement(statement.body);
+        this.walkStatement(statement.body);
+      } else {
+        this.walkExpression(statement.body);
+      }
+    });
+  }
+
+  prewalkImportDeclaration(statement) {
+    const source = statement.source.value;
+    let dep = {
+      statement: statement,
+      expr: statement.source,
+      module: source,
+      loc: statement.source.loc
+    };
+    this.deps.push(dep);
+    return;
+    /*
+    // this.applyPluginsBailResult("import", statement, source);
+    statement.specifiers.forEach(function(specifier) {
+      const name = specifier.local.name;
+      this.scope.renames['$' + name] = undefined;
+      this.scope.definitions.push(name);
+      switch (specifier.type) {
+        case 'ImportDefaultSpecifier':
+          // this.applyPluginsBailResult("import specifier", statement, source, "default", name);
+          break;
+        case 'ImportSpecifier':
+          // this.applyPluginsBailResult("import specifier", statement, source, specifier.imported.name, name);
+          break;
+        case 'ImportNamespaceSpecifier':
+          // this.applyPluginsBailResult("import specifier", statement, source, null, name);
+          break;
+      }
+    }, this);
+    */
+  }
+
+  prewalkExportNamedDeclaration(statement) {
+    /*
+    let source;
+    if (statement.source) {
+      source = statement.source.value;
+      // this.applyPluginsBailResult("export import", statement, source);
+    } else {
+      // this.applyPluginsBailResult1("export", statement);
+    }*/
+    if (statement.declaration) {
+      if (/Expression$/.test(statement.declaration.type)) {
+        throw new Error(`Doesn't occur?`);
+      } else {
+        this.prewalkStatement(statement.declaration);
+        /*
+        const pos = this.scope.definitions.length;
+        const newDefs = this.scope.definitions.slice(pos);
+        for (let index = newDefs.length - 1; index >= 0; index--) {
+          const def = newDefs[index];
+          // this.applyPluginsBailResult("export specifier", statement, def, def, index);
+        }*/
+      }
+    }
+    if (statement.specifiers) {
+      for (let specifierIndex = 0; specifierIndex < statement.specifiers.length; specifierIndex++) {
+        const specifier = statement.specifiers[specifierIndex];
+        switch (specifier.type) {
+          case 'ExportSpecifier': {
+            //const name = specifier.exported.name;
+            /*
+              if(source)
+                // this.applyPluginsBailResult("export import specifier", statement, source, specifier.local.name, name, specifierIndex);
+              else
+                // this.applyPluginsBailResult("export specifier", statement, specifier.local.name, name, specifierIndex);
+              */
+            break;
+          }
+        }
+      }
+    }
+  }
+
+  walkExportNamedDeclaration(statement) {
+    if (statement.declaration) {
+      this.walkStatement(statement.declaration);
+    }
+  }
+
+  prewalkExportDefaultDeclaration(statement) {
+    if (/Declaration$/.test(statement.declaration.type)) {
+      this.prewalkStatement(statement.declaration);
+      /*
+      const pos = this.scope.definitions.length;
+      const newDefs = this.scope.definitions.slice(pos);
+      for (let index = 0, len = newDefs.length; index < len; index++) {
+        const def = newDefs[index];
+        // this.applyPluginsBailResult("export specifier", statement, def, "default");
+      }*/
+    }
+  }
+
+  walkExportDefaultDeclaration(statement) {
+    // this.applyPluginsBailResult1("export", statement);
+    if (/Declaration$/.test(statement.declaration.type)) {
+    } else {
+      this.walkExpression(statement.declaration);
+    }
+  }
+
+  /*
+  prewalkExportAllDeclaration(statement) {
+    // const source = statement.source.value;
+    // this.applyPluginsBailResult("export import", statement, source);
+    // this.applyPluginsBailResult("export import specifier", statement, source, null, null, 0);
+  }*/
+
+  prewalkVariableDeclaration(statement) {
+    if (statement.declarations) this.prewalkVariableDeclarators(statement.declarations);
+  }
+
+  walkVariableDeclaration(statement) {
+    if (statement.declarations) this.walkVariableDeclarators(statement.declarations);
+  }
+
+  prewalkClassDeclaration(statement) {
+    if (statement.id) {
+      this.scope.renames['$' + statement.id.name] = undefined;
+      this.scope.definitions.push(statement.id.name);
+    }
+  }
+
+  walkClassDeclaration(statement) {
+    this.walkClass(statement);
+  }
+
+  prewalkSwitchCases(switchCases) {
+    for (let index = 0, len = switchCases.length; index < len; index++) {
+      const switchCase = switchCases[index];
+      this.prewalkStatements(switchCase.consequent);
+    }
+  }
+
+  walkSwitchCases(switchCases) {
+    for (let index = 0, len = switchCases.length; index < len; index++) {
+      const switchCase = switchCases[index];
+
+      if (switchCase.test) {
+        this.walkExpression(switchCase.test);
+      }
+      this.walkStatements(switchCase.consequent);
+    }
+  }
+
+  walkCatchClause(catchClause) {
+    this.inScope([catchClause.param], () => {
+      this.prewalkStatement(catchClause.body);
+      this.walkStatement(catchClause.body);
+    });
+  }
+
+  prewalkVariableDeclarators(declarators) {
+    declarators.forEach(declarator => {
+      switch (declarator.type) {
+        case 'VariableDeclarator': {
+          this.enterPattern(declarator.id, (name, decl) => {
+            // For old version compiler-babel, we can remove it later
+            if (this.compilation.hasHook('prewalk-' + declarator.type, this, declarator, name, decl)) {
+              this.compilation.hook('prewalk-' + declarator.type, this, declarator, name, decl);
+            } else {
+              // Ignore child scope
+              if (this.scope.instances && declarator.init && declarator.init.type === 'CallExpression') {
+                if (declarator.init.callee.name === 'require') {
+                  if (
+                    declarator.init.arguments &&
+                    declarator.init.arguments[0] &&
+                    declarator.init.arguments[0].value === 'wepy'
+                  ) {
+                    this.scope.instances.push(name);
+                  }
+                } else if (declarator.init.callee.name === '_interopRequireDefault') {
+                  this.scope.instances.push(name + '.default');
+                }
+              }
+            }
+
+            if (!this.applyMethods(`var${declarator.kind}${name}`, decl)) {
+              if (!this.applyMethods(`var${name}`, decl)) {
+                this.scope.renames['$' + name] = undefined;
+                if (this.scope.definitions.indexOf(name) < 0) this.scope.definitions.push(name);
+              }
+            }
+            /*
+              if(true || !this.applyPluginsBailResult1("var-" + declarator.kind + " " + name, decl)) {
+                if(true || !this.applyPluginsBailResult1("var " + name, decl)) {
+                  this.scope.renames["$" + name] = undefined;
+                  if(this.scope.definitions.indexOf(name) < 0)
+                    this.scope.definitions.push(name);
+                }
+              }*/
+          });
+          break;
+        }
+      }
+    });
+  }
+
+  walkVariableDeclarators(declarators) {
+    declarators.forEach(declarator => {
+      switch (declarator.type) {
+        case 'VariableDeclarator': {
+          const renameIdentifier = declarator.init && this.getRenameIdentifier(declarator.init);
+          if (
+            renameIdentifier &&
+            declarator.id.type === 'Identifier' &&
+            this.applyMethods('canrename' + renameIdentifier, declarator.init)
+          ) {
+            // if(renameIdentifier && declarator.id.type === "Identifier" && this.applyPluginsBailResult1("can-rename " + renameIdentifier, declarator.init)) {
+            // renaming with "var a = b;"
+            if (!this.applyMethods('rename' + renameIdentifier, declarator.init)) {
+              // if(!this.applyPluginsBailResult1("rename " + renameIdentifier, declarator.init)) {
+              this.scope.renames['$' + declarator.id.name] =
+                this.scope.renames['$' + renameIdentifier] || renameIdentifier;
+              const idx = this.scope.definitions.indexOf(declarator.id.name);
+              if (idx >= 0) this.scope.definitions.splice(idx, 1);
+            }
+          } else {
+            this.walkPattern(declarator.id);
+            if (declarator.init) this.walkExpression(declarator.init);
+          }
+          break;
+        }
+      }
+    });
+  }
+
+  walkPattern(pattern) {
+    if (pattern.type === 'Identifier') return;
+    if (this['walk' + pattern.type]) this['walk' + pattern.type](pattern);
+  }
+
+  walkAssignmentPattern(pattern) {
+    this.walkExpression(pattern.right);
+    this.walkPattern(pattern.left);
+  }
+
+  walkObjectPattern(pattern) {
+    for (let i = 0, len = pattern.properties.length; i < len; i++) {
+      const prop = pattern.properties[i];
+      if (prop) {
+        if (prop.computed) this.walkExpression(prop.key);
+        if (prop.value) this.walkPattern(prop.value);
+      }
+    }
+  }
+
+  walkArrayPattern(pattern) {
+    for (let i = 0, len = pattern.elements.length; i < len; i++) {
+      const element = pattern.elements[i];
+      if (element) this.walkPattern(element);
+    }
+  }
+
+  walkRestElement(pattern) {
+    this.walkPattern(pattern.argument);
+  }
+
+  walkExpressions(expressions) {
+    for (let expressionsIndex = 0, len = expressions.length; expressionsIndex < len; expressionsIndex++) {
+      const expression = expressions[expressionsIndex];
+      if (expression) this.walkExpression(expression);
+    }
+  }
+
+  walkExpression(expression) {
+    if (this['walk' + expression.type]) return this['walk' + expression.type](expression);
+  }
+
+  walkAwaitExpression(expression) {
+    const argument = expression.argument;
+    if (this['walk' + argument.type]) return this['walk' + argument.type](argument);
+  }
+
+  walkArrayExpression(expression) {
+    if (expression.elements) this.walkExpressions(expression.elements);
+  }
+
+  walkSpreadElement(expression) {
+    if (expression.argument) this.walkExpression(expression.argument);
+  }
+
+  walkObjectExpression(expression) {
+    for (let propIndex = 0, len = expression.properties.length; propIndex < len; propIndex++) {
+      const prop = expression.properties[propIndex];
+      if (prop.computed) this.walkExpression(prop.key);
+      if (prop.shorthand) this.scope.inShorthand = true;
+      this.walkExpression(prop.value);
+      if (prop.shorthand) this.scope.inShorthand = false;
+    }
+  }
+
+  walkFunctionExpression(expression) {
+    expression.params.forEach(param => {
+      this.walkPattern(param);
+    });
+    this.inScope(expression.params, () => {
+      if (expression.body.type === 'BlockStatement') {
+        this.prewalkStatement(expression.body);
+        this.walkStatement(expression.body);
+      } else {
+        this.walkExpression(expression.body);
+      }
+    });
+  }
+
+  walkArrowFunctionExpression(expression) {
+    expression.params.forEach(param => {
+      this.walkPattern(param);
+    });
+    this.inScope(expression.params, () => {
+      if (expression.body.type === 'BlockStatement') {
+        this.prewalkStatement(expression.body);
+        this.walkStatement(expression.body);
+      } else {
+        this.walkExpression(expression.body);
+      }
+    });
+  }
+
+  walkSequenceExpression(expression) {
+    if (expression.expressions) this.walkExpressions(expression.expressions);
+  }
+
+  walkUpdateExpression(expression) {
+    this.walkExpression(expression.argument);
+  }
+
+  walkUnaryExpression(expression) {
+    if (expression.operator === 'typeof') {
+      const exprName = this.getNameForExpression(expression.argument);
+      if (exprName && exprName.free) {
+        let hookName = 'walker-unary-expression-undefined';
+        if (this.compilation.hasHook(hookName)) {
+          this.compilation.hookSeq(hookName, this, expression, exprName);
+        }
+      }
+    }
+    this.walkExpression(expression.argument);
+  }
+
+  walkLeftRightExpression(expression) {
+    this.walkExpression(expression.left);
+    this.walkExpression(expression.right);
+  }
+
+  walkBinaryExpression(expression) {
+    this.walkLeftRightExpression(expression);
+  }
+
+  walkLogicalExpression(expression) {
+    this.walkLeftRightExpression(expression);
+  }
+
+  walkAssignmentExpression(expression) {
+    const renameIdentifier = this.getRenameIdentifier(expression.right);
+    if (
+      expression.left.type === 'Identifier' &&
+      renameIdentifier &&
+      this.applyMethods('canrename' + renameIdentifier, expression.right)
+    ) {
+      // if(expression.left.type === "Identifier" && renameIdentifier && this.applyPluginsBailResult1("can-rename " + renameIdentifier, expression.right)) {
+      // renaming "a = b;"
+      if (!this.applyMethods('rename' + renameIdentifier, expression.right)) {
+        // if(!this.applyPluginsBailResult1("rename " + renameIdentifier, expression.right)) {
+        this.scope.renames['$' + expression.left.name] = renameIdentifier;
+        const idx = this.scope.definitions.indexOf(expression.left.name);
+        if (idx >= 0) this.scope.definitions.splice(idx, 1);
+      }
+    } else if (expression.left.type === 'Identifier') {
+      if (!this.applyMethods('assigned' + expression.left.name, expression)) {
+        // if(!this.applyPluginsBailResult1("assigned " + expression.left.name, expression)) {
+        this.walkExpression(expression.right);
+      }
+      this.scope.renames['$' + expression.left.name] = undefined;
+      if (!this.applyMethods('assign' + expression.left.name, expression)) {
+        // if(!this.applyPluginsBailResult1("assign " + expression.left.name, expression)) {
+        this.walkExpression(expression.left);
+      }
+    } else if (
+      expression.left.type === 'MemberExpression' &&
+      expression.left.object.name === '_this' &&
+      expression.left.property.name === 'config' &&
+      expression.right.type === 'ObjectExpression'
+    ) {
+      // _this.config = {}
+      this.config = expression.right;
+    } else if (
+      expression.left.type === 'MemberExpression' &&
+      expression.left.object.name === 'exports' &&
+      (expression.left.property.name === 'default' || expression.left.property.value === 'default') &&
+      expression.right.type === 'Identifier'
+    ) {
+      // _this.config = {}
+      this.export = expression;
+    } else if (
+      expression.left.type === 'MemberExpression' &&
+      expression.left.object.type === 'ThisExpression' &&
+      expression.left.property.name === 'components' &&
+      expression.right.type === 'ObjectExpression'
+    ) {
+      // this.components = {}
+      this.components = expression;
+    } else {
+      this.walkExpression(expression.right);
+      this.walkPattern(expression.left);
+      this.enterPattern(expression.left, name => {
+        this.scope.renames['$' + name] = undefined;
+      });
+    }
+  }
+
+  walkConditionalExpression(expression) {
+    const result = undefined;
+
+    // const result = this.applyPluginsBailResult1("expression ?:", expression);
+    if (result === undefined) {
+      this.walkExpression(expression.test);
+      this.walkExpression(expression.consequent);
+      if (expression.alternate) this.walkExpression(expression.alternate);
+    } else {
+      if (result) this.walkExpression(expression.consequent);
+      else if (expression.alternate) this.walkExpression(expression.alternate);
+    }
+  }
+
+  walkNewExpression(expression) {
+    this.walkExpression(expression.callee);
+    if (expression.arguments) this.walkExpressions(expression.arguments);
+  }
+
+  walkYieldExpression(expression) {
+    if (expression.argument) this.walkExpression(expression.argument);
+  }
+
+  walkTemplateLiteral(expression) {
+    if (expression.expressions) this.walkExpressions(expression.expressions);
+  }
+
+  walkTaggedTemplateExpression(expression) {
+    if (expression.tag) this.walkExpression(expression.tag);
+    if (expression.quasi && expression.quasi.expressions) this.walkExpressions(expression.quasi.expressions);
+  }
+
+  walkClassExpression(expression) {
+    this.walkClass(expression);
+  }
+
+  walkCallExpression(expression) {
+    let result;
+    function walkIIFE(functionExpression, options, currentThis) {
+      function renameArgOrThis(argOrThis) {
+        const renameIdentifier = this.getRenameIdentifier(argOrThis);
+        if (renameIdentifier && this.applyMethods('canrename' + renameIdentifier, argOrThis)) {
+          // if(renameIdentifier && this.applyPluginsBailResult1("can-rename " + renameIdentifier, argOrThis)) {
+          if (!this.applyMethods('rename' + renameIdentifier, argOrThis))
+            // if(!this.applyPluginsBailResult1("rename " + renameIdentifier, argOrThis))
+            return renameIdentifier;
+        }
+        this.walkExpression(argOrThis);
+      }
+      const params = functionExpression.params;
+      const renameThis = currentThis ? renameArgOrThis.call(this, currentThis) : null;
+      const args = options.map(renameArgOrThis, this);
+      this.inScope(
+        params.filter(function(identifier, idx) {
+          return !args[idx];
+        }),
+        () => {
+          if (renameThis) {
+            this.scope.renames.$this = renameThis;
+          }
+          for (let i = 0; i < args.length; i++) {
+            const param = args[i];
+            if (!param) continue;
+            if (!params[i] || params[i].type !== 'Identifier') continue;
+            this.scope.renames['$' + params[i].name] = param;
+          }
+          if (functionExpression.body.type === 'BlockStatement') {
+            this.prewalkStatement(functionExpression.body);
+            this.walkStatement(functionExpression.body);
+          } else this.walkExpression(functionExpression.body);
+        }
+      );
+    }
+    if (
+      expression.callee.type === 'MemberExpression' &&
+      expression.callee.object.type === 'FunctionExpression' &&
+      !expression.callee.computed &&
+      ['call', 'bind'].indexOf(expression.callee.property.name) >= 0 &&
+      expression.arguments &&
+      expression.arguments.length > 0
+    ) {
+      // (function(...) { }.call/bind(?, ...))
+      walkIIFE.call(this, expression.callee.object, expression.arguments.slice(1), expression.arguments[0]);
+    } else if (expression.callee.type === 'FunctionExpression' && expression.arguments) {
+      // (function(...) { }(...))
+      walkIIFE.call(this, expression.callee, expression.arguments);
+    } else if (expression.callee.type === 'Import') {
+      // result = this.applyPluginsBailResult1("import-call", expression);
+      if (result === true) return;
+
+      if (expression.arguments) this.walkExpressions(expression.arguments);
+    } else {
+      if (expression.callee.type === 'MemberExpression') {
+        let exprName = this.getNameForExpression(expression.callee);
+        // For old version compiler-babel, we can remove it later
+        if (this.compilation.hasHook('walker-detect-entry')) {
+          this.compilation.hook('walker-detect-entry', this, expression, exprName);
+        } else {
+          if (this.scope.instances && exprName && this.scope.instances.indexOf(exprName.instance) !== -1) {
+            // calling wepy instance
+            if (['app', 'page', 'component'].indexOf(exprName.callee) !== -1) {
+              this.entry = expression;
+            }
+          }
+        }
+      }
+
+      const callee = this.evaluateExpression(expression.callee);
+      if (callee.identifier) {
+        let fn = `call${callee.identifier}`;
+        if (this[fn]) {
+          result = this[fn](expression);
+        }
+        // result = this.applyPluginsBailResult1("call " + callee.identifier, expression);
+        if (result === true) return;
+        let identifier = callee.identifier.replace(/\.[^.]+$/, '.*');
+        if (identifier !== callee.identifier) {
+          let fn = `call${identifier}`;
+          if (this[fn]) {
+            result = this[fn](expression);
+          }
+          // result = this.applyPluginsBailResult1("call " + identifier, expression);
+          if (result === true) return;
+        }
+      }
+
+      if (expression.callee) this.walkExpression(expression.callee);
+      if (expression.arguments) this.walkExpressions(expression.arguments);
+    }
+  }
+
+  walkMemberExpression(expression) {
+    const exprName = this.getNameForExpression(expression);
+    if (exprName && exprName.free) {
+      let hookName = 'walker-member-expression-undefined';
+      if (this.compilation.hasHook(hookName)) {
+        this.compilation.hookSeq(hookName, this, expression, exprName);
+      }
+    }
+    this.walkExpression(expression.object);
+    if (expression.computed === true) this.walkExpression(expression.property);
+  }
+
+  walkIdentifier(expression) {
+    if (this.scope.definitions.indexOf(expression.name) === -1) {
+      let hookName = 'walker-identifier-undefined';
+      if (this.compilation.hasHook(hookName)) {
+        this.compilation.hookSeq(hookName, this, expression);
+      }
+    }
+  }
+
+  inScope(params, fn) {
+    const oldScope = this.scope;
+    this.scope = {
+      inTry: false,
+      inShorthand: false,
+      definitions: oldScope.definitions.slice(),
+      renames: Object.create(oldScope.renames)
+    };
+
+    this.scope.renames.$this = undefined;
+
+    for (let paramIndex = 0, len = params.length; paramIndex < len; paramIndex++) {
+      const param = params[paramIndex];
+
+      if (typeof param !== 'string') {
+        this.enterPattern(param, param => {
+          this.scope.renames['$' + param] = undefined;
+          this.scope.definitions.push(param);
+        });
+      } else {
+        this.scope.renames['$' + param] = undefined;
+        this.scope.definitions.push(param);
+      }
+    }
+
+    fn();
+    this.scope = oldScope;
+  }
+
+  enterPattern(pattern, onIdent) {
+    if (pattern && this['enter' + pattern.type]) this['enter' + pattern.type](pattern, onIdent);
+  }
+
+  enterIdentifier(pattern, onIdent) {
+    onIdent(pattern.name, pattern);
+  }
+
+  enterObjectPattern(pattern, onIdent) {
+    for (let propIndex = 0, len = pattern.properties.length; propIndex < len; propIndex++) {
+      const prop = pattern.properties[propIndex];
+      this.enterPattern(prop.value, onIdent);
+    }
+  }
+
+  enterArrayPattern(pattern, onIdent) {
+    for (let elementIndex = 0, len = pattern.elements.length; elementIndex < len; elementIndex++) {
+      const element = pattern.elements[elementIndex];
+      this.enterPattern(element, onIdent);
+    }
+  }
+
+  enterRestElement(pattern, onIdent) {
+    this.enterPattern(pattern.argument, onIdent);
+  }
+
+  enterAssignmentPattern(pattern, onIdent) {
+    this.enterPattern(pattern.left, onIdent);
+  }
+
+  evaluateExpression(expression) {
+    try {
+      let result;
+      let fn = `evaluate${expression.type}`;
+      if (this[fn]) {
+        result = this[fn](expression);
+      }
+      // const result = this.applyPluginsBailResult1("evaluate " + expression.type, expression);
+      if (result !== undefined) return result;
+    } catch (e) {
+      // eslint-disable-next-line no-console
+      console.warn(e);
+      // ignore error
+    }
+    return expression.range;
+    // return new BasicEvaluatedExpression().setRange(expression.range);
+  }
+
+  getRenameIdentifier(expr) {
+    const result = this.evaluateExpression(expr);
+    if (!result) return;
+    if (result.identifier) return result.identifier;
+    return;
+  }
+
+  parseString(expression) {
+    switch (expression.type) {
+      case 'BinaryExpression':
+        if (expression.operator === '+') return this.parseString(expression.left) + this.parseString(expression.right);
+        break;
+      case 'Literal':
+        return expression.value + '';
+    }
+    throw new Error(expression.type + ' is not supported as parameter for require');
+  }
+
+  parseCalculatedString(expression) {
+    switch (expression.type) {
+      case 'BinaryExpression':
+        if (expression.operator === '+') {
+          const left = this.parseCalculatedString(expression.left);
+          const right = this.parseCalculatedString(expression.right);
+          if (left.code) {
+            return {
+              range: left.range,
+              value: left.value,
+              code: true
+            };
+          } else if (right.code) {
+            return {
+              range: [left.range[0], right.range ? right.range[1] : left.range[1]],
+              value: left.value + right.value,
+              code: true
+            };
+          } else {
+            return {
+              range: [left.range[0], right.range[1]],
+              value: left.value + right.value
+            };
+          }
+        }
+        break;
+      case 'ConditionalExpression': {
+        const consequent = this.parseCalculatedString(expression.consequent);
+        const alternate = this.parseCalculatedString(expression.alternate);
+        const items = [];
+        if (consequent.conditional) Array.prototype.push.apply(items, consequent.conditional);
+        else if (!consequent.code) items.push(consequent);
+        else break;
+        if (alternate.conditional) Array.prototype.push.apply(items, alternate.conditional);
+        else if (!alternate.code) items.push(alternate);
+        else break;
+        return {
+          value: '',
+          code: true,
+          conditional: items
+        };
+      }
+      case 'Literal':
+        return {
+          range: expression.range,
+          value: expression.value + ''
+        };
+    }
+    return {
+      value: '',
+      code: true
+    };
+  }
+
+  parseStringArray(expression) {
+    if (expression.type !== 'ArrayExpression') {
+      return [this.parseString(expression)];
+    }
+
+    const arr = [];
+    if (expression.elements)
+      expression.elements.forEach(function(expr) {
+        arr.push(this.parseString(expr));
+      }, this);
+    return arr;
+  }
+
+  parseCalculatedStringArray(expression) {
+    if (expression.type !== 'ArrayExpression') {
+      return [this.parseCalculatedString(expression)];
+    }
+
+    const arr = [];
+    if (expression.elements)
+      expression.elements.forEach(function(expr) {
+        arr.push(this.parseCalculatedString(expr));
+      }, this);
+    return arr;
+  }
+
+  /*
+  parse(source, initialState) {
+    let ast;
+    const comments = [];
+    for (let i = 0, len = POSSIBLE_AST_OPTIONS.length; i < len; i++) {
+      if (!ast) {
+        try {
+          comments.length = 0;
+          POSSIBLE_AST_OPTIONS[i].onComment = comments;
+          ast = acorn.parse(source, POSSIBLE_AST_OPTIONS[i]);
+        } catch (e) {
+          // ignore the error
+        }
+      }
+    }
+    if (!ast) {
+      // for the error
+      ast = acorn.parse(source, {
+        ranges: true,
+        locations: true,
+        ecmaVersion: ECMA_VERSION,
+        sourceType: 'module',
+        plugins: {
+          dynamicImport: true
+        },
+        onComment: comments
+      });
+    }
+    if (!ast || typeof ast !== 'object') throw new Error("Source couldn't be parsed");
+    const oldScope = this.scope;
+    const oldState = this.state;
+    const oldComments = this.comments;
+    this.scope = {
+      inTry: false,
+      definitions: [],
+      renames: {}
+    };
+    const state = (this.state = initialState || {});
+    this.comments = comments;
+    if (this.applyPluginsBailResult('program', ast, comments) === undefined) {
+      this.prewalkStatements(ast.body);
+      this.walkStatements(ast.body);
+    }
+    this.scope = oldScope;
+    this.state = oldState;
+    this.comments = oldComments;
+    return state;
+  } */
+
+  /*
+  evaluate(source) {
+    const ast = acorn.parse('(' + source + ')', {
+      ranges: true,
+      locations: true,
+      ecmaVersion: ECMA_VERSION,
+      sourceType: 'module',
+      plugins: {
+        dynamicImport: true
+      }
+    });
+    if (!ast || typeof ast !== 'object' || ast.type !== 'Program')
+      throw new Error("evaluate: Source couldn't be parsed");
+    if (ast.body.length !== 1 || ast.body[0].type !== 'ExpressionStatement')
+      throw new Error('evaluate: Source is not a expression');
+    return this.evaluateExpression(ast.body[0].expression);
+  }
+
+  getComments(range) {
+    return this.comments.filter(comment => comment.range[0] >= range[0] && comment.range[1] <= range[1]);
+  }
+
+  getCommentOptions(range) {
+    const comments = this.getComments(range);
+    if (comments.length === 0) return null;
+    const options = comments.map(comment => {
+      try {
+        return json5.parse(`{${comment.value}}`);
+      } catch (e) {
+        return {};
+      }
+    });
+    return options.reduce((o, i) => Object.assign(o, i), {});
+  }
+  */
+
+  getNameForExpression(expression) {
+    let expr = expression;
+    const exprName = [];
+    while (expr.type === 'MemberExpression' && expr.property.type === (expr.computed ? 'Literal' : 'Identifier')) {
+      exprName.push(expr.computed ? expr.property.value : expr.property.name);
+      expr = expr.object;
+    }
+    let free;
+    if (expr.type === 'Identifier') {
+      free = this.scope.definitions.indexOf(expr.name) === -1;
+      exprName.push(this.scope.renames['$' + expr.name] || expr.name);
+    } else if (expr.type === 'ThisExpression' && this.scope.renames.$this) {
+      free = true;
+      exprName.push(this.scope.renames.$this);
+    } else if (expr.type === 'ThisExpression') {
+      free = false;
+      exprName.push('this');
+    } else {
+      return null;
+    }
+    let prefix = '';
+    for (let i = exprName.length - 1; i >= 1; i--) prefix += exprName[i] + '.';
+    const name = prefix + exprName[0];
+    const nameGeneral = prefix + '*';
+    return {
+      name,
+      nameGeneral,
+      instance: prefix.substring(0, prefix.length - 1),
+      callee: exprName[0],
+      free
+    };
+  }
+
+  // Plugins
+  evaluateMemberExpression(expression) {
+    let exprName = this.getNameForExpression(expression);
+    if (exprName) {
+      if (exprName.free) {
+        let fn = `evaluateIdentifier${exprName.name}`;
+        let rst;
+        if (this[fn]) {
+          rst = this[fn](expression);
+        }
+        return rst
+          ? rst
+          : {
+              identifier: exprName.name,
+              range: expression.range
+            };
+        // const result = this.applyPluginsBailResult1("evaluate Identifier " + exprName.name, expression);
+        // if(result) return result;
+        // return new BasicEvaluatedExpression().setIdentifier(exprName.name).setRange(expression.range);
+      } else {
+        let fn = `evaluatedefinedIdentifier${exprName.name}`;
+        let rst;
+        if (this[fn]) {
+          rst = this[fn](expression);
+        }
+        return rst;
+        // return this.applyPluginsBailResult1("evaluate defined Identifier " + exprName.name, expression);
+      }
+    }
+  }
+
+  evaluateIdentifier(expr) {
+    const name = this.scope.renames['$' + expr.name] || expr.name;
+    if (this.scope.definitions.indexOf(expr.name) === -1) {
+      let fn = `evaluateIdentifier${name}`;
+      let rst;
+      if (this[fn]) {
+        rst = this[fn](expr);
+      }
+      return rst
+        ? rst
+        : {
+            identifier: name,
+            range: expr.range
+          };
+      // const result = this.applyPluginsBailResult1("evaluate Identifier " + exprName.name, expr);
+      // if(result) return result;
+      // return new BasicEvaluatedexpr().setIdentifier(exprName.name).setRange(expr.range);
+    } else {
+      let fn = `evaluatedefinedIdentifier${name}`;
+      let rst;
+      if (this[fn]) {
+        rst = this[fn](expr);
+      }
+      return rst;
+      // return this.applyPluginsBailResult1("evaluate defined Identifier " + exprName.name, expression);
+    }
+  }
+  applyMethods(method, expr) {
+    let rst;
+    if (this[method]) {
+      rst = this[method](expr);
+    }
+    return rst;
+  }
+  /*
+  callrequire (expr) {
+    // support for browserify style require delegator: "require(o, !0)"
+    if(expr.arguments.length !== 2) return;
+    const second = this.evaluateExpression(expr.arguments[1]);
+    if(!second.isBoolean()) return;
+    if(second.asBool() !== true) return;
+    // const dep = new ConstDependency("require", expr.callee.range);
+    const demp = {
+      expression: 'require',
+      range: expr.callee.range
+    };
+    dep.loc = expr.loc;
+    if(this.state.current.dependencies.length > 1) {
+      const last = this.state.current.dependencies[this.state.current.dependencies.length - 1];
+      if(last.critical && last.request === "." && last.userRequest === "." && last.recursive)
+        this.state.current.dependencies.pop();
+    }
+    this.state.current.addDependency(dep);
+    return true;
+  }*/
+  callrequire(expr) {
+    let param;
+    let dep;
+    let result;
+
+    const old = this.state.current;
+
+    if (expr.arguments.length >= 1) {
+      param = this.evaluateExpression(expr.arguments[0]);
+      dep = {
+        expr: expr,
+        outerRange: param.range,
+        arrayRange: expr.arguments.length > 1 ? expr.arguments[1].range : null,
+        functionRange: expr.arguments.length > 2 ? expr.arguments[2].range : null,
+        errorCallbackRange: this.state.module,
+        module: expr.arguments[0].type === 'Literal' ? expr.arguments[0].value : '',
+        loc: expr.loc
+      };
+      /*
+      dep = new AMDRequireDependenciesBlock(
+        expr,
+        param.range,
+        (expr.arguments.length > 1) ? expr.arguments[1].range : null,
+        (expr.arguments.length > 2) ? expr.arguments[2].range : null,
+        this.state.module,
+        expr.loc
+      );*/
+      this.deps.push(dep);
+      this.state.current = dep;
+    }
+
+    if (expr.arguments.length === 1) {
+      this.inScope([], () => {
+        let fn = `callrequireAmdArray`;
+        result = this[fn] ? this[fn](expr, param) : undefined;
+        // result = this.applyPluginsBailResult("call require:amd:array", expr, param);
+      });
+      this.state.current = old;
+      if (!result) return;
+      // this.state.current.addBlock(dep);
+      return true;
+    }
+
+    if (expr.arguments.length === 2 || expr.arguments.length === 3) {
+      try {
+        this.inScope([], () => {
+          let fn = `callrequireAmdArray`;
+          result = this[fn] ? this[fn](expr, param) : undefined;
+          // result = this.applyPluginsBailResult("call require:amd:array", expr, param);
+        });
+        /*
+        if (!result) {
+          dep = new UnsupportedDependency('unsupported', expr.range);
+          old.addDependency(dep);
+          if (this.state.module)
+            this.state.module.errors.push(
+              new UnsupportedFeatureWarning(
+                this.state.module,
+                'Cannot statically analyse \'require(..., ...)\' in line ' + expr.loc.start.line
+              )
+            );
+          dep = null;
+          return true;
+        }
+        dep.functionBindThis = this.processFunctionArgument(parser, expr.arguments[1]);
+        if (expr.arguments.length === 3) {
+          dep.errorCallbackBindThis = this.processFunctionArgument(parser, expr.arguments[2]);
+        }*/
+      } finally {
+        this.state.current = old;
+        if (dep) this.state.current.addBlock(dep);
+      }
+      return true;
+    }
+  }
+
+  callrequireAmdArray(expr, param) {
+    // if(param.isArray()) {
+    if (param.items && param.items.forEach) {
+      param.items.forEach(param => {
+        let result;
+        let fn = `callrequireAmdItem`;
+        if (this[fn]) {
+          result = this[fn](expr, param);
+        }
+        // const result = this.applyPluginsBailResult("call require:amd:item", expr, param);
+        if (result === undefined) {
+          let fn = `callrequireAmdContext`;
+          if (this[fn]) {
+            this[fn](expr, param);
+          }
+          // this.applyPluginsBailResult("call require:amd:context", expr, param);
+        }
+      });
+      return true;
+      // } else if(param.isConstArray()) {
+    } else if (param.array && param.array.length) {
+      const deps = [];
+      param.array.forEach(request => {
+        let dep /*, localModule*/;
+        if (request === 'require') {
+          dep = '__webpack_require__';
+        } else if (['exports', 'module'].indexOf(request) >= 0) {
+          dep = request;
+        } /*else if ((localModule = LocalModulesHelpers.getLocalModule(this.state, request))) {
+          // eslint-disable-line no-cond-assign
+          dep = new LocalModuleDependency(localModule);
+          dep.loc = expr.loc;
+          this.state.current.addDependency(dep);
+        } else {
+          dep = new AMDRequireItemDependency(request);
+          dep.loc = expr.loc;
+          dep.optional = !!this.scope.inTry;
+          this.state.current.addDependency(dep);
+        }*/
+        deps.push(dep);
+      });
+      // const dep = new AMDRequireArrayDependency(deps, param.range);
+      const dep = {
+        // depsArray: depsArray,
+        range: param.range
+      };
+      dep.loc = expr.loc;
+      dep.optional = !!this.scope.inTry;
+      // this.state.current.addDependency(dep);
+      return true;
+    }
+  }
+
+  callrequireAmdItem(expr, param) {
+    if (param.isConditional()) {
+      param.options.forEach(param => {
+        let fn = 'callrequireAmdItem';
+        const result = this[fn] ? this[fn](expr, param) : undefined;
+        // const result = this.applyPluginsBailResult("call require:amd:item", expr, param);
+        if (result === undefined) {
+          let fn = 'callrequireAmdContext';
+          if (this[fn]) {
+            this[fn](expr, param);
+          }
+          this.applyPluginsBailResult('call require:amd:context', expr, param);
+        }
+      });
+      return true;
+    } else if (param.isString()) {
+      /*
+      let dep, localModule;
+      if (param.string === 'require') {
+        dep = new ConstDependency('__webpack_require__', param.string);
+      } else if (param.string === 'module') {
+        dep = new ConstDependency(this.state.module.moduleArgument || 'module', param.range);
+      } else if (param.string === 'exports') {
+        dep = new ConstDependency(this.state.module.exportsArgument || 'exports', param.range);
+      } else if ((localModule = LocalModulesHelpers.getLocalModule(this.state, param.string))) {
+        // eslint-disable-line no-cond-assign
+        dep = new LocalModuleDependency(localModule, param.range);
+      } else {
+        dep = new AMDRequireItemDependency(param.string, param.range);
+      }
+      dep.loc = expr.loc;
+      dep.optional = !!this.scope.inTry;
+      this.state.current.addDependency(dep);
+      */
+      return true;
+    }
+  }
+
+  callrequireAmdContext(/*expr, param*/) {
+    /*
+    const dep = ContextDependencyHelpers.create(AMDRequireContextDependency, param.range, param, expr, options);
+    if (!dep) return;
+    dep.loc = expr.loc;
+    dep.optional = !!this.scope.inTry;
+    this.state.current.addDependency(dep);
+    */
+    return true;
+  }
+}
+
+exports = module.exports = AstWalker;
diff --git a/packages/cli/core/ast/wxml.js b/packages/cli/core/ast/wxml.js
new file mode 100644
index 000000000..e39b74873
--- /dev/null
+++ b/packages/cli/core/ast/wxml.js
@@ -0,0 +1,68 @@
+const htmlparser = require('htmlparser2');
+
+const walk = function(ast, opt) {
+  let { type, name, attr } = opt;
+  ast.forEach(item => {
+    if (type && typeof type[item.type] === 'function') {
+      type[item.type].call(null, item);
+    }
+    if (name && typeof name[item.name] === 'function') {
+      name[item.name].call(null, item);
+    }
+    if (attr && item.attribs) {
+      for (let key in item.attribs) {
+        if (attr[key] && typeof attr[key] === 'function') {
+          attr[key].call(null, item, attr, item.attribs[key]);
+        }
+      }
+    }
+  });
+};
+
+const generate = function(ast) {
+  let str = '';
+  if (!Array.isArray(ast)) {
+    ast = [ast];
+  }
+
+  ast.forEach(item => {
+    if (item.type === 'text') {
+      str += item.data;
+    } else if (item.type === 'tag') {
+      str += '<' + item.name;
+      if (item.attribs) {
+        Object.keys(item.attribs).forEach(attr => {
+          if (item.attribs[attr] !== undefined)
+            str += item.attribs[attr] === true ? ` ${attr}` : ` ${attr}="${item.attribs[attr]}"`;
+        });
+      }
+      str += '>';
+      if (item.children && item.children.length) {
+        str += generate(item.children);
+      }
+      str += `</${item.name}>`;
+    }
+  });
+  return str;
+};
+
+module.exports = function ast(html) {
+  return new Promise((resolve, reject) => {
+    const handler = new htmlparser.DomHandler(
+      function(error, dom) {
+        if (error) {
+          reject(error);
+        } else {
+          resolve(dom);
+        }
+      },
+      { withStartIndices: true, withEndIndices: true }
+    );
+    const parser = new htmlparser.Parser(handler, { xmlMode: true });
+    parser.write(html);
+    parser.end();
+  });
+};
+
+module.exports.walk = walk;
+module.exports.generate = generate;
diff --git a/packages/cli/core/compile.js b/packages/cli/core/compile.js
new file mode 100644
index 000000000..49b2c12f3
--- /dev/null
+++ b/packages/cli/core/compile.js
@@ -0,0 +1,599 @@
+/**
+ * Tencent is pleased to support the open source community by making WePY available.
+ * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
+ * http://opensource.org/licenses/MIT
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+const fs = require('fs-extra');
+const path = require('path');
+const chokidar = require('chokidar');
+const ResolverFactory = require('enhanced-resolve').ResolverFactory;
+const node = require('enhanced-resolve/lib/node');
+const NodeJsInputFileSystem = require('enhanced-resolve/lib/NodeJsInputFileSystem');
+const CachedInputFileSystem = require('enhanced-resolve/lib/CachedInputFileSystem');
+const parseOptions = require('./parseOptions');
+const moduleSet = require('./moduleSet');
+const fileDep = require('./fileDep');
+const logger = require('./util/logger');
+const VENDOR_DIR = require('./util/const').VENDOR_DIR;
+const Hook = require('./hook');
+const tag = require('./tag');
+const { isArr } = require('./util/tools');
+const { debounce } = require('throttle-debounce');
+
+const initCompiler = require('./init/compiler');
+const initParser = require('./init/parser');
+const initPlugin = require('./init/plugin');
+
+class Compile extends Hook {
+  constructor(opt) {
+    super();
+    let self = this;
+
+    this.version = require('../package.json').version;
+    this.options = opt;
+
+    if (!path.isAbsolute(opt.entry)) {
+      this.options.entry = path.resolve(path.join(opt.src, opt.entry + opt.wpyExt));
+    }
+
+    this.resolvers = {};
+    this.running = false;
+
+    this.context = process.cwd();
+
+    let appConfig = opt.appConfig || {};
+    let userDefinedTags = appConfig.tags || {};
+
+    this.tags = {
+      htmlTags: tag.combineTag(tag.HTML_TAGS, userDefinedTags.htmlTags),
+      wxmlTags: tag.combineTag(tag.WXML_TAGS, userDefinedTags.wxmlTags),
+      selfCloseTags: tag.SELF_CLOSE_TAGS,
+      html2wxmlMap: tag.combineTagMap(tag.HTML2WXML_MAP, userDefinedTags.html2wxmlMap)
+    };
+
+    this.logger = logger;
+
+    this.inputFileSystem = new CachedInputFileSystem(new NodeJsInputFileSystem(), 60000);
+
+    this.options.resolve.extensions = ['.js', '.ts', '.json', '.node', '.wxs', this.options.wpyExt];
+
+    this.resolvers.normal = ResolverFactory.createResolver(
+      Object.assign(
+        {
+          fileSystem: this.inputFileSystem
+        },
+        this.options.resolve
+      )
+    );
+
+    this.resolvers.context = ResolverFactory.createResolver(
+      Object.assign(
+        {
+          fileSystem: this.inputFileSystem,
+          resolveToContext: true
+        },
+        this.options.resolve
+      )
+    );
+
+    this.resolvers.normal.resolveSync = node.create.sync(
+      Object.assign(
+        {
+          fileSystem: this.inputFileSystem
+        },
+        this.options.resolve
+      )
+    );
+
+    this.resolvers.context.resolveSync = node.create.sync(
+      Object.assign(
+        {
+          fileSystem: this.inputFileSystem,
+          resolveToContext: true
+        },
+        this.options.resolve
+      )
+    );
+
+    let fnNormalBak = this.resolvers.normal.resolve;
+    this.resolvers.normal.resolve = function(...args) {
+      return new Promise((resolve, reject) => {
+        args.push(function(err, filepath, meta) {
+          if (err) {
+            reject(err);
+          } else {
+            resolve({ path: filepath, meta: meta });
+          }
+        });
+        fnNormalBak.apply(self.resolvers.normal, args);
+      });
+    };
+    let fnContextBak = this.resolvers.context.resolve;
+    this.resolvers.context.resolve = function(...args) {
+      return new Promise((resolve, reject) => {
+        args.push(function(err, filepath, meta) {
+          if (err) {
+            reject(err);
+          } else {
+            resolve({ path: filepath, meta: meta });
+          }
+        });
+        fnContextBak.apply(self.resolvers.context, args);
+      });
+    };
+  }
+
+  clear(type) {
+    this.hook('process-clear', type);
+    return this;
+  }
+
+  run() {
+    return this.init().then(() => this.start());
+  }
+
+  init() {
+    this.register('process-clear', () => {
+      this.compiled = {};
+      this.vendors = new moduleSet();
+      this.assets = new moduleSet();
+      this.fileDep = new fileDep();
+    });
+
+    ['output-app', 'output-pages', 'output-components'].forEach(k => {
+      this.register(k, data => {
+        if (!isArr(data)) data = [data];
+
+        data.forEach(v => this.output('wpy', v));
+      });
+    });
+
+    this.register('output-vendor', data => {
+      this.output('vendor', data);
+    });
+
+    this.register('output-assets', list => {
+      list.forEach(file => {
+        this.output('assets', file);
+      });
+    });
+
+    this.register('output-static', () => {
+      let paths = this.options.static;
+      let copy = p => {
+        let relative = path.relative(path.join(this.context, this.options.src), path.join(this.context, p));
+        const target = path.join(this.context, p);
+        if (fs.existsSync(target)) {
+          const dest = path.join(this.context, this.options.output, relative[0] === '.' ? p : relative);
+          return fs.copy(target, dest);
+        }
+        return Promise.resolve(true);
+      };
+      if (typeof paths === 'string') return copy(paths);
+      else if (isArr(paths)) return Promise.all(paths.map(p => copy(p)));
+    });
+
+    initParser(this);
+    initPlugin(this);
+
+    this.hook('process-clear', 'init');
+
+    return initCompiler(this, this.options.compilers);
+  }
+
+  start() {
+    if (this.running) {
+      return;
+    }
+
+    this.running = true;
+    this.logger.info('build app', 'start...');
+
+    this.hookUnique('wepy-parser-wpy', { path: this.options.entry, type: 'app' })
+      .then(app => {
+        let sfc = app.sfc;
+        let config = sfc.config;
+
+        let appConfig = config.parsed.output;
+        if (!appConfig.pages || appConfig.pages.length === 0) {
+          appConfig.pages = [];
+          this.hookUnique('error-handler', {
+            type: 'warn',
+            ctx: app,
+            message: `Missing "pages" in App config`
+          });
+        }
+        let pages = appConfig.pages.map(v => {
+          return path.resolve(app.file, '..', v);
+        });
+
+        if (appConfig.subPackages || appConfig.subpackages) {
+          (appConfig.subpackages || appConfig.subPackages).forEach(sub => {
+            // Wepy don't support independent subPackages now
+            if (sub.independent) {
+              this.logger.warn(
+                'Independent subpackages is found in app config. Currently, it is not supported in WePY.'
+              );
+              throw new Error('EXIT');
+            }
+
+            sub.pages.forEach(v => {
+              pages.push(path.resolve(app.file, '../' + sub.root || '', v));
+            });
+          });
+        }
+
+        let pageTasks = pages.map(v => {
+          let file;
+
+          file = v + this.options.wpyExt;
+          if (fs.existsSync(file)) {
+            return this.hookUnique('wepy-parser-wpy', { path: file, type: 'page' });
+          }
+          file = v + '.js';
+          if (fs.existsSync(file)) {
+            return this.hookUnique('wepy-parser-component', { path: file, type: 'page', npm: false });
+          }
+          this.hookUnique('error-handler', {
+            type: 'error',
+            ctx: app,
+            message: `Can not resolve page: ${v}`
+          });
+        });
+
+        let components = [];
+        if (appConfig.usingComponents) {
+          for (let key in appConfig.usingComponents) {
+            let v = appConfig.usingComponents[key];
+            components.push(path.resolve(app.file, '../', v));
+          }
+        }
+
+        let componentsTask = components.map(v => {
+          let file;
+
+          file = v + this.options.wpyExt;
+          if (fs.existsSync(file)) {
+            return this.hookUnique('wepy-parser-wpy', { path: file, type: 'wepy' });
+          }
+          file = v + '.js';
+          if (fs.existsSync(file)) {
+            return this.hookUnique('wepy-parser-component', { path: file, type: 'wepy', npm: false });
+          }
+          this.hookUnique('error-handler', {
+            type: 'error',
+            ctx: app,
+            message: `Can not resolve page: ${v}`
+          });
+        });
+
+        let tasks = [...pageTasks, ...componentsTask];
+        if (appConfig.tabBar && appConfig.tabBar.custom) {
+          let file = path.resolve(app.file, '..', 'custom-tab-bar/index' + this.options.wpyExt);
+          if (fs.existsSync(file)) {
+            tasks.push(this.hookUnique('wepy-parser-wpy', { path: file, type: 'wepy' }));
+          }
+        }
+
+        this.hookSeq('build-app', app);
+        this.hookUnique('output-app', app);
+        return Promise.all(tasks);
+      })
+      .then(this.buildComps.bind(this))
+      .catch(this.handleBuildErr.bind(this));
+  }
+
+  buildComps(comps) {
+    let components = [];
+    let originalComponents = [];
+
+    function buildComponents(comps) {
+      if (!comps) {
+        return Promise.resolve();
+      }
+      this.hookSeq('build-components', comps);
+      this.hookUnique('output-components', comps);
+
+      let tasks = [];
+
+      comps.forEach(comp => {
+        let config = comp.sfc.config || {};
+        let parsed = config.parsed || {};
+        let parsedComponents = parsed.components || [];
+
+        parsedComponents.forEach(com => {
+          if (com.type === 'wepy' && !components.includes(com.path)) {
+            // wepy 组件
+            tasks.push(this.hookUnique('wepy-parser-wpy', com));
+            components.push(com.path);
+          } else if (com.type === 'weapp' && !originalComponents.includes(com.path)) {
+            // 原生组件
+            tasks.push(this.hookUnique('wepy-parser-component', com));
+            originalComponents.push(com.path);
+          }
+        });
+      });
+
+      if (tasks.length) {
+        return Promise.all(tasks).then(buildComponents.bind(this));
+      } else {
+        return Promise.resolve();
+      }
+    }
+
+    return buildComponents
+      .bind(this)(comps)
+      .then(() => {
+        let vendorData = this.hookSeq('build-vendor', {});
+        this.hookUnique('output-vendor', vendorData);
+      })
+      .then(() => {
+        let assetsData = this.hookSeq('build-assets');
+        this.hookUnique('output-assets', assetsData);
+      })
+      .then(() => {
+        return this.hookUnique('output-static');
+      })
+      .then(() => {
+        this.hookSeq('process-done');
+        this.running = false;
+        this.logger.info('build', 'finished');
+        if (this.options.watch) {
+          this.logger.info('watching...');
+          this.watch();
+        }
+      });
+  }
+
+  weappBuild(buildTask) {
+    if (this.running) {
+      return;
+    }
+    this.running = true;
+    this.logger.info('build weapp files', 'start...');
+
+    const tasks = buildTask.files.map(file => {
+      const comp = this.compiled[file];
+
+      return this.hookUnique('wepy-parser-component', comp);
+    });
+
+    Promise.all(tasks)
+      .then(this.buildComps.bind(this))
+      .catch(this.handleBuildErr.bind(this));
+  }
+
+  partialBuild(buildTask) {
+    if (this.running) {
+      return;
+    }
+    this.running = true;
+    this.logger.info('build wpy files', 'start...');
+
+    // just compile these files of wpyExt
+    const tasks = buildTask.files.map(file => {
+      if (fs.existsSync(file)) {
+        let type = 'page';
+        if (this.compiled[file]) {
+          type = this.compiled[file].type;
+        }
+        return this.hookUnique('wepy-parser-wpy', { path: file, type });
+      }
+      this.hookUnique('error-handler', {
+        type: 'error',
+        ctx: {},
+        message: `Can not resolve page: ${file}`
+      });
+    });
+
+    Promise.all(tasks)
+      .then(this.buildComps.bind(this))
+      .catch(this.handleBuildErr.bind(this));
+  }
+
+  assetsBuild(buildTask) {
+    if (this.running) {
+      return;
+    }
+    this.running = true;
+    this.logger.info('build ' + buildTask.assetExt + ' files', 'start...');
+
+    const tasks = buildTask.files.map(file => {
+      const ctx = this.compiled[file];
+      return this.hookUnique('wepy-parser-file', {}, ctx);
+    });
+
+    // just compile, build and out assets
+    Promise.all(tasks)
+      .then(() => {
+        return this.buildComps(undefined);
+      })
+      .catch(this.handleBuildErr.bind(this));
+  }
+
+  handleBuildErr(err) {
+    this.running = false;
+    if (err.message !== 'EXIT') {
+      this.logger.error(err);
+    }
+    if (this.logger.level() !== 'trace') {
+      this.logger.error('compile', 'Compile failed. Add "--log trace" to see more details');
+    } else {
+      this.logger.error('compile', 'Compile failed.');
+    }
+    if (this.options.watch) {
+      this.logger.info('watching...');
+      this.watch();
+    }
+  }
+
+  watch() {
+    if (this.watchInitialized) {
+      return;
+    }
+    this.watchInitialized = true;
+    let watchOption = Object.assign({ ignoreInitial: true, depth: 99 }, this.options.watchOption || {});
+    // let target = path.resolve(this.context, this.options.target);
+
+    if (watchOption.ignore) {
+      let type = Object.prototype.toString.call(watchOption.ignore);
+      if (type === '[object String]' || type === '[object RegExp]') {
+        watchOption.ignored = [watchOption.ignored];
+        watchOption.ignored.push(this.options.target);
+      } else if (type === '[object Array]') {
+        watchOption.ignored.push(this.options.target);
+      }
+    } else {
+      watchOption.ignored = [this.options.target];
+    }
+
+    const pendingFiles = [];
+
+    // debounce for watch files
+    const onFileChanged = debounce(300, () => {
+      const changedFiles = pendingFiles.splice(0, pendingFiles.length);
+      if (changedFiles.length > 1) {
+        // if more then one files changed, build the whole app.
+        this.start();
+      } else {
+        let buildTask = {
+          changed: changedFiles[0],
+          partial: true,
+          files: [],
+          outputAssets: false
+        };
+        this.hookAsyncSeq('before-wepy-watch-file-changed', buildTask).then(task => {
+          if (task.weapp && task.files.length > 0) {
+            this.weappBuild(buildTask);
+          } else if (task.outputAssets && task.files.length > 0) {
+            this.assetsBuild(buildTask);
+          } else if (task.partial && task.files.length > 0) {
+            this.partialBuild(buildTask);
+          } else {
+            this.start();
+          }
+        });
+      }
+    });
+
+    chokidar.watch([this.options.src], watchOption).on('all', (evt, filepath) => {
+      if (evt === 'change') {
+        const file = path.resolve(filepath);
+        if (!pendingFiles.includes(file)) {
+          pendingFiles.push(file);
+        }
+        onFileChanged();
+      }
+    });
+  }
+
+  applyCompiler(node, ctx) {
+    ctx.id = this.assets.add(ctx.file);
+
+    if (node.lang) {
+      let hookKey = 'wepy-compiler-' + node.lang;
+
+      if (!this.hasHook(hookKey)) {
+        throw `Missing plugins ${hookKey}`;
+      }
+
+      let task;
+
+      // If file is not changed, and compiled cache exsit.
+      // Style may have dependences, maybe the dependences file changed. so ignore the cache for the style who have deps.
+      if (ctx.useCache && node.compiled && (node.compiled.dep || []).length === 0) {
+        task = Promise.resolve(node);
+      } else {
+        task = this.hookUnique(hookKey, node, ctx);
+      }
+      return task
+        .then(node => {
+          return this.hookAsyncSeq('before-wepy-parser-' + node.type, { node, ctx });
+        })
+        .then(({ node, ctx }) => {
+          return this.hookUnique('wepy-parser-' + node.type, node, ctx);
+        });
+    }
+  }
+
+  getTarget(file, targetDir) {
+    let relative = path.relative(path.join(this.context, this.options.src), file);
+    let targetFile = path.join(this.context, targetDir || this.options.target, relative);
+    return targetFile;
+  }
+
+  getModuleTarget(file, targetDir) {
+    let relative = path.relative(this.context, file);
+    let dirs = relative.split(path.sep);
+    dirs.shift(); // shift node_modules
+    relative = dirs.join(path.sep);
+    let targetFile = path.join(this.context, targetDir || this.options.target, VENDOR_DIR, relative);
+    return targetFile;
+  }
+
+  outputFile(filename, code, encoding) {
+    this.hookAsyncSeq('output-file', { filename, code, encoding })
+      .then(({ filename, code, encoding }) => {
+        if (!code) {
+          logger.silly('output', 'empty content: ' + filename);
+        } else {
+          logger.silly('output', 'write file: ' + filename);
+
+          fs.outputFile(filename, code, encoding || 'utf-8', err => {
+            if (err) {
+              // eslint-disable-next-line no-console
+              console.log(err);
+            }
+          });
+        }
+      })
+      .catch(e => {
+        if (e.handler) {
+          this.hookUnique('error-handler', e.handler, e.error, e.pos);
+        } else {
+          // TODO
+          throw e;
+        }
+      });
+  }
+
+  output(type, item) {
+    let filename, code, encoding;
+
+    if (type === 'wpy') {
+      const sfc = item.sfc;
+      const outputMap = {
+        script: 'js',
+        styles: 'wxss',
+        config: 'json',
+        template: 'wxml'
+      };
+
+      Object.keys(outputMap).forEach(k => {
+        if (sfc[k] && sfc[k].outputCode) {
+          filename = item.outputFile + '.' + outputMap[k];
+          code = sfc[k].outputCode;
+
+          this.outputFile(filename, code, encoding);
+        }
+      });
+    } else {
+      filename = item.targetFile;
+      code = item.outputCode;
+      encoding = item.encoding;
+
+      this.outputFile(filename, code, encoding);
+    }
+  }
+}
+
+exports = module.exports = program => {
+  const opt = parseOptions.parse(program);
+
+  const compilation = new Compile(opt);
+
+  return compilation;
+};
diff --git a/packages/cli/core/fileDep.js b/packages/cli/core/fileDep.js
new file mode 100644
index 000000000..852f044ed
--- /dev/null
+++ b/packages/cli/core/fileDep.js
@@ -0,0 +1,49 @@
+class FileDep {
+  constructor() {
+    this._depMap = {};
+    this._depedMap = {};
+  }
+
+  cleanDeps(source) {
+    const deps = this._depMap[source] || [];
+    deps.forEach(dep => {
+      const depeds = this._depedMap[dep] || [];
+      if (depeds.length > 0) {
+        this._depedMap[dep] = depeds.filter(deped => deped !== source);
+        if (this._depedMap[dep].length === 0) {
+          delete this._depedMap[dep];
+        }
+      }
+    });
+    delete this._depMap[source];
+  }
+
+  addDeps(source, deps = []) {
+    if (!this._depMap[source]) {
+      this._depMap[source] = [];
+    }
+    deps.forEach(dep => {
+      if (!this._depMap[source].includes(dep)) {
+        this._depMap[source].push(dep);
+        if (!this._depedMap[dep]) {
+          this._depedMap[dep] = [];
+        }
+        this._depedMap[dep].push(source);
+      }
+    });
+  }
+
+  getDeps(source) {
+    return this._depMap[source] || [];
+  }
+
+  getSources(dep) {
+    return this._depedMap[dep] || [];
+  }
+
+  isInvolved(file) {
+    return this._depMap.hasOwnProperty(file) || this._depedMap.hasOwnProperty(file);
+  }
+}
+
+exports = module.exports = FileDep;
diff --git a/packages/cli/core/hook.js b/packages/cli/core/hook.js
new file mode 100644
index 000000000..e782de751
--- /dev/null
+++ b/packages/cli/core/hook.js
@@ -0,0 +1,117 @@
+class Hook {
+  constructor() {
+    this._hooks = {};
+  }
+
+  register(key, fn) {
+    if (!this._hooks[key]) {
+      this._hooks[key] = [];
+    }
+    this._hooks[key].push(fn);
+
+    return () => {
+      this.unregister(key, fn);
+    };
+  }
+
+  hasHook(key) {
+    return (this._hooks[key] || []).length > 0;
+  }
+
+  hook(key, ...args) {
+    let rst = [];
+    let fns = this._hooks[key] || [];
+    fns.forEach(fn => {
+      typeof fn === 'function' && rst.push(fn.apply(this, args));
+    });
+    return rst;
+  }
+
+  hookSeq(key, ...args) {
+    let rst = args;
+    let fns = this._hooks[key] || [];
+    let hasHook = false;
+
+    fns.forEach((fn, i) => {
+      if (typeof fn === 'function') {
+        hasHook = true;
+        if (fn.length > 1) {
+          rst = fn.apply(this, rst);
+        } else {
+          rst = fn.call(this, i === 0 ? rst[0] : rst);
+        }
+      }
+    });
+
+    return hasHook ? rst : rst.length <= 1 ? rst[0] : rst;
+  }
+
+  hookUnique(key, ...args) {
+    let fns = this._hooks[key] || [];
+    let lastFn = fns[fns.length - 1];
+
+    if (typeof lastFn === 'function') {
+      return lastFn.apply(this, args);
+    }
+  }
+
+  hookUniqueReturnArg(key, ...args) {
+    let rst = this.hookUnique(key, ...args);
+    if (typeof rst === 'undefined') {
+      rst = args.length <= 1 ? args[0] : args;
+    }
+    return rst;
+  }
+
+  hookAsyncSeq(key, ...args) {
+    // if hook registered, return last rst, else return args
+    let rst = args;
+    let fns = this._hooks[key] || [];
+    let lastRst = rst;
+    let argLength = args.length;
+
+    if (fns.length === 0) {
+      return Promise.resolve(argLength === 1 ? args[0] : args);
+    }
+
+    const iterateFunc = (pfn, cfn) => {
+      return pfn.then(v => {
+        if (!Array.isArray(v)) {
+          v = [v];
+        }
+        lastRst = v;
+        return cfn.apply(this, lastRst);
+      });
+    };
+
+    fns = fns.concat((...lastRst) => Promise.resolve(argLength === 1 ? lastRst[0] : lastRst));
+
+    return fns.reduce(iterateFunc, Promise.resolve(args));
+  }
+
+  hookReturnOrigin(key, ...args) {
+    let fns = this._hooks[key] || [];
+    fns.forEach(fn => {
+      typeof fn === 'function' && fn.apply(this, args);
+    });
+    return args.length <= 1 ? args[0] : args;
+  }
+
+  unregister(key, fn) {
+    let fns = this._hooks[key];
+    if (fns && typeof fn === 'function') {
+      fns = fns.filter(f => f !== fn);
+      if (fns.length > 0) {
+        this._hooks[key] = fns;
+      } else {
+        delete this._hooks[key];
+      }
+    }
+  }
+
+  unregisterAll(key) {
+    delete this._hooks[key];
+  }
+}
+
+exports = module.exports = Hook;
diff --git a/packages/cli/core/init/compiler.js b/packages/cli/core/init/compiler.js
new file mode 100644
index 000000000..8cbae789e
--- /dev/null
+++ b/packages/cli/core/init/compiler.js
@@ -0,0 +1,31 @@
+exports = module.exports = function initCompiler(ins, compilers = {}) {
+  let init = Object.keys(compilers).map(c => {
+    let module;
+    let moduleName = `@wepy/compiler-${c}`;
+    return ins.resolvers.context
+      .resolve({}, ins.context, moduleName, {})
+      .then(rst => {
+        try {
+          module = require(rst.path);
+        } catch (e) {
+          ins.logger.error('init', `Failed to load model "${moduleName}"`);
+          ins.logger.error('init', e);
+        }
+        module && module(compilers[c]).call(ins);
+        return module;
+      })
+      .catch(e => {
+        ins.logger.error(
+          'init',
+          `Make sure module "${moduleName}" is installed. If not please try "npm install ${moduleName} --save-dev".`
+        );
+        ins.logger.error('init', e);
+      });
+  });
+  return Promise.all(init).then(compilers => {
+    if (compilers.some(c => !c)) {
+      throw new Error('Initialize failed');
+    }
+    return true;
+  });
+};
diff --git a/packages/cli/core/init/parser.js b/packages/cli/core/init/parser.js
new file mode 100644
index 000000000..d634c0878
--- /dev/null
+++ b/packages/cli/core/init/parser.js
@@ -0,0 +1,5 @@
+exports = module.exports = function initParser(ins) {
+  ['wpy', 'script', 'style', 'template', 'config', 'component', 'wxs', 'file'].forEach(k => {
+    require('../plugins/parser/' + k).call(ins);
+  });
+};
diff --git a/packages/cli/core/init/plugin.js b/packages/cli/core/init/plugin.js
new file mode 100644
index 000000000..08ac4c219
--- /dev/null
+++ b/packages/cli/core/init/plugin.js
@@ -0,0 +1,49 @@
+const { isArr, isFunc } = require('../util/tools');
+
+function checkPlugins(ins, plugins) {
+  if (!isArr(plugins)) {
+    plugins = [plugins];
+  }
+  plugins.forEach(plg => {
+    // ensure plugin is a function
+    // or process would be exit
+    if (!isFunc(plg)) {
+      ins.logger.error(
+        'init',
+        'Plugins init error, plugin must be a function.\n' + 'Please check your plugin in wepy.config.js file'
+      );
+      throw new Error('EXIT');
+    }
+  });
+
+  return plugins;
+}
+
+exports = module.exports = function(ins) {
+  // system plugins
+  [
+    './../plugins/scriptDepFix',
+    './../plugins/scriptInjection',
+    './../plugins/build/app',
+    './../plugins/build/pages',
+    './../plugins/build/components',
+    './../plugins/build/vendor',
+    './../plugins/build/assets',
+
+    './../plugins/template/parse',
+
+    './../plugins/template/attrs',
+    './../plugins/template/directives',
+
+    './../plugins/helper/supportSrc',
+    './../plugins/helper/sfcCustomBlock',
+    './../plugins/helper/generateCodeFrame',
+    './../plugins/helper/errorHandler',
+
+    './../plugins/compiler/index'
+  ].map(v => require(v).call(ins));
+  // check custom plugins
+  const customPluginFns = checkPlugins(ins, ins.options.plugins);
+
+  customPluginFns.map(fn => fn.call(ins));
+};
diff --git a/packages/cli/core/loader.js b/packages/cli/core/loader.js
new file mode 100644
index 000000000..431d69d81
--- /dev/null
+++ b/packages/cli/core/loader.js
@@ -0,0 +1,126 @@
+/**
+ * Tencent is pleased to support the open source community by making WePY available.
+ * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
+ * http://opensource.org/licenses/MIT
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+
+const Module = require('module');
+const path = require('path');
+const logger = require('./util/logger');
+
+let relativeModules = {};
+let requiredModules = {};
+
+let loadedPlugins = [];
+
+class PluginHelper {
+  constructor(plugins, op) {
+    this.applyPlugin(0, op);
+    return true;
+  }
+  applyPlugin(index, op) {
+    let plg = loadedPlugins[index];
+
+    if (!plg) {
+      op.done && op.done(op);
+    } else {
+      op.next = () => {
+        this.applyPlugin(index + 1, op);
+      };
+      op.catch = () => {
+        op.error && op.error(op);
+      };
+      if (plg) plg.apply(op);
+    }
+  }
+}
+
+exports = module.exports = {
+  attach(resolve) {
+    this.resolve = resolve;
+  },
+  loadCompiler(lang) {
+    if (['wxml', 'xml', 'css', 'js'].indexOf(lang) > -1) {
+      return c => {
+        return Promise.resolve(c);
+      };
+    }
+
+    let name = 'wepy-compiler-' + lang;
+    let compiler = this.load(name);
+
+    if (!compiler) {
+      this.missingNPM = name;
+      logger.warn('loader', `Missing compiler: ${name}.`);
+    }
+    return compiler;
+  },
+
+  getNodeModulePath(loc, relative) {
+    relative = relative || process.cwd();
+    if (typeof Module === 'object') return null;
+
+    let relativeMod = relativeModules[relative];
+    let paths = [];
+
+    if (!relativeMod) {
+      relativeMod = new Module();
+
+      let filename = path.join(relative, './');
+      relativeMod.id = filename;
+      relativeMod.filename = filename;
+      relativeMod.paths = [].concat(this.resolve.modulePaths);
+
+      paths = Module._nodeModulePaths(relative);
+      relativeModules[relative] = relativeMod;
+    }
+    paths.forEach(v => {
+      if (relativeMod.paths.indexOf(v) === -1) {
+        relativeMod.paths.push(v);
+      }
+    });
+    try {
+      return Module._resolveFilename(loc, relativeMod);
+    } catch (err) {
+      return null;
+    }
+  },
+  load(loc, relative) {
+    if (requiredModules[loc]) return requiredModules[loc];
+
+    let modulePath = this.getNodeModulePath(loc, relative);
+    let m = null;
+    try {
+      m = require(modulePath);
+    } catch (e) {
+      // eslint-disable-next-line no-console
+      if (e.message !== 'missing path') console.log(e);
+    }
+    if (m) {
+      m = m.default ? m.default : m;
+      requiredModules[loc] = m;
+    }
+    return m;
+  },
+
+  loadPlugin(plugins) {
+    let plg, plgkey, setting;
+    for (plgkey in plugins) {
+      let name = 'wepy-plugin-' + plgkey;
+      setting = plugins[plgkey];
+      plg = this.load(name);
+
+      if (!plg) {
+        this.missingNPM = name;
+        logger.warn('loader', `Missing plugin: ${name}`);
+        return false;
+      }
+      loadedPlugins.push(new plg(setting));
+    }
+    return true;
+  },
+  PluginHelper: PluginHelper
+};
diff --git a/packages/cli/core/moduleSet.js b/packages/cli/core/moduleSet.js
new file mode 100644
index 000000000..b446dc149
--- /dev/null
+++ b/packages/cli/core/moduleSet.js
@@ -0,0 +1,76 @@
+/**
+ * Tencent is pleased to support the open source community by making WePY available.
+ * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
+ * http://opensource.org/licenses/MIT
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+
+class ModuleSet {
+  constructor() {
+    this._index = -1;
+    this._map = {};
+    this._set = {};
+    this._array = {};
+    this._type = {};
+  }
+
+  add(file, type) {
+    let id = this.get(file);
+
+    if (id === undefined) {
+      this._index++;
+      this.length = this._index + 1;
+      id = this._index;
+      this._map[file] = id;
+      this._array[id] = file;
+      this._type[file] = type;
+    }
+
+    return id;
+  }
+
+  get(file) {
+    return this._map[file];
+  }
+
+  pending(file) {
+    return this.get(file) !== undefined && this._set[file] === undefined;
+  }
+
+  update(file, data, type) {
+    if (!this.get(file)) {
+      this.add(file, type);
+    }
+    this._set[file] = data;
+    this._type[file] = type;
+  }
+
+  data(v) {
+    if (typeof v === 'number') {
+      return this._set[this._array[v]];
+    } else {
+      return this._set[v];
+    }
+  }
+
+  array(type) {
+    if (!type) {
+      this._array.length = this.length;
+      return Array.prototype.slice.apply(this._array);
+    } else {
+      return this.array().filter(file => this._type[file] === type);
+    }
+  }
+
+  type(v) {
+    if (typeof v === 'number') {
+      return this._type[this._array[v]];
+    } else {
+      return this._type[v];
+    }
+  }
+}
+
+exports = module.exports = ModuleSet;
diff --git a/packages/cli/core/parseOptions.js b/packages/cli/core/parseOptions.js
new file mode 100644
index 000000000..86e7c9751
--- /dev/null
+++ b/packages/cli/core/parseOptions.js
@@ -0,0 +1,123 @@
+const path = require('path');
+const fs = require('fs');
+
+const DEFAULT_OPTIONS = {
+  entry: { type: String, default: 'app' },
+  src: { type: String, default: 'src' },
+  target: { type: String, default: 'weapp' },
+  static: { type: [String, Array], default: 'static' },
+  output: { type: String, default: 'weapp' },
+  platform: { type: String },
+  wpyExt: { type: String, default: '.wpy' },
+  eslint: { type: Boolean, default: true },
+  cliLogs: { type: Boolean, default: false },
+  watch: { type: Boolean, default: false },
+  watchOption: { type: Object },
+  noCache: { type: Boolean, default: false },
+  'build.web': { type: Object },
+  'build.web.htmlTemplate': { type: String },
+  'build.web.htmlOutput': { type: String },
+  'build.web.jsOutput': { type: String },
+  'build.web.resolve': { type: Object, link: 'resolve' },
+  resolve: { type: Object, default: {} },
+  compilers: { type: Object },
+  plugins: { type: Array, default: [] },
+  appConfig: { type: Object },
+  'appConfig.noPromiseAPI': { type: Array, default: [] }
+};
+
+const DEFAULT_CONFIG = path.resolve('wepy.config.js');
+
+function setValue(obj, key, val) {
+  let arr = key.split('.');
+  let left = obj;
+  for (let i = 0, l = arr.length; i < l; i++) {
+    if (i === l - 1) {
+      left[arr[i]] = val;
+    } else {
+      if (typeof left[arr[i]] !== 'object') {
+        left[arr[i]] = {};
+      }
+      left = left[arr[i]];
+    }
+  }
+  return obj;
+}
+
+function getValue(obj, key) {
+  let arr = key.split('.');
+  let left = obj;
+  let rst;
+  for (let i = 0, l = arr.length; i < l; i++) {
+    if (i === l - 1) {
+      rst = left[arr[i]];
+    } else {
+      if (typeof left[arr[i]] === 'undefined') {
+        break;
+      }
+      left = left[arr[i]];
+    }
+  }
+  return rst;
+}
+
+function check(t, val) {
+  if (Array.isArray(t)) {
+    return t.some(type => check(type, val));
+  }
+  switch (t) {
+    case String:
+      return typeof val === 'string';
+    case Number:
+      return typeof val === 'number';
+    case Boolean:
+      return typeof val === 'boolean';
+    case Function:
+      return typeof val === 'function';
+    case Object:
+      return typeof val === 'object';
+    case Array:
+      return toString.call(val) === '[object Array]';
+    default:
+      return val instanceof t;
+  }
+}
+
+function parse(opt = {}, baseOpt = DEFAULT_OPTIONS, fromCommandLine) {
+  let ret = {};
+
+  for (let k in baseOpt) {
+    let defaultItem = baseOpt[k];
+    let val = getValue(opt, k);
+
+    if (val === undefined) {
+      if (defaultItem.default !== undefined && !fromCommandLine) {
+        setValue(ret, k, defaultItem.default);
+      }
+    } else {
+      if (!check(defaultItem.type, val)) {
+        throw new Error(`Unexpected type: ${k} expect a ${defaultItem.type.name}`);
+      }
+      setValue(ret, k, val);
+    }
+  }
+  return ret;
+}
+
+function convert(args) {
+  if (!fs.existsSync(DEFAULT_CONFIG)) {
+    throw new Error(`No configuration file found in the current directory.`);
+  }
+
+  let opt = require(DEFAULT_CONFIG);
+  let argOpt = parse(args, DEFAULT_OPTIONS, true);
+
+  return Object.assign({}, parse(opt), argOpt);
+}
+
+exports = module.exports = {
+  setValue: setValue,
+  getValue: getValue,
+  parse: parse,
+  convert: convert
+};
diff --git a/packages/cli/core/plugins/build/app.js b/packages/cli/core/plugins/build/app.js
new file mode 100644
index 000000000..62ca8804c
--- /dev/null
+++ b/packages/cli/core/plugins/build/app.js
@@ -0,0 +1,29 @@
+const path = require('path');
+
+exports = module.exports = function() {
+  this.register('build-app', function buildApp(app) {
+    this.logger.info('app', 'building App');
+
+    let { script, styles, config } = app.sfc;
+
+    let targetFile = path.join(this.context, this.options.target, 'app');
+
+    config.outputCode = JSON.stringify(config.parsed.output, null, 4);
+
+    this.hook('script-dep-fix', script.parsed);
+    this.hook('script-injection', script.parsed, this.options.appConfig);
+    script.outputCode = script.parsed.source.source();
+
+    let styleCode = '';
+
+    styles.forEach(v => {
+      styleCode += v.parsed.code + '\n';
+    });
+
+    styles.outputCode = styleCode;
+
+    app.outputFile = targetFile;
+
+    return app;
+  });
+};
diff --git a/packages/cli/core/plugins/build/assets.js b/packages/cli/core/plugins/build/assets.js
new file mode 100644
index 000000000..2e9f63228
--- /dev/null
+++ b/packages/cli/core/plugins/build/assets.js
@@ -0,0 +1,59 @@
+const path = require('path');
+
+exports = module.exports = function() {
+  this.register('build-assets', function buildAssets() {
+    this.logger.info('assets', 'building assets');
+
+    let result = [];
+
+    this.assets.array().forEach(file => {
+      let t = this.assets.type(file);
+      let d = this.assets.data(file);
+
+      if (t.npm) {
+        if (t.type === 'weapp') {
+          if (!t.wxs && t.component) {
+            // it's a npm weapp component, like vant-weapp.
+            // output-components will generate the code for vant-weapp himself
+            return;
+          } else {
+            // it's in weapp component, maybe they require a lib in the component
+            // this will goes to build asserts.
+          }
+        } else if (!t.wxs && t.dep && !t.component) {
+          // it's a vendor, will go to vendor build
+          return;
+        }
+      } else {
+        // it's a component and it's not a dependences
+        if (!t.wxs && t.component && !t.dep) {
+          return;
+        }
+      }
+      ///////////////////
+      // asserts build
+      //////////////////
+      if (!t.wxs && !t.url) {
+        this.hook('script-dep-fix', d);
+      }
+
+      let filePath = file;
+      let fileObj = path.parse(file);
+
+      // For typescript, it should output .js
+      if (d.outputFileName && d.outputFileName !== fileObj.base) {
+        filePath = path.join(fileObj.dir, d.outputFileName);
+      }
+
+      let targetFile = t.npm ? this.getModuleTarget(filePath) : this.getTarget(filePath);
+      result.push({
+        src: file,
+        targetFile: targetFile,
+        outputCode: d.source.source(),
+        encoding: d.encoding
+      });
+    });
+
+    return result;
+  });
+};
diff --git a/packages/cli/core/plugins/build/components.js b/packages/cli/core/plugins/build/components.js
new file mode 100644
index 000000000..4de166ff0
--- /dev/null
+++ b/packages/cli/core/plugins/build/components.js
@@ -0,0 +1,47 @@
+const path = require('path');
+
+exports = module.exports = function() {
+  this.register('build-components', function buildComponents(comps) {
+    this.logger.info('component', 'building components');
+
+    comps.forEach(comp => {
+      let { script, styles, config, template, wxs } = comp.sfc;
+
+      let styleCode = '';
+      styles.forEach(v => {
+        styleCode += v.parsed.code + '\n';
+      });
+      config.parsed.output.component = true;
+      const { usingComponents, ...other } = config.parsed.output;
+      let output = {
+        ...other,
+        usingComponents: usingComponents
+      };
+      config.outputCode = JSON.stringify(output, null, 4);
+      this.hook('script-dep-fix', script.parsed);
+      if (!script.empty && !(comp.component && comp.type === 'weapp')) {
+        this.hook('script-injection', script.parsed, template.parsed.rel);
+      }
+      script.outputCode = script.parsed.source.source();
+      styles.outputCode = styleCode;
+      template.outputCode = template.parsed.code;
+
+      if (wxs && wxs.length) {
+        let wxsCode = '';
+        wxs.forEach(item => {
+          wxsCode += item.parsed.output + '\n';
+        });
+        template.outputCode =
+          '<!----------   wxs start ----------->\n' +
+          wxsCode +
+          '<!----------   wxs end   ----------->\n' +
+          template.outputCode;
+      }
+      let targetFile = comp.npm ? this.getModuleTarget(comp.file) : this.getTarget(comp.file);
+      let target = path.parse(targetFile);
+      comp.outputFile = path.join(target.dir, target.name);
+    });
+
+    return comps;
+  });
+};
diff --git a/packages/cli/core/plugins/build/pages.js b/packages/cli/core/plugins/build/pages.js
new file mode 100644
index 000000000..2bf189a26
--- /dev/null
+++ b/packages/cli/core/plugins/build/pages.js
@@ -0,0 +1,32 @@
+const path = require('path');
+
+exports = module.exports = function() {
+  this.register('build-pages', function buildPages(pages) {
+    this.logger.info('page', 'building pages');
+
+    pages.forEach(page => {
+      let { script, styles, config, template } = page.sfc;
+
+      let styleCode = '';
+      styles.forEach(v => {
+        styleCode += v.parsed.code + '\n';
+      });
+
+      config.outputCode = JSON.stringify(config.parsed.output, null, 4);
+
+      this.hook('script-dep-fix', script.parsed);
+      this.hook('script-injection', script.parsed, template.parsed.rel);
+
+      script.outputCode = script.parsed.source.source();
+
+      styles.outputCode = styleCode;
+      template.outputCode = template.parsed.code;
+
+      let targetFile = this.getTarget(page.file);
+      let target = path.parse(targetFile);
+      page.outputFile = path.join(target.dir, target.name);
+    });
+
+    return pages;
+  });
+};
diff --git a/packages/cli/core/plugins/build/vendor.js b/packages/cli/core/plugins/build/vendor.js
new file mode 100644
index 000000000..61fe9bc54
--- /dev/null
+++ b/packages/cli/core/plugins/build/vendor.js
@@ -0,0 +1,75 @@
+const path = require('path');
+
+const VENDOR_INJECTION = [
+  `
+var window = { Number: Number, Array: Array, Date: Date, Error: Error, Math: Math, Object: Object, Function: Function, RegExp: RegExp, String: String, TypeError: TypeError, parseInt: parseInt, parseFloat: parseFloat, isNaN: isNaN };
+var global = window;
+var process = { env: {} };
+(function(modules) {
+   // The module cache
+   var installedModules = {};
+   // The require function
+   function __wepy_require(moduleId) {
+       // Check if module is in cache
+       if(installedModules[moduleId])
+           return installedModules[moduleId].exports;
+       // Create a new module (and put it into the cache)
+       var module = installedModules[moduleId] = {
+           exports: {},
+           id: moduleId,
+           loaded: false
+       };
+       // Execute the module function
+       modules[moduleId].call(module.exports, module, module.exports, __wepy_require);
+       // Flag the module as loaded
+       module.loaded = true;
+       // Return the exports of the module
+       return module.exports;
+   }
+   // expose the modules object (__webpack_modules__)
+   __wepy_require.m = modules;
+   // expose the module cache
+   __wepy_require.c = installedModules;
+   // __webpack_public_path__
+   __wepy_require.p = "/";
+   // Load entry module and return exports
+   module.exports = __wepy_require;
+   return __wepy_require;
+})([
+`,
+  '',
+  ']);'
+];
+
+exports = module.exports = function() {
+  this.register('build-vendor', function buildPages(vendor) {
+    this.logger.info('vendor', 'building vendor');
+
+    let vendorList = this.vendors.array();
+    let code = '';
+
+    vendorList.forEach((item, i) => {
+      let data = this.vendors.data(item);
+
+      this.hook('script-dep-fix', data, true);
+
+      code += '/***** module ' + i + ' start *****/\n';
+      code += '/***** ' + data.file + ' *****/\n';
+      code += 'function(module, exports, __wepy_require) {';
+      code += data.source.source() + '\n';
+      code += '}';
+      if (i !== vendorList.length - 1) {
+        code += ',';
+      }
+      code += '/***** module ' + i + ' end *****/\n\n\n';
+    });
+
+    let template = VENDOR_INJECTION.concat([]);
+    template[1] = code;
+
+    vendor.outputCode = template.join('');
+    vendor.targetFile = path.join(this.context, this.options.target, 'vendor.js');
+
+    return vendor;
+  });
+};
diff --git a/packages/cli/core/plugins/compiler/before.js b/packages/cli/core/plugins/compiler/before.js
new file mode 100644
index 000000000..2cc6acbbd
--- /dev/null
+++ b/packages/cli/core/plugins/compiler/before.js
@@ -0,0 +1,96 @@
+const path = require('path');
+const CONST = require('../../util/const');
+
+exports = module.exports = function() {
+  const styleHooker = (content, options) => {
+    options.supportObject = true;
+  };
+
+  this.register('before-compiler-less', styleHooker);
+  this.register('before-compiler-sass', styleHooker);
+  this.register('before-compiler-stylus', styleHooker);
+
+  // When file changed in --watch model
+  this.register('before-wepy-watch-file-changed', function beforeWatchFileChanged(buildTask) {
+    const changedFile = buildTask.changed;
+    const parsedPath = path.parse(changedFile);
+    const weappCacheKey = path.join(parsedPath.dir, parsedPath.name) + CONST.WEAPP_EXT;
+
+    const isInvolved = this.fileDep.isInvolved(changedFile);
+    const isWeappInvolved = this.fileDep.isInvolved(weappCacheKey);
+
+    this.fileDep.getSources(changedFile).forEach(depedFile => {
+      if (path.isAbsolute(depedFile)) {
+        // clear the file hash, to remove the file cache
+        this.compiled[depedFile].hash = '';
+      }
+    });
+
+    if (isInvolved) {
+      this.logger.silly('watch', `Watcher triggered by file changes: ${changedFile}`);
+      const isEntry = changedFile === this.options.entry;
+      let ext = path.extname(changedFile);
+      const isWPY = ext === this.options.wpyExt;
+      ext = ext.substring(1);
+
+      if (isEntry) {
+        buildTask.partial = false;
+      } else if (isWPY) {
+        buildTask.partial = true;
+        buildTask.files.push(changedFile);
+      } else {
+        buildTask = this.hookSeq('wepy-watch-file-changed-' + ext, buildTask);
+      }
+    }
+
+    if (isWeappInvolved) {
+      this.logger.silly('watch', `Watcher triggered by file changes: ${changedFile}`);
+      buildTask.changed = weappCacheKey;
+      buildTask = this.hookSeq('wepy-watch-file-changed-weapp', buildTask);
+    }
+
+    return Promise.resolve(buildTask);
+  });
+
+  this.register('wepy-watch-file-changed-weapp', function(buildTask) {
+    buildTask.weapp = true;
+    buildTask.files.push(buildTask.changed);
+
+    return buildTask;
+  });
+
+  // when .wxs file changed
+  this.register('wepy-watch-file-changed-wxs', function(buildTask) {
+    let queue = [];
+    const wpyExtFiles = [];
+
+    // find wpyExtFiles of deped
+    queue = queue.concat(this.fileDep.getSources(buildTask.changed));
+    while (queue.length > 0) {
+      const depedFile = queue.shift();
+      if (path.extname(depedFile) === this.options.wpyExt) {
+        wpyExtFiles.push(depedFile);
+      } else {
+        queue = queue.concat(this.fileDep.getSources(depedFile));
+      }
+    }
+
+    buildTask.files = wpyExtFiles;
+    if (buildTask.files.includes(this.options.entry)) {
+      buildTask.partial = false;
+    }
+
+    return buildTask;
+  });
+
+  // when .js, .ts file changed
+  ['js', 'ts'].forEach(ext => {
+    this.register('wepy-watch-file-changed-' + ext, function(buildTask) {
+      buildTask.outputAssets = true;
+      buildTask.files.push(buildTask.changed);
+      buildTask.assetExt = ext;
+
+      return buildTask;
+    });
+  });
+};
diff --git a/packages/cli/core/plugins/compiler/common.js b/packages/cli/core/plugins/compiler/common.js
new file mode 100644
index 000000000..350cad8b5
--- /dev/null
+++ b/packages/cli/core/plugins/compiler/common.js
@@ -0,0 +1,10 @@
+exports = module.exports = function() {
+  ['js', 'json', 'css', 'wxml'].forEach(lang => {
+    this.register('wepy-compiler-' + lang, function(node) {
+      node.compiled = {
+        code: node.content
+      };
+      return Promise.resolve(node);
+    });
+  });
+};
diff --git a/packages/cli/core/plugins/compiler/index.js b/packages/cli/core/plugins/compiler/index.js
new file mode 100644
index 000000000..30dd28ac0
--- /dev/null
+++ b/packages/cli/core/plugins/compiler/index.js
@@ -0,0 +1,5 @@
+exports = module.exports = function() {
+  require('./common').call(this);
+  require('./wxss').call(this);
+  require('./before').call(this);
+};
diff --git a/packages/cli/core/plugins/compiler/wxss.js b/packages/cli/core/plugins/compiler/wxss.js
new file mode 100644
index 000000000..c3e06caff
--- /dev/null
+++ b/packages/cli/core/plugins/compiler/wxss.js
@@ -0,0 +1,59 @@
+const css = require('css');
+const path = require('path');
+const fs = require('fs');
+const RawSource = require('webpack-sources').RawSource;
+
+exports = module.exports = function() {
+  this.register('wepy-compiler-wxss', function(node, ctx) {
+    let code = node.content;
+
+    let ast = css.parse(code);
+
+    ast.stylesheet.rules.forEach(rule => {
+      if (rule.type === 'import') {
+        let importfile = rule.import;
+        // eslint-disable-next-line
+        if (importfile.startsWith('"') || importfile.startsWith("'")) {
+          importfile = importfile.substring(1, importfile.length - 1);
+        }
+        importfile = path.resolve(ctx.file, '..', importfile);
+
+        let encoding = 'utf-8';
+
+        if (this.assets.get(importfile) === undefined) {
+          let importCode;
+
+          try {
+            importCode = fs.readFileSync(importfile, encoding);
+          } catch (e) {
+            this.logger.warn('compiler', `Can not open file ${importfile} in ${ctx.file}`);
+          }
+
+          if (importCode) {
+            // add assets dependencies
+            this.assets.update(
+              importfile,
+              {
+                encoding: encoding,
+                source: new RawSource(importCode)
+              },
+              { url: true, npm: ctx.npm }
+            );
+
+            this.hookUnique(
+              'wepy-compiler-wxss',
+              {
+                content: importCode
+              },
+              Object.assign({}, ctx, { dep: true })
+            );
+          }
+        }
+      }
+    });
+    node.compiled = {
+      code: node.content
+    };
+    return Promise.resolve(node);
+  });
+};
diff --git a/packages/cli/core/plugins/helper/errorHandler.js b/packages/cli/core/plugins/helper/errorHandler.js
new file mode 100644
index 000000000..632d5f648
--- /dev/null
+++ b/packages/cli/core/plugins/helper/errorHandler.js
@@ -0,0 +1,60 @@
+exports = module.exports = function() {
+  this.register('error-handler', function(handler, errInfo, extra) {
+    if (arguments.length === 1) {
+      if (typeof handler === 'object') {
+        errInfo = handler;
+        let { ctx, message, type, snapshot, file, title } = errInfo;
+        let output = 'Message:\n  ' + message;
+        if (ctx && ctx.file) {
+          file = ctx.file;
+        }
+        if (file) {
+          output += '\n' + 'File:\n  ' + file;
+        }
+        if (snapshot) {
+          output += '\n' + 'Snapshot:\n' + snapshot;
+        }
+        this.logger[type](title, output);
+      }
+    } else {
+      return this.hookUnique('error-handler-' + handler, errInfo, extra);
+    }
+  });
+
+  this.register('error-handler-script', function(errInfo, extra) {
+    let { ctx, message, type, title, code, filename } = errInfo;
+    let codeFrame = '';
+
+    if (ctx && ctx.file) {
+      filename = filename || ctx.file;
+    }
+    if (ctx && ctx.sfc && ctx.script && ctx.script.content) {
+      code = ctx.sfc.script.content;
+    }
+
+    if (extra) {
+      extra.type = 'script';
+      codeFrame = 'Snapshot:\n' + this.hookUnique('gen-code-frame', code, extra, message);
+    }
+
+    let output = 'Message:\n  ' + message;
+    output += '\n' + 'File:\n  ' + filename;
+    output += '\n' + codeFrame;
+    this.logger[type](title, output);
+  });
+
+  this.register('error-handler-template', function(errInfo, extra) {
+    let { ctx, message, type, title } = errInfo;
+
+    let codeFrame = '';
+
+    if (extra) {
+      extra.type = 'template';
+      codeFrame = 'Snapshot:\n' + this.hookUnique('gen-code-frame', ctx.sfc.template.content, extra, message);
+    }
+    let output = 'Message:\n  ' + message;
+    output += '\n' + 'File:\n  ' + ctx.file;
+    output += '\n' + codeFrame;
+    this.logger[type](title, output);
+  });
+};
diff --git a/packages/cli/core/plugins/helper/generateCodeFrame.js b/packages/cli/core/plugins/helper/generateCodeFrame.js
new file mode 100644
index 000000000..370fe9d73
--- /dev/null
+++ b/packages/cli/core/plugins/helper/generateCodeFrame.js
@@ -0,0 +1,110 @@
+const codeFrameColumns = require('@babel/code-frame').codeFrameColumns;
+const SourceMap = require('source-map');
+
+function indexToLineColumns(code, index) {
+  let line = 1;
+  let column = 1;
+  let i = 0;
+  let l = code.length;
+  while (i < l) {
+    if (i === index) {
+      break;
+    }
+    if (code[i] === '\n') {
+      line++;
+      column = 1;
+    } else {
+      column++;
+    }
+    i++;
+  }
+  return { line, column };
+}
+
+exports = module.exports = function() {
+  this.register('gen-code-frame', function(code, pos, msg, options) {
+    if (pos.type === 'template') {
+      if (pos.item) {
+        return this.hookUnique('gen-code-frame-html', code, pos.item, pos.attr, pos.expr, msg, options);
+      }
+    }
+
+    options = Object.assign(
+      {},
+      {
+        highlightCode: true,
+        message: msg || ''
+      },
+      options || {}
+    );
+
+    if (!pos.start) {
+      let newpos = {};
+      if (pos.startIndex) {
+        newpos.start = indexToLineColumns(code, pos.startIndex);
+      }
+      if (pos.endIndex) {
+        newpos.end = indexToLineColumns(code, pos.endIndex);
+      }
+      pos = newpos;
+    } else if (pos.sourcemap) {
+      let consumer = SourceMap.SourceMapConsumer(pos.sourcemap);
+      if (pos.start) {
+        pos.start = consumer.originalPositionFor(pos.start);
+      }
+      if (pos.end) {
+        pos.end = consumer.originalPositionFor(pos.end);
+      }
+    }
+
+    return codeFrameColumns(code, pos, options);
+  });
+
+  this.register('gen-code-frame-html', function(code, item, attr, expr, msg, options) {
+    let node = code.substring(item.startIndex, item.endIndex);
+    let i = 0,
+      l = node.length,
+      quotes = [];
+    let word = '';
+    let inQuoteString = '';
+    let startIndex = 0;
+    let endIndex = 0;
+
+    while (i < l) {
+      let c = node[i++];
+      // eslint-disable-next-line
+      if (c === '"' || c === "'") {
+        if (quotes[quotes.length - 1] === c) {
+          quotes.pop();
+        } else {
+          quotes.push(c);
+        }
+        continue;
+      }
+      if (quotes.length === 0) {
+        inQuoteString = '';
+        if (c === ' ') {
+          word = '';
+        } else {
+          word += c;
+        }
+      } else {
+        inQuoteString += c;
+      }
+
+      if (word === attr) {
+        startIndex = i - word.length;
+      }
+      if (inQuoteString === expr) {
+        endIndex = i;
+      }
+    }
+    return this.hookUnique(
+      'gen-code-frame',
+      code,
+      { startIndex: item.startIndex + startIndex, endIndex: item.startIndex + endIndex + 1 },
+      msg,
+      options
+    );
+  });
+};
diff --git a/packages/cli/core/plugins/helper/sfcCustomBlock.js b/packages/cli/core/plugins/helper/sfcCustomBlock.js
new file mode 100644
index 000000000..4f883da0f
--- /dev/null
+++ b/packages/cli/core/plugins/helper/sfcCustomBlock.js
@@ -0,0 +1,38 @@
+exports = module.exports = function() {
+  this.register('sfc-custom-block', function(sfc) {
+    if (!sfc.customBlocks || sfc.customBlocks.length === 0) return sfc;
+
+    sfc.customBlocks = sfc.customBlocks.filter(block => {
+      if (block.attrs && block.attrs.src) {
+        block.src = block.attrs.src;
+      }
+      let hookKey = 'sfc-custom-block-' + block.type;
+      let has = this.hasHook(hookKey);
+      if (has) {
+        ({ sfc, block } = this.hookSeq(hookKey, { sfc, block }));
+      }
+      return !has;
+    });
+
+    return sfc;
+  });
+
+  this.register('sfc-custom-block-config', function({ sfc, block }) {
+    if (!sfc.config) {
+      sfc.config = block;
+      sfc.config.lang = block.attrs.lang || 'json';
+      sfc.config.type = 'config';
+    } else {
+      this.logger.warn('config', 'mutiple config is defined');
+    }
+    return { sfc, block };
+  });
+
+  this.register('sfc-custom-block-wxs', function({ sfc, block }) {
+    if (!sfc.wxs) sfc.wxs = [];
+    block.lang = block.attrs.lang || 'js';
+    block.type = 'wxs';
+    sfc.wxs.push(block);
+    return { sfc, block };
+  });
+};
diff --git a/packages/cli/core/plugins/helper/supportSrc.js b/packages/cli/core/plugins/helper/supportSrc.js
new file mode 100644
index 000000000..7b8e3efa7
--- /dev/null
+++ b/packages/cli/core/plugins/helper/supportSrc.js
@@ -0,0 +1,32 @@
+const path = require('path');
+const fs = require('fs');
+const loaderUtils = require('loader-utils');
+
+const trailingSlash = /[/\\]$/;
+
+exports = module.exports = function() {
+  this.register('pre-check-sfc', function(ctx) {
+    let node = ctx.node;
+    let file = ctx.file;
+    let dir = path.parse(file).dir;
+
+    if (node && node.src) {
+      let src = node.src;
+      const request = loaderUtils.urlToRequest(src, src.charAt(0) === '/' ? '' : null);
+      dir = dir.replace(trailingSlash, '');
+      return this.resolvers.normal.resolve({}, dir, request, {}).then(rst => {
+        node.content = fs.readFileSync(rst.path, 'utf-8');
+        node.dirty = true;
+        return {
+          node: node,
+          file: file
+        };
+      });
+    } else {
+      return Promise.resolve({
+        node: node,
+        file: file
+      });
+    }
+  });
+};
diff --git a/packages/cli/core/plugins/parser/component.js b/packages/cli/core/plugins/parser/component.js
new file mode 100644
index 000000000..529e41208
--- /dev/null
+++ b/packages/cli/core/plugins/parser/component.js
@@ -0,0 +1,137 @@
+/**
+ * Tencent is pleased to support the open source community by making WePY available.
+ * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
+ * http://opensource.org/licenses/MIT
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+const fs = require('fs');
+const path = require('path');
+const CONST = require('../../util/const');
+
+const wxmlAst = require('../../ast/wxml');
+
+const readFile = (file, defaultValue = '') => {
+  if (fs.existsSync(file)) {
+    return fs.readFileSync(file, 'utf-8');
+  }
+  return defaultValue;
+};
+
+exports = module.exports = function() {
+  this.register('wepy-parser-component', function(comp) {
+    let parsedPath = path.parse(comp.path);
+    let file = path.join(parsedPath.dir, parsedPath.name);
+    let sfc = {
+      styles: [],
+      script: {},
+      template: {}
+    };
+    let context = {
+      sfc: sfc,
+      file: file,
+      npm: comp.npm,
+      component: true,
+      type: 'weapp' // This is a weapp original component
+    };
+    let weappCacheKey = file + CONST.WEAPP_EXT;
+
+    if (!this.compiled[weappCacheKey]) {
+      this.compiled[weappCacheKey] = comp;
+    }
+
+    this.fileDep.addDeps(weappCacheKey);
+
+    sfc.styles[0] = {
+      content: readFile(file + '.wxss'),
+      type: 'style',
+      lang: 'wxss'
+    };
+
+    sfc.template = {
+      content: readFile(file + '.wxml'),
+      type: 'template',
+      lang: 'wxml'
+    };
+
+    // JS file should be there.
+    sfc.script = {
+      content: readFile(file + '.js', 'Page({})'),
+      type: 'script',
+      lang: 'babel'
+    };
+
+    sfc.config = {
+      content: readFile(file + '.json', '{}'),
+      type: 'config',
+      lang: 'json'
+    };
+
+    let flow = Promise.resolve(true);
+    let templateContent = sfc.template.content;
+
+    if (templateContent.indexOf('<wxs ') > -1) {
+      // wxs tag inside
+      let templateAst = wxmlAst(sfc.template.content);
+
+      sfc.wxs = [];
+
+      flow = templateAst.then(ast => {
+        let checkSrc = false;
+        wxmlAst.walk(ast, {
+          name: {
+            wxs(item) {
+              if (item.type === 'tag' && item.name === 'wxs') {
+                if (item.attribs.src) {
+                  checkSrc = true;
+                }
+                sfc.wxs.push({
+                  attrs: item.attribs,
+                  src: checkSrc ? item.attribs.src : '',
+                  lang: 'js',
+                  type: 'wxs',
+                  content: wxmlAst.generate(item.children)
+                });
+                // Remove node;
+                item.data = '';
+                item.children = [];
+                item.type = 'text';
+              }
+            }
+          }
+        });
+        if (checkSrc) {
+          // has wxs with src, reset wxml
+          sfc.template.content = wxmlAst.generate(ast);
+        }
+        return checkSrc ? this.hookAsyncSeq('parse-sfc-src', context) : true;
+      });
+    }
+
+    return flow
+      .then(() => {
+        if (sfc.wxs) {
+          return Promise.all(
+            sfc.wxs.map(wxs => {
+              return this.applyCompiler(wxs, context);
+            })
+          );
+        }
+      })
+      .then(() => {
+        return this.applyCompiler(sfc.config, context);
+      })
+      .then(() => {
+        return this.applyCompiler(sfc.template, context);
+      })
+      .then(() => {
+        return this.applyCompiler(sfc.script, context);
+      })
+      .then(parsed => {
+        sfc.script.parsed = parsed;
+        return this.applyCompiler(sfc.styles[0], context);
+      })
+      .then(() => context);
+  });
+};
diff --git a/packages/cli/core/plugins/parser/config.js b/packages/cli/core/plugins/parser/config.js
new file mode 100644
index 000000000..62b3935d9
--- /dev/null
+++ b/packages/cli/core/plugins/parser/config.js
@@ -0,0 +1,176 @@
+const path = require('path');
+const loaderUtils = require('loader-utils');
+const slash = require('slash');
+
+let appUsingComponents = null;
+
+exports = module.exports = function() {
+  this.register('wepy-parser-config', function(rst, ctx) {
+    // If file is not changed, then use cache.
+    if (ctx.useCache && ctx.sfc.config.parsed) {
+      return Promise.resolve(true);
+    }
+
+    if (!rst) {
+      if (!appUsingComponents) {
+        return Promise.resolve(true);
+      } else {
+        rst.content = JSON.stringify({});
+      }
+    }
+
+    let configString = rst.content.replace(/^\n*/, '').replace(/\n*$/, '');
+    configString = (configString || '{}').trim();
+    let config = null;
+    try {
+      let fn = new Function('return ' + configString);
+      config = fn();
+    } catch (e) {
+      // TODO: added error handler code
+      return Promise.reject(`invalid json: ${configString}`);
+    }
+    if (ctx.type !== 'app') {
+      // app.json does not need it
+      config.component = true;
+    }
+    if (!config.usingComponents) {
+      config.usingComponents = {};
+    }
+
+    let userDefineComponents = config.usingComponents || {};
+    let componentKeys = Object.keys(config.usingComponents);
+
+    if (!appUsingComponents && componentKeys.length === 0) {
+      ctx.sfc.config.parsed = {
+        output: config
+      };
+      return Promise.resolve(true);
+    }
+
+    // page Components will inherit app using components
+    if (appUsingComponents && ctx.type === 'page') {
+      appUsingComponents.forEach(comp => {
+        // Existing in page components, then ignore
+        // Resolve path for page components
+        if (!userDefineComponents[comp.name]) {
+          let targetPath = comp.resolved.path;
+          if (comp.prefix === 'module') {
+            targetPath = comp.target;
+          }
+        }
+      });
+    }
+
+    let resolvedUsingComponents = {};
+    let parseComponents = [];
+    let plist = componentKeys.map(name => {
+      const url = userDefineComponents[name];
+
+      let prefix = 'path';
+      // e.g.
+      // plugins://appid/xxxdfdf
+      // module:some-3rd-party-component
+      let matchs = url.match(/([^:]+):(.+)/);
+      let request = url;
+
+      if (matchs) {
+        prefix = matchs[1];
+        request = matchs[2];
+      }
+
+      let target = request;
+      let source = request;
+
+      let hookPrefix = 'wepy-parser-config-component-';
+      let hookName = prefix;
+
+      if (!this.hasHook(hookPrefix + hookName)) {
+        hookName = 'raw';
+      }
+
+      return this.hookUnique(hookPrefix + hookName, name, prefix, source, target, ctx).then(
+        ({ name, prefix, resolved, target, npm }) => {
+          if (hookName === 'raw') {
+            if (request.indexOf("weui-miniprogram") === 0) {
+              resolvedUsingComponents[name] = request;
+            }else{
+              resolvedUsingComponents[name] = url;
+            }
+            parseComponents.push({
+              name,
+              prefix,
+              url
+            });
+          } else {
+            let relativePath = path.relative(path.dirname(ctx.file), target);
+            let parsedPath = path.parse(relativePath);
+            // Windows may got windows path, covert to use posix path
+            resolvedUsingComponents[name] = './' + slash(path.join(parsedPath.dir, parsedPath.name));
+            parseComponents.push({
+              name,
+              prefix,
+              resolved,
+              path: resolved.path,
+              target,
+              npm,
+              request: relativePath,
+              type: parsedPath.ext === this.options.wpyExt ? 'wepy' : 'weapp'
+            });
+          }
+        }
+      );
+    });
+
+    return Promise.all(plist).then(() => {
+      if (ctx.type === 'app') {
+        appUsingComponents = parseComponents;
+      } else {
+        config.usingComponents = Object.assign({}, resolvedUsingComponents);
+      }
+
+      ctx.sfc.config.parsed = {
+        output: config,
+        components: parseComponents
+      };
+      return true;
+    });
+  });
+
+  // raw and plugin do nothing
+  // eslint-disable-next-line
+  this.register('wepy-parser-config-component-raw', function(name, prefix, source, target, ctx) {
+    return Promise.resolve({
+      name,
+      prefix
+    });
+  });
+
+  this.register('wepy-parser-config-component-module', function(name, prefix, source, target, ctx) {
+    let contextDir = path.dirname(ctx.file);
+    return this.resolvers.normal.resolve({}, contextDir, source, {}).then(resolved => {
+      return {
+        name: name,
+        prefix: prefix,
+        resolved: resolved,
+        target: this.getModuleTarget(resolved.path, this.options.src),
+        npm: resolved.meta.descriptionFileRoot !== this.context
+      };
+    });
+  });
+
+  this.register('wepy-parser-config-component-path', function(name, prefix, source, target, ctx) {
+    const moduleRequest = loaderUtils.urlToRequest(source, source.charAt(0) === '/' ? '' : null);
+
+    let contextDir = path.dirname(ctx.file);
+
+    return this.resolvers.normal.resolve({}, contextDir, moduleRequest, {}).then(resolved => {
+      return {
+        name: name,
+        prefix: prefix,
+        resolved: resolved,
+        target: resolved.path,
+        npm: resolved.meta.descriptionFileRoot !== this.context
+      };
+    });
+  });
+};
diff --git a/packages/cli/core/plugins/parser/file.js b/packages/cli/core/plugins/parser/file.js
new file mode 100644
index 000000000..13f7a7124
--- /dev/null
+++ b/packages/cli/core/plugins/parser/file.js
@@ -0,0 +1,106 @@
+/**
+ * Tencent is pleased to support the open source community by making WePY available.
+ * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
+ * http://opensource.org/licenses/MIT
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+const fs = require('fs');
+const path = require('path');
+
+const hashUtil = require('../../util/hash');
+
+exports = module.exports = function() {
+  this.register('wepy-parser-file', function(node, depFileCtx) {
+    let file = depFileCtx.file;
+    let fileContent = fs.readFileSync(file, 'utf-8');
+    let fileHash = hashUtil.hash(fileContent);
+
+    if (this.compiled[file] && fileHash === this.compiled[file].hash) {
+      // 文件 hash 一致，说明文件无修改
+      depFileCtx = this.compiled[file];
+      depFileCtx.useCache = true;
+
+      return Promise.resolve(depFileCtx);
+    } else {
+      this.compiled[file] = depFileCtx;
+      depFileCtx.hash = fileHash;
+      this.fileDep.cleanDeps(file);
+
+      let ext = path.extname(file);
+
+      let componentValue = ext === this.options.wpyExt;
+      if (ext === '.js') {
+        // if it is a weapp component, it must has a .wxml file
+        const dirName = path.dirname(file);
+        const baseName = path.basename(file, '.js');
+        const wxmlFile = path.format({
+          dir: dirName,
+          base: baseName + '.wxml'
+        });
+        componentValue = fs.existsSync(wxmlFile);
+      }
+
+      this.assets.add(depFileCtx.file, {
+        npm: depFileCtx.npm,
+        dep: true,
+        component: componentValue,
+        type: depFileCtx.type,
+        wxs: depFileCtx.wxs
+      });
+
+      if (ext === '.js' || ext === '.ts' || ext === '.wxs') {
+        if (depFileCtx.npm && depFileCtx.type !== 'weapp') {
+          // weapp component npm may have import in it.
+          return this.applyCompiler({ type: 'script', lang: 'js', content: fileContent }, depFileCtx);
+        } else {
+          return this.applyCompiler({ type: 'script', lang: node.lang || 'babel', content: fileContent }, depFileCtx);
+        }
+      } else {
+        if (ext === this.options.wpyExt) {
+          // TODO: why they import a wpy file.
+          this.hookUnique(
+            'error-handler',
+            'script',
+            {
+              code: node.compiled.code,
+              ctx: depFileCtx,
+              type: 'error',
+              message: 'Can not import a wepy component, please use "usingComponents" to declear a component',
+              title: 'dependence'
+            },
+            node.compiled.map
+              ? {
+                  sourcemap: node.compiled.map,
+                  start: depFileCtx.dep.loc.start,
+                  end: depFileCtx.dep.loc.end
+                }
+              : depFileCtx.dep.loc
+          );
+          throw new Error('EXIT');
+        } else {
+          this.hookUnique(
+            'error-handler',
+            'script',
+            {
+              code: node.compiled ? node.compiled.code : '',
+              ctx: depFileCtx,
+              type: 'error',
+              message: `Unrecognized import extension: ${depFileCtx.file}`,
+              title: 'dependence'
+            },
+            node.compiled && node.compiled.map
+              ? {
+                  sourcemap: node.compiled.map,
+                  start: depFileCtx.dep.loc.start,
+                  end: depFileCtx.dep.loc.end
+                }
+              : depFileCtx.dep.loc
+          );
+          throw new Error('EXIT');
+        }
+      }
+    }
+  });
+};
diff --git a/packages/cli/core/plugins/parser/script.js b/packages/cli/core/plugins/parser/script.js
new file mode 100644
index 000000000..af4072107
--- /dev/null
+++ b/packages/cli/core/plugins/parser/script.js
@@ -0,0 +1,147 @@
+/**
+ * Tencent is pleased to support the open source community by making WePY available.
+ * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
+ * http://opensource.org/licenses/MIT
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+const fs = require('fs');
+const path = require('path');
+
+const hashUtil = require('../../util/hash');
+const Walker = require('../../ast/walker');
+const toAst = require('../../ast/toAST');
+const ReplaceSource = require('webpack-sources').ReplaceSource;
+const RawSource = require('webpack-sources').RawSource;
+
+// 记录 npm 文件是否已经遍历过
+const npmTraverseFileMap = {};
+
+exports = module.exports = function() {
+  this.register('wepy-parser-dep', function(node, ctx, dep) {
+    const file = dep.module;
+    if (file.endsWith('.json')) {
+      return Promise.resolve(fs.readFileSync(path.resolve(path.dirname(ctx.file), file), 'utf8'));
+    }
+    return this.resolvers.normal.resolve({ issuer: ctx.file }, path.dirname(ctx.file), dep.module, {}).then(rst => {
+      let npm = rst.meta.descriptionFileRoot !== this.context;
+
+      let assets = this.assets;
+      let file = rst.path;
+
+      if (!file) {
+        // TODO: resovle fail ?
+        return rst.path;
+      }
+
+      let data = assets.data(file);
+      if (data !== undefined && this.compiled[file] && this.compiled[file].hash) {
+        let fileContent = fs.readFileSync(file, 'utf-8');
+        let fileHash = hashUtil.hash(fileContent);
+        if (fileHash === this.compiled[file].hash) {
+          // File is not changed, do not compile again
+          if (
+            data.parser &&
+            !data.depModules && // Ignore if deps modules are resolved, otherwise there will be a dead loop
+            data.parser.deps &&
+            data.parser.deps.length &&
+            !npmTraverseFileMap[file]
+          ) {
+            // If it has dependences, walk throguh all dependences
+            npmTraverseFileMap[file] = npm;
+            let depTasks = data.parser.deps.map(dep =>
+              this.hookUnique('wepy-parser-dep', data, this.compiled[file], dep)
+            );
+            return Promise.all(depTasks).then(rst => {
+              data.depModules = rst;
+              return data;
+            });
+          } else {
+            return data;
+          }
+        } else {
+          npmTraverseFileMap[file] = false;
+        }
+      }
+
+      return this.hookUnique('wepy-parser-file', node, {
+        file: file,
+        npm: npm,
+        component: ctx.component,
+        type: ctx.type,
+        dep,
+        wxs: !!ctx.wxs
+      });
+    });
+  });
+
+  this.register('wepy-parser-script', function(node, ctx) {
+    let assets = this.assets;
+    if (ctx.npm && !ctx.component && !ctx.wxs) {
+      if (this.vendors.pending(ctx.file)) {
+        // file compile is pending
+        let moduleId = this.vendors.get(ctx.file);
+        return Promise.resolve(moduleId);
+      }
+      ctx.vendorId = this.vendors.add(ctx.file, 'npm');
+    }
+
+    if (ctx.useCache && node.parsed) {
+      // File is not changed
+      let walker = node.parsed.parser;
+
+      let depTasks = walker.deps.map(dep => this.hookUnique('wepy-parser-dep', node, ctx, dep));
+
+      return Promise.all(depTasks).then(() => {
+        return node.parsed;
+      });
+    } else {
+      let source = new ReplaceSource(new RawSource(node.compiled.code));
+      let astData = toAst(node.compiled.code);
+
+      let walker = new Walker(this, astData, node.lang);
+      walker.run();
+
+      let depTasks = walker.deps.map(dep => this.hookUnique('wepy-parser-dep', node, ctx, dep));
+      return Promise.all(depTasks).then(rst => {
+        let obj = {
+          file: ctx.file,
+          parser: walker,
+          code: node.compiled.code,
+          encoding: node.compiled.encoding || 'utf-8',
+          outputFileName: node.compiled.outputFileName,
+          source: source,
+          depModules: rst,
+          npm: !!ctx.npm,
+          type: ctx.type,
+          component: ctx.component
+        };
+
+        this.fileDep.addDeps(ctx.file, obj.depModules.map(d => d.file));
+
+        let componentValue = ctx.component;
+        const t = this.assets.type(ctx.file);
+        if (t !== undefined) {
+          // if it has type in this.assets
+          componentValue = t.component;
+        }
+        let types = {
+          component: componentValue,
+          npm: ctx.npm,
+          dep: ctx.dep,
+          type: ctx.type,
+          wxs: ctx.wxs
+        };
+
+        this.assets.update(ctx.file, obj, types);
+        obj.id = assets.get(ctx.file);
+        if (ctx.npm && !(ctx.component && ctx.type === 'weapp') && !ctx.wxs) {
+          this.vendors.update(ctx.file, obj, types);
+          obj.vendorId = this.vendors.get(ctx.file);
+        }
+        return obj;
+      });
+    }
+  });
+};
diff --git a/packages/cli/core/plugins/parser/style.js b/packages/cli/core/plugins/parser/style.js
new file mode 100644
index 000000000..c2328d700
--- /dev/null
+++ b/packages/cli/core/plugins/parser/style.js
@@ -0,0 +1,11 @@
+exports = module.exports = function() {
+  this.register('wepy-parser-style', function(node, ctx) {
+    // If this file have dependences, then ignore cache for it.
+    if (ctx.useCache && node.parsed && (node.parsed.dep || []).length === 0) {
+      return Promise.resolve(true);
+    }
+    node.parsed = node.compiled;
+
+    return Promise.resolve(true);
+  });
+};
diff --git a/packages/cli/core/plugins/parser/template.js b/packages/cli/core/plugins/parser/template.js
new file mode 100644
index 000000000..fb2decec9
--- /dev/null
+++ b/packages/cli/core/plugins/parser/template.js
@@ -0,0 +1,57 @@
+const xmllint = require('../../util/xmllint');
+
+exports = module.exports = function() {
+  this.register('wepy-parser-template', function(node, ctx) {
+    if (ctx.useCache && ctx.sfc.template.parsed) {
+      return Promise.resolve(true);
+    }
+
+    // If it's weapp, do not compile it.
+    if (ctx.type === 'weapp') {
+      ctx.sfc.template.parsed = {
+        code: node.content,
+        rel: {}
+      };
+      return Promise.resolve(true);
+    }
+
+    let code = node.content;
+    let msg = xmllint.verify(code);
+    msg.forEach(item => {
+      let type = item.type === 'warning' ? 'warn' : 'error';
+      this.hookUnique(
+        'error-handler',
+        'template',
+        {
+          ctx: ctx,
+          message: item.message,
+          type: type,
+          title: 'verify'
+        },
+        {
+          start: { line: item.line, column: item.col }
+        }
+      );
+      //errorHandler[type](item.message, ctx.file, code, { start: {line: item.line, column: item.col}});
+    });
+
+    let components = {};
+    let sfcConfig = ctx.sfc.config;
+
+    let usingComponents = sfcConfig && sfcConfig.parsed.output ? sfcConfig.parsed.output.usingComponents : {};
+
+    for (let k in usingComponents) {
+      components[k] = {
+        path: usingComponents[k]
+      };
+    }
+
+    return this.hookUnique('template-parse', node.content, components, ctx).then(rst => {
+      ctx.sfc.template.parsed = {
+        code: rst.code,
+        rel: rst.rel
+      };
+      return Promise.resolve(true);
+    });
+  });
+};
diff --git a/packages/cli/core/plugins/parser/wpy.js b/packages/cli/core/plugins/parser/wpy.js
new file mode 100644
index 000000000..04433c1c1
--- /dev/null
+++ b/packages/cli/core/plugins/parser/wpy.js
@@ -0,0 +1,146 @@
+/**
+ * Tencent is pleased to support the open source community by making WePY available.
+ * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
+ * http://opensource.org/licenses/MIT
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+const sfcCompiler = require('vue-template-compiler');
+const fs = require('fs');
+const path = require('path');
+const loaderUtils = require('loader-utils');
+
+const hashUtil = require('../../util/hash');
+
+exports = module.exports = function() {
+  this.register('wepy-parser-wpy', function(comp) {
+    let sfc, flow;
+    let file = comp.path;
+    let type = comp.type;
+
+    let context = {
+      file,
+      type,
+      npm: type === 'module',
+      component: true
+    };
+
+    let fileContent = fs.readFileSync(file, 'utf-8');
+    let fileHash = hashUtil.hash(fileContent);
+
+    if (this.compiled[file] && fileHash === this.compiled[file].hash) {
+      // 文件 hash 一致，说明文件无修改
+      context = this.compiled[file];
+      context.useCache = true;
+      sfc = context.sfc;
+
+      if (context.done) {
+        flow = Promise.resolve(true); // For file watch, still need to go throught all the dependences
+      } else {
+        flow = context.promise;
+      }
+    } else {
+      this.compiled[file] = context;
+      context.useCache = false;
+      context.hash = fileHash;
+      this.fileDep.cleanDeps(file);
+
+      context.sfc = sfcCompiler.parseComponent(fileContent, { pad: 'space' });
+
+      sfc = context.sfc;
+      // deal with the custom block, like config, wxs. etc.
+      sfc = this.hookSeq('sfc-custom-block', sfc);
+
+      if (!sfc.script) {
+        sfc.script = {
+          attrs: {},
+          type: 'script',
+          empty: true,
+          lang: 'js',
+          content: 'Component({})'
+        };
+      }
+
+      if (!sfc.config) {
+        sfc.config = { type: 'config', empty: true, content: '{}', lang: 'json' };
+      }
+
+      flow = this.hookAsyncSeq('parse-sfc-src', context);
+    }
+
+    this.fileDep.addDeps(file);
+
+    context.promise = flow
+      .then(() => {
+        return this.applyCompiler(context.sfc.config, context);
+      })
+      .then(() => {
+        if (sfc.wxs) {
+          return Promise.all(
+            sfc.wxs.map(wxs => {
+              return this.applyCompiler(wxs, context);
+            })
+          );
+        }
+      })
+      .then(() => {
+        if (sfc.template && type !== 'app') {
+          sfc.template.lang = sfc.template.lang || 'wxml';
+          return this.applyCompiler(context.sfc.template, context);
+        }
+      })
+      .then(() => {
+        if (sfc.script) {
+          sfc.script.lang = sfc.script.lang || 'babel';
+          return this.applyCompiler(context.sfc.script, context);
+        }
+      })
+      .then(parsed => {
+        sfc.script && parsed && (sfc.script.parsed = parsed);
+        if (sfc.styles) {
+          return Promise.all(
+            sfc.styles.map(style => {
+              style.lang = style.lang || 'css';
+              return this.applyCompiler(style, context);
+            })
+          );
+        }
+      })
+      .then(() => {
+        context.done = true;
+        return context;
+      });
+
+    return context.promise;
+  });
+
+  const trailingSlash = /[/\\]$/;
+
+  this.register('parse-sfc-src', function(context) {
+    let sfc = context.sfc;
+
+    let tasks = [];
+    let dir = path.parse(context.file).dir;
+    dir = dir.replace(trailingSlash, '');
+
+    for (let type in sfc) {
+      // wxs is an array.
+      let nodes = [].concat(sfc[type]);
+      nodes.forEach(node => {
+        const src = node ? node.src : '';
+        if (src) {
+          const request = loaderUtils.urlToRequest(src, src.charAt(0) === '/' ? '' : null);
+          tasks.push(
+            this.resolvers.normal.resolve({}, dir, request, {}).then(rst => {
+              node.content = fs.readFileSync(rst.path, 'utf-8');
+              this.fileDep.addDeps(context.file, [rst.path]);
+              node.dirty = true;
+            })
+          );
+        }
+      });
+    }
+    return Promise.all(tasks);
+  });
+};
diff --git a/packages/cli/core/plugins/parser/wxs.js b/packages/cli/core/plugins/parser/wxs.js
new file mode 100644
index 000000000..c22d25505
--- /dev/null
+++ b/packages/cli/core/plugins/parser/wxs.js
@@ -0,0 +1,62 @@
+const path = require('path');
+const hashUtil = require('../../util/hash');
+
+exports = module.exports = function() {
+  this.register('wepy-parser-wxs', function(node, ctx) {
+    if (ctx.useCache && !node.src && ctx.sfc.template.parsed) {
+      return Promise.resolve(true);
+    }
+    let moduleId = node.attrs.module;
+    let code = node.compiled.code.trim();
+    let output = `<wxs module="${moduleId}"${node.src ? ' src="' + node.src + '"' : ''}>${
+      !node.src ? '\n' + code + '\n' : ''
+    }</wxs>`;
+    node.parsed = {
+      output
+    };
+    const fileHash = node.src ? hashUtil.hash(code) : ctx.hash;
+    // If have src attribute, then use src.wxs as ctx key
+    // If do not have src, then create a fake xxx.wpy_wxs as ctx key.
+    // Can not use wpy ctx, because it's generated in wpy parse.
+    const cacheKey = node.src ? path.resolve(path.dirname(ctx.file), node.src) : ctx.file + '_wxs';
+    const isHashEqual = !!this.compiled[cacheKey] && fileHash === this.compiled[cacheKey].hash;
+    let wxsCtx = null;
+
+    if (node.src && isHashEqual) {
+      // If node has src, then use src file cache
+      wxsCtx = this.compiled[cacheKey];
+      wxsCtx.useCache = true;
+      return Promise.resolve(wxsCtx);
+    } else {
+      wxsCtx = Object.assign({}, ctx, {
+        // If node have a src, then ctx.file has to be node.src related, otherwise, there will be an error while require a wxs file in the wxs file
+        file: node.src ? cacheKey : ctx.file,
+        wxs: true,
+        hash: fileHash
+      });
+      this.compiled[cacheKey] = wxsCtx;
+
+      // If sfc file hash is equal
+      if (isHashEqual) {
+        return Promise.resolve(wxsCtx);
+      }
+      if (node.src) {
+        this.assets.add(cacheKey, {
+          npm: wxsCtx.npm,
+          wxs: true,
+          dep: true,
+          component: wxsCtx.component,
+          type: wxsCtx.type
+        });
+      }
+    }
+
+    node = {
+      type: 'script',
+      lang: node.lang,
+      content: code,
+      src: node.src
+    };
+    return this.applyCompiler(node, wxsCtx);
+  });
+};
diff --git a/packages/cli/core/plugins/scriptDepFix.js b/packages/cli/core/plugins/scriptDepFix.js
new file mode 100644
index 000000000..d72ae314c
--- /dev/null
+++ b/packages/cli/core/plugins/scriptDepFix.js
@@ -0,0 +1,93 @@
+const path = require('path');
+const slash = require('slash');
+
+exports = module.exports = function() {
+  /*
+   * S1: __wepy_require(n);
+   * S2: require('./lib/sth');
+   * S3: require('/vendor.js')(n);
+   * S4: import 'xxxx' from 'xxx';j
+   */
+  this.register('script-dep-fix', function scriptDepFix(parsed, isNPM) {
+    if (!parsed.fixedDeps) {
+      parsed.fixedDeps = [];
+    }
+    if (!parsed.fixedReplacement && parsed.parser.replacements) {
+      parsed.parser.replacements.forEach(item => {
+        parsed.source.replace(item.expr.start, item.expr.end - 1, item.value);
+      });
+      parsed.fixedReplacement = true;
+    }
+    parsed.parser.deps.forEach((dep, i) => {
+      if (!parsed.fixedDeps[i]) {
+        let depMod = parsed.depModules[i];
+        if (typeof depMod === 'string') {
+          parsed.source.replace(dep.expr.start, dep.expr.end - 1, depMod);
+          parsed.fixedDeps[i] = true;
+          return;
+        }
+        if (typeof depMod === 'number') {
+          depMod = this.vendors.data(depMod);
+        }
+        // TODO: optimize
+        // compiled info is not equal asserts, vendorId is missing sometime
+        // always use assets data instead of compiled info.
+        depMod = this.assets.data(depMod.file) || depMod;
+
+        let modFilePath = depMod.file;
+        let modFilePathObj = path.parse(modFilePath);
+        if (depMod.outputFileName && modFilePathObj.base !== depMod.outputFileName) {
+          modFilePath = path.join(modFilePathObj.dir, depMod.outputFileName);
+        }
+        if (path.extname(modFilePath) === '.ts') {
+          modFilePath = modFilePath.slice(0, -2) + 'js';
+        }
+        let replaceMent = '';
+        if (isNPM) {
+          if (depMod.vendorId === undefined) {
+            depMod = this.vendors.data(depMod.file);
+          }
+          replaceMent = `__wepy_require(${depMod.vendorId})`;
+        } else {
+          if (depMod === false) {
+            replaceMent = '{}';
+          } else if (!depMod.npm || (depMod.component && depMod.type === 'weapp')) {
+            //depMod dep is not a npm package, and it's not a component
+            let relativePath = path.relative(path.dirname(parsed.file), modFilePath).replace(/\\/g, '/');
+            if (dep.statement && dep.statement.type === 'ImportDeclaration') {
+              // import 'xxxxx' from 'xxxxx';
+              replaceMent = `'${relativePath}'`;
+            } else {
+              replaceMent = `require('./${relativePath}')`;
+            }
+          } else if (!depMod.npm && depMod.component) {
+            let relativePath = path.relative(path.dirname(parsed.file), modFilePath);
+            let reg = new RegExp('\\' + this.options.wpyExt + '$', 'i');
+            relativePath = slash(relativePath.replace(reg, '.js'));
+            replaceMent = `require('./${relativePath}')`;
+          } else {
+            if (typeof depMod.vendorId === 'number') {
+              let relativePath;
+              let npmfile = path.join(this.context, this.options.src, 'vendor.js');
+              if (parsed.npm) {
+                // This is a npm package
+                relativePath = path.relative(
+                  path.dirname(this.getModuleTarget(parsed.file, this.options.src)),
+                  npmfile
+                );
+              } else {
+                relativePath = path.relative(path.dirname(parsed.file), npmfile);
+              }
+              relativePath = slash(relativePath);
+              replaceMent = `require('./${relativePath}')(${depMod.vendorId})`;
+            } else {
+              replaceMent = `require('./${dep.module}')`;
+            }
+          }
+        }
+        parsed.source.replace(dep.expr.start, dep.expr.end - 1, replaceMent);
+        parsed.fixedDeps[i] = true;
+      }
+    });
+  });
+};
diff --git a/packages/cli/core/plugins/scriptInjection.js b/packages/cli/core/plugins/scriptInjection.js
new file mode 100644
index 000000000..298d373d5
--- /dev/null
+++ b/packages/cli/core/plugins/scriptInjection.js
@@ -0,0 +1,80 @@
+const genRel = rel => {
+  if (typeof rel === 'string') return rel;
+
+  let handlerStr = '{';
+  for (let h in rel.handlers) {
+    let handler = rel.handlers[h];
+    handlerStr += `'${h}': {`;
+    if (typeof handler === 'object') {
+      let events = Object.keys(handler);
+      events.forEach((e, p) => {
+        handlerStr += `${JSON.stringify(e)}: ${handler[e]}`;
+        if (p !== events.length - 1) {
+          handlerStr += ', ';
+        }
+      });
+    }
+    handlerStr += '},';
+  }
+  if (handlerStr.length > 2) {
+    handlerStr = handlerStr.substring(0, handlerStr.length - 1);
+  }
+  handlerStr += '}';
+
+  let modelStr = '';
+  for (let i in rel.models) {
+    modelStr += `'${i}': {
+      type: ${JSON.stringify(rel.models[i].type)},
+      expr: ${JSON.stringify(rel.models[i].expr)},
+      handler: ${rel.models[i].handler}
+    },`;
+  }
+  modelStr = '{' + modelStr.substring(0, modelStr.length - 1) + '}';
+
+  let copy = Object.assign({}, rel);
+  delete copy.handlers;
+  delete copy.models;
+
+  return `{info: ${JSON.stringify(copy || {})}, handlers: ${handlerStr}, models: ${modelStr}, refs: ${JSON.stringify(
+    rel.refs
+  )} }`;
+};
+
+exports = module.exports = function() {
+  this.register('script-injection', function scriptInjection(parsed, ref) {
+    let relStr = genRel(ref);
+    const { source } = parsed;
+    let entry = parsed.parser.entry;
+    if (!entry) {
+      this.hookUnique('error-handler', {
+        type: 'warn',
+        message: `Missing wepy entry. A .wpy file should have "wepy.app", "wepy.page" or "wepy.component"`,
+        ctx: {
+          file: parsed.file
+        }
+      });
+      return;
+    }
+    let args = entry.arguments;
+    let pos = 0;
+    if (args === 0) {
+      pos = entry.callee.end + 1;
+    } else {
+      pos = args[args.length - 1].end;
+      relStr = ', ' + relStr;
+    }
+
+    // avoid to import duplicated
+    // eslint-disable-next-line
+    if (source.relIndex != null) {
+      const idx = source.replacements.findIndex(arr => {
+        return arr[arr.length - 1] === source.relIndex;
+      });
+      if (idx !== -1) {
+        source.replacements.splice(idx, 1);
+      }
+    }
+    source.insert(pos, relStr);
+    source.relIndex = source.replacements.length - 1;
+  });
+};
diff --git a/packages/cli/core/plugins/template/attrs/bindClass.js b/packages/cli/core/plugins/template/attrs/bindClass.js
new file mode 100644
index 000000000..7a2b72700
--- /dev/null
+++ b/packages/cli/core/plugins/template/attrs/bindClass.js
@@ -0,0 +1,41 @@
+const parseClass = require('../../../ast/parseClass');
+
+exports = module.exports = function() {
+  this.register('template-parse-ast-attr-:class', function parseBindClass({ item, expr, ctx }) {
+    let exprArray = [];
+    try {
+      exprArray = parseClass(expr);
+    } catch (e) {
+      this.hookUnique(
+        'error-handler',
+        'template',
+        {
+          code: expr,
+          ctx,
+          type: 'error',
+          message: 'Can not parse ":class" expression',
+          title: ':class'
+        },
+        { item }
+      );
+      throw new Error('EXIT');
+    }
+    let bindClass = [];
+    exprArray.forEach(item => {
+      if (typeof item === 'string') {
+        bindClass.push(`${item}`);
+      } else {
+        Object.keys(item).forEach(name => {
+          // eslint-disable-next-line
+          let exp = item[name].replace(/\'/gi, '\\\'').replace(/\"/gi, '\\"');
+          // eslint-disable-next-line
+          name = name.replace(/\'/gi, '\\\'').replace(/\"/gi, '\\"');
+          bindClass.push(`${exp} ? '${name}' : ''`);
+        });
+      }
+    });
+    item.bindClass = bindClass;
+
+    return { attrs: {} };
+  });
+};
diff --git a/packages/cli/core/plugins/template/attrs/bindStyle.js b/packages/cli/core/plugins/template/attrs/bindStyle.js
new file mode 100644
index 000000000..3a7352e8c
--- /dev/null
+++ b/packages/cli/core/plugins/template/attrs/bindStyle.js
@@ -0,0 +1,22 @@
+const exprParser = require('../../../util/exprParser');
+
+exports = module.exports = function() {
+  this.register('template-parse-ast-attr-:style', function parseBindStyle({ item, expr }) {
+    let exprObj = exprParser.str2obj(expr);
+    item.bindStyle = Object.keys(exprObj).map(name => {
+      // eslint-disable-next-line
+      let exp = exprObj[name].replace(/\'/gi, '\\\'').replace(/\"/gi, '\\"');
+
+      // add brackets to fix priority of "+" operator.
+      if (/^\(.*\)$/.test(exp) === false) {
+        exp = `(${exp})`;
+      }
+      // eslint-disable-next-line
+      name = name.replace(/\'/gi, '\\\'').replace(/\"/gi, '\\"');
+      name = exprParser.hyphenate(name);
+      return `'${name}:' + ${exp} + ';'`;
+    });
+    // return {} means remove :class
+    return { attrs: {} };
+  });
+};
diff --git a/packages/cli/core/plugins/template/attrs/index.js b/packages/cli/core/plugins/template/attrs/index.js
new file mode 100644
index 000000000..0594f2bfb
--- /dev/null
+++ b/packages/cli/core/plugins/template/attrs/index.js
@@ -0,0 +1,3 @@
+exports = module.exports = function parseAttrs() {
+  ['./bindClass', './bindStyle', './src', './ref'].map(v => require(v).call(this));
+};
diff --git a/packages/cli/core/plugins/template/attrs/ref.js b/packages/cli/core/plugins/template/attrs/ref.js
new file mode 100644
index 000000000..812f350f2
--- /dev/null
+++ b/packages/cli/core/plugins/template/attrs/ref.js
@@ -0,0 +1,57 @@
+exports = module.exports = function() {
+  let totalRefCache = {};
+
+  function getParseRefFunc(hasBindAttrRef = false) {
+    return function({ item, ctx, expr, rel }) {
+      let attrs = item.attribs;
+      let parsedRef = {};
+      let assetsId = this.assets.get(ctx.file);
+      let refCache;
+      let elemId;
+
+      let components = rel.components;
+      let hasAttrId = attrs.hasOwnProperty('id');
+      let hasBindAttrId = attrs.hasOwnProperty(':id');
+
+      if (!totalRefCache[assetsId]) {
+        totalRefCache[assetsId] = {
+          increaseId: 0
+        };
+      }
+      refCache = totalRefCache[assetsId];
+
+      if (!rel.refs) {
+        rel.refs = [];
+      }
+
+      parsedRef.rel = rel || {};
+      parsedRef.attrs = parsedRef.attrs || {};
+
+      if (!components[item.name]) {
+        if (hasAttrId || hasBindAttrId) {
+          elemId = hasAttrId ? attrs['id'] : attrs[':id'];
+        } else {
+          elemId = `ref-${assetsId}-${refCache.increaseId}`;
+          parsedRef.attrs['id'] = elemId;
+          refCache.increaseId++;
+        }
+        rel.refs.push({
+          id: {
+            name: `${elemId}`,
+            bind: hasBindAttrId
+          },
+          ref: {
+            name: `${expr}`,
+            bind: hasBindAttrRef
+          }
+        });
+      } else {
+        parsedRef.attrs['data-ref'] = hasBindAttrRef ? `{{ ${expr} }}` : `${expr}`;
+      }
+      return parsedRef;
+    };
+  }
+
+  this.register('template-parse-ast-attr-ref', getParseRefFunc().bind(this));
+  this.register('template-parse-ast-attr-:ref', getParseRefFunc(true).bind(this));
+};
diff --git a/packages/cli/core/plugins/template/attrs/src.js b/packages/cli/core/plugins/template/attrs/src.js
new file mode 100644
index 000000000..aa44f4f03
--- /dev/null
+++ b/packages/cli/core/plugins/template/attrs/src.js
@@ -0,0 +1,60 @@
+const fs = require('fs-extra');
+const path = require('path');
+const ReplaceSource = require('webpack-sources').ReplaceSource;
+const RawSource = require('webpack-sources').RawSource;
+const slash = require('slash');
+
+exports = module.exports = function() {
+  this.register('url-to-module', function urlToModule(url) {
+    const parsed = {};
+    const firstChar = url.charAt(0);
+    // if first char eqs `.` `~` or `@`, It will be treated as module processing
+    if ((firstChar === '.' || firstChar === '~' || firstChar === '@') && !(url.includes('{{') || url.includes('}}'))) {
+      if (firstChar === '~') {
+        const secondChar = url.charAt(1);
+        url = url.slice(secondChar === '/' ? 2 : 1);
+      }
+      parsed.isModule = true;
+    } else {
+      parsed.isModule = false;
+    }
+    parsed.url = url;
+    return parsed;
+  });
+
+  this.register('template-parse-ast-attr-src', function parseAssetUrl({ expr, ctx }) {
+    let parsed = this.hookUnique('url-to-module', expr);
+
+    if (parsed.isModule) {
+      const context = path.dirname(ctx.file);
+      const assets = this.assets;
+      const type = 'url';
+      const encoding = 'base64';
+
+      parsed.file = this.resolvers.normal.resolveSync({}, context, parsed.url, {});
+      parsed.url = path.relative(path.dirname(ctx.file), parsed.file);
+
+      if (path.sep === '\\') {
+        // It's Win, change path to posix path
+        parsed.url = slash(parsed.url);
+      }
+
+      const code = fs.readFileSync(parsed.file, encoding);
+      const source = new ReplaceSource(new RawSource(code));
+
+      // add assets dependencies
+      let obj = {
+        file: ctx.file,
+        parser: {},
+        code: code,
+        encoding,
+        source: source,
+        depModules: null,
+        type: type
+      };
+      assets.update(parsed.file, obj, { url: true });
+    }
+    parsed.attr = { attrs: { src: parsed.url } };
+    return parsed.attr;
+  });
+};
diff --git a/packages/cli/core/plugins/template/directives/bind.js b/packages/cli/core/plugins/template/directives/bind.js
new file mode 100644
index 000000000..e1663829c
--- /dev/null
+++ b/packages/cli/core/plugins/template/directives/bind.js
@@ -0,0 +1,21 @@
+const bindRE = /^:|^v-bind:/;
+
+exports = module.exports = function() {
+  // eslint-disable-next-line no-unused-vars
+  this.register('template-parse-ast-attr-v-bind', function parseAstBind({ item, name, expr, modifiers, scope, ctx }) {
+    let prop = name.replace(bindRE, '');
+    let value = expr;
+    expr = `{{ ${expr} }}`;
+    return {
+      bind: {
+        name,
+        prop,
+        value,
+        expr
+      },
+      attrs: {
+        [prop]: expr
+      }
+    };
+  });
+};
diff --git a/packages/cli/core/plugins/template/directives/condition.js b/packages/cli/core/plugins/template/directives/condition.js
new file mode 100644
index 000000000..1f9c93814
--- /dev/null
+++ b/packages/cli/core/plugins/template/directives/condition.js
@@ -0,0 +1,14 @@
+const ADDITIONS_DIRECTIVES_HANDLES = {
+  /* eslint-disable no-unused-vars */
+  'v-show': ({ item, name, expr }) => ({ attrs: { hidden: `{{ !(${expr}) }}` } }),
+  'v-if': ({ item, name, expr }) => ({ attrs: { 'wx:if': `{{ ${expr} }}` } }),
+  'v-else-if': ({ item, name, expr }) => ({ attrs: { 'wx:elif': `{{ ${expr} }}` } }),
+  'v-else': ({ item, name, expr }) => ({ attrs: { 'wx:else': true } })
+  /* eslint-enable no-unused-vars */
+};
+
+exports = module.exports = function() {
+  Object.keys(ADDITIONS_DIRECTIVES_HANDLES).forEach(directives => {
+    this.register('template-parse-ast-attr-' + directives, ADDITIONS_DIRECTIVES_HANDLES[directives]);
+  });
+};
diff --git a/packages/cli/core/plugins/template/directives/for.js b/packages/cli/core/plugins/template/directives/for.js
new file mode 100644
index 000000000..e7fddce2d
--- /dev/null
+++ b/packages/cli/core/plugins/template/directives/for.js
@@ -0,0 +1,108 @@
+const forAliasRE = /([^]*?)\s+(?:in|of)\s+([^]*)/;
+const forIteratorRE = /,([^,}\]]*)(?:,([^,}\]]*))?$/;
+const stripParensRE = /^\(|\)$/g;
+const variableRE = /^\s*[a-zA-Z$_][a-zA-Z\d_]*\s*$/;
+const Check = require('../util/check');
+
+exports = module.exports = function() {
+  this.register('template-parse-ast-pre-attr-v-for', function preParseDirectivesFor({
+    item,
+    name,
+    expr,
+    modifiers,
+    scope,
+    ctx
+  }) {
+    let res = {};
+    let currentScope = {};
+    let inMatch = expr.match(forAliasRE);
+    let variableMatch = expr.match(variableRE);
+    if (variableMatch) {
+      // e.g: v-for="items"
+      res.alias = 'item';
+      res.for = variableMatch[0].trim();
+      currentScope.for = res.for;
+      currentScope.declared = [];
+    }
+
+    if (inMatch) {
+      currentScope.declared = currentScope.declared || [];
+      res.for = inMatch[2].trim();
+      currentScope.for = res.for;
+      let alias = inMatch[1].trim().replace(stripParensRE, '');
+      let iteratorMatch = alias.match(forIteratorRE);
+      if (iteratorMatch) {
+        res.alias = alias.replace(forIteratorRE, '').trim();
+        currentScope.declared.push(res.alias);
+        currentScope.alias = res.alias;
+        res.iterator1 = iteratorMatch[1].trim();
+        currentScope.iterator1 = res.iterator1;
+        currentScope.declared.push(res.iterator1);
+        if (iteratorMatch[2]) {
+          res.iterator2 = iteratorMatch[2].trim();
+          currentScope.iterator2 = res.iterator2;
+          currentScope.declared.push(res.iterator2);
+        }
+      } else {
+        res.alias = alias;
+        currentScope.alias = alias;
+        currentScope.declared.push(alias);
+      }
+    }
+    if (scope) {
+      currentScope.parent = scope;
+    }
+
+    let err = Check.checkExpression(res.for, `v-for="${expr}"`);
+    if (err) {
+      this.hookUnique(
+        'error-handler',
+        'template',
+        {
+          ctx: ctx,
+          message: err,
+          type: 'error',
+          title: 'v-for'
+        },
+        {
+          item: item,
+          attr: name,
+          expr: expr
+        }
+      );
+    }
+
+    item['v-for'] = {
+      'wx:for': `{{ ${res.for} }}`,
+      'wx:for-index': `${res.iterator1 || 'index'}`,
+      'wx:for-item': `${res.alias || 'item'}`,
+      'wx:key': `${res.iterator2 || res.iterator1 || 'index'}`
+    };
+
+    return {
+      item,
+      name,
+      expr,
+      modifiers,
+      scope: currentScope,
+      ctx
+    };
+  });
+
+  this.register('template-parse-ast-attr-v-for', function parseDirectivesFor({
+    /* eslint-disable no-unused-vars */
+    item,
+    name,
+    expr,
+    modifiers,
+    scope,
+    ctx
+    /* eslint-enable no-unused-vars */
+  }) {
+    let attrs = item['v-for'];
+    delete item['v-for'];
+    return {
+      attrs: attrs
+    };
+  });
+};
diff --git a/packages/cli/core/plugins/template/directives/index.js b/packages/cli/core/plugins/template/directives/index.js
new file mode 100644
index 000000000..04e335fe2
--- /dev/null
+++ b/packages/cli/core/plugins/template/directives/index.js
@@ -0,0 +1,3 @@
+exports = module.exports = function parseDirectives() {
+  ['./condition', './bind', './for', './model', './other', './v-on'].map(v => require(v).call(this));
+};
diff --git a/packages/cli/core/plugins/template/directives/model.js b/packages/cli/core/plugins/template/directives/model.js
new file mode 100644
index 000000000..d994dc3ab
--- /dev/null
+++ b/packages/cli/core/plugins/template/directives/model.js
@@ -0,0 +1,320 @@
+const CONST = require('../../../util/const');
+const vueWithTransform = require('vue-template-es2015-compiler');
+
+const MODEL_MAP = {
+  input: {
+    type: 'input',
+    value: 'value'
+  },
+  textarea: {
+    type: 'input',
+    value: 'value'
+  },
+  picker: {
+    type: 'change',
+    value: 'value'
+  },
+  switch: {
+    type: 'change',
+    value: 'checked'
+  },
+  'checkbox-group': {
+    // TODO: Can not set data for checkbox-group
+    type: 'change',
+    value: null
+  },
+  'radio-group': {
+    type: 'change',
+    value: null
+  }
+};
+
+/**
+ * Parse a v-model expression into a base path and a final key segment.
+ * Handles both dot-path and possible square brackets.
+ *
+ * Possible cases:
+ *
+ * - test
+ * - test[key]
+ * - test[test1[key]]
+ * - test["a"][key]
+ * - xxx.test[a[a].test1[key]]
+ * - test.xxx.a["asa"][test1[key]]
+ *
+ */
+function parseModel(str) {
+  str = str.trim();
+  let len = str.length;
+
+  // e.g.
+  // test[0].a
+  // test.a.b
+  if (str.indexOf('[') < 0 || str.lastIndexOf(']') < len - 1) {
+    let dot = str.lastIndexOf('.');
+    if (dot > -1) {
+      return {
+        expr: str.slice(0, dot),
+        key: `${str.slice(dot + 1)}`
+      };
+    } else {
+      return {
+        expr: str,
+        key: null
+      };
+    }
+  }
+
+  /*
+   * e.g.
+   * test[a[b]]
+   */
+
+  let index = 0;
+  let exprStart = 0;
+  let exprEnd = 0;
+
+  let isQuoteStart = function(chr) {
+    return chr === 0x22 || chr === 0x27;
+  };
+
+  let parseString = function(chr) {
+    while (index < len && str.charCodeAt(++index) !== chr) {}
+  };
+
+  let parseBracket = function(chr) {
+    let inBracket = 1;
+    exprStart = index;
+    while (index < len) {
+      chr = str.charCodeAt(++index);
+      if (isQuoteStart(chr)) {
+        parseString(chr);
+        continue;
+      }
+      if (chr === 0x5b) inBracket++;
+      if (chr === 0x5d) inBracket--;
+
+      if (inBracket === 0) {
+        exprEnd = index;
+        break;
+      }
+    }
+  };
+
+  while (index < len) {
+    let chr = str.charCodeAt(++index);
+    if (isQuoteStart(chr)) {
+      parseString(chr);
+    } else if (chr === 0x5b) {
+      parseBracket(chr);
+    }
+  }
+
+  return {
+    expr: str.slice(0, exprStart),
+    key: str.slice(exprStart + 1, exprEnd)
+  };
+}
+
+function generateModelFunction(expr) {
+  let func = '';
+  let parsed = parseModel(expr);
+  if (parsed.key === null) {
+    // it has to be  " something = $v "
+    // cannot be  ['something'] = $v
+    func = `function set ($v) {
+      with (this) {
+        ${expr} = $v;
+      }
+    }`;
+  } else {
+    func = `function set ($v) {
+      with (this) {
+        $set(${parsed.expr}, "${parsed.key}", $v);
+      }
+    }`;
+  }
+  func = vueWithTransform(func);
+  func = func.replace('var _h=_vm.$createElement;var _c=_vm._self._c||_h;', ''); // removed unused vue code;
+  return func;
+}
+
+function generateModelFunctionInScope(scope, iterators, expr) {
+  let l = iterators.length;
+  let i = 0;
+  let func = [];
+
+  let fetch = scope;
+  let lastFor = scope.for;
+
+  let parsed = parseModel(expr);
+
+  while (fetch) {
+    if (i === 0) {
+      if (parsed.key === null) {
+        func.push(`function fn${l - i}(${fetch.alias}) {
+          ${expr} = $v;
+        }`);
+      } else {
+        func.push(`function fn${l - i}(${fetch.alias}) {
+          $set(${parsed.expr}, "${parsed.key}", $v);
+        }`);
+      }
+    } else {
+      func.push(`function fn${l - i}(${fetch.alias}) {
+        return fn${l - i + 1}((${lastFor})[$p[${l - i}]]);
+      }`);
+    }
+    i++;
+    lastFor = fetch.for;
+    fetch = fetch.parent;
+  }
+
+  // Use a special param, if user define the reserve param, then it will have an error.
+  func = `function set ($v, $p) {
+    with (this) {
+      ${func.join('\n')}
+      return fn1((${lastFor})[$p[0]]);
+    }
+  }`;
+
+  func = vueWithTransform(func);
+  func = func.replace('var _h=_vm.$createElement;var _c=_vm._self._c||_h;', ''); // removed unused vue code;
+
+  return func;
+}
+
+exports = module.exports = function() {
+  let modelid = 0;
+
+  this.register('template-parse-ast-attr-v-model', function parseVModel({ item, expr, scope }) {
+    let attrs = item.attribs;
+
+    let conflicts = ['value', 'v-bind', ':value'].filter(v => !!attrs[v]);
+
+    conflicts.forEach(c => {
+      this.logger.warn('v-model', `${c}="${attrs[c]}" conflicts with v-model on element <${item.name}>`);
+      delete attrs[c];
+    });
+
+    expr = expr.trim();
+
+    let param = '',
+      i = 0;
+    while (i < expr.length && expr[i] !== '.' && expr[i] !== '[') {
+      // get v-model param, like item.checked or item[0]
+      param += expr[i++];
+    }
+
+    let rst = {
+      attrs: {},
+      model: {
+        id: modelid++,
+        tag: item.name,
+        expr: expr
+      }
+    };
+    if (scope) {
+      let iterators = [];
+      let fetchScope = scope;
+      let level = 0;
+      let referScope = null;
+      while (fetchScope) {
+        level++;
+
+        // Get all iterators from parent scopes
+        if (!referScope && fetchScope.declared.indexOf(param) > -1) {
+          referScope = fetchScope;
+          iterators = [];
+        }
+        if (referScope) {
+          if (!fetchScope.iterator1) {
+            this.logger.error(
+              'v-for',
+              `Missing iterator index in "${fetchScope.expr}". If you want to use v-model inside a v-for. then you have to declare a iterator index, like "(item, index) in list".`
+            );
+          } else {
+            if (iterators.indexOf(fetchScope.iterator1) > -1) {
+              // index exists
+              this.logger.warn('v-for', `Duplicated iterator in "${fetchScope.expr}"`);
+            }
+            iterators.push(fetchScope.iterator1);
+          }
+        }
+        fetchScope = fetchScope.parent;
+      }
+
+      if (iterators && iterators.length) {
+        rst.model.scopeInfo = {
+          referScope: referScope,
+          scope: scope,
+          param: param,
+          level: level,
+          iterators: iterators
+        };
+      }
+    }
+    return rst;
+  });
+
+  this.register('template-parse-ast-attr-v-model-apply', function parseVModelApply({ parsed, rel }) {
+    let model = parsed.model;
+    let expr = model.expr.trim();
+    let attrs = parsed.attrs;
+
+    if (rel.model) {
+      return;
+    }
+
+    if (model.tag === 'radio' || model.tag === 'checkbox') {
+      // checkbox and radio do not have bindchange event.
+      this.logger.warn(
+        'v-model',
+        `<${model.tag} /> do not support v-model, please use <${model.tag}-group /> instead.`
+      );
+    }
+
+    let map = MODEL_MAP[model.tag];
+    if (map) {
+      if (map.value) {
+        attrs[map.value] = `{{ ${expr} }}`;
+      }
+
+      if (!attrs[`bind${map.type}`]) {
+        attrs[`bind${map.type}`] = CONST.EVENT_DISPATCHER;
+      }
+
+      if (!rel.models) {
+        rel.models = [];
+      }
+      rel.models[model.id] = {
+        type: map.type,
+        expr: expr
+      };
+
+      if (model.id !== undefined) {
+        attrs['data-model-id'] = model.id;
+      }
+
+      if (model.scopeInfo) {
+        // v-model in v-for
+        let iterators = model.scopeInfo.iterators;
+        let i = iterators.length;
+        let p = 0;
+        if (i > 26) {
+          this.logger.error('v-model', 'Too deep in v-for');
+        }
+        while (--i >= 0) {
+          let attr = `data-model-` + String.fromCharCode(97 + p++);
+          attrs[attr] = `{{ ${iterators[i]} }}`;
+        }
+
+        rel.models[model.id].handler = generateModelFunctionInScope(model.scopeInfo.referScope, iterators, expr);
+      } else {
+        rel.models[model.id].handler = generateModelFunction(expr);
+      }
+    }
+
+    return { parsed, rel };
+  });
+};
diff --git a/packages/cli/core/plugins/template/directives/other.js b/packages/cli/core/plugins/template/directives/other.js
new file mode 100644
index 000000000..fcad81f8f
--- /dev/null
+++ b/packages/cli/core/plugins/template/directives/other.js
@@ -0,0 +1,66 @@
+const onRE = /^@|^v-on:/;
+const bindRE = /^:|^v-bind:/;
+const nativeBindRE = /^bind:?|^catch:?|^capture-bind:?|^capture-catch:?/;
+
+exports = module.exports = function() {
+  /*
+  this.register('template-parse-ast-pre-attr-[other]', function preParseDirectivesFor ({item, name, expr, modifiers, scope, ctx}) {
+  });
+  */
+
+  this.register('template-parse-ast-attr-[other]', function parseDirectivesFor({
+    item,
+    name,
+    expr,
+    modifiers,
+    scope,
+    ctx
+  }) {
+    if (nativeBindRE.test(name)) {
+      let bindType = name.match(nativeBindRE)[0];
+      name = name.replace(bindType, '');
+      modifiers = {};
+      if (bindType[bindType.length - 1] === ':') {
+        bindType = bindType.substring(0, bindType.length - 1);
+      }
+      switch (bindType) {
+        case 'bind':
+          break;
+        case 'catch':
+          modifiers.stop = true;
+          break;
+        case 'capture-bind':
+          modifiers.capture = true;
+          break;
+        case 'capture-catch':
+          modifiers.stop = true;
+          modifiers.capture = true;
+          break;
+      }
+      return this.hookUnique('template-parse-ast-attr-v-on', { item, name, expr, modifiers, scope, ctx });
+    }
+
+    if (bindRE.test(name)) {
+      // :prop or v-bind:prop;
+
+      return this.hookUnique('template-parse-ast-attr-v-bind', { item, name, expr, modifiers, scope, ctx });
+    } else if (onRE.test(name)) {
+      // @ or v-on:
+      name = name.replace(onRE, '');
+      return this.hookUnique('template-parse-ast-attr-v-on', { item, name, expr, modifiers, scope, ctx });
+    }
+
+    return {
+      attrs: {
+        [name]: expr
+      }
+    };
+  });
+
+  this.register('template-parse-ast-attr-[other]-apply', function applyDirective({ parsed, rel }) {
+    return {
+      parsed,
+      rel
+    };
+  });
+};
diff --git a/packages/cli/core/plugins/template/directives/v-on.js b/packages/cli/core/plugins/template/directives/v-on.js
new file mode 100644
index 000000000..7a6ebdc06
--- /dev/null
+++ b/packages/cli/core/plugins/template/directives/v-on.js
@@ -0,0 +1,306 @@
+const vueWithTransform = require('vue-template-es2015-compiler');
+const paramsDetect = require('./../../../ast/paramsDetect');
+const CONST = require('./../../../util/const');
+
+/**
+ * parsse handler AST
+ * @param {String} expr   function expression, e.g. doSomething(a,b,c); item++;
+ * @return {Object}       AST result
+ */
+const parseHandlerProxy = (expr, scope) => {
+  let injectParams = [];
+  let handlerExpr = expr;
+  let eventInArg = false;
+  let needDeclareWx = false;
+  let argumentsInArg = false;
+
+  let parsedHandler;
+  // eslint-disable-next-line
+  if (/^[\w\.]+$/.test(expr)) {
+    //   @tap="doSomething" or @tap="m.doSomething"
+    needDeclareWx = true;
+    argumentsInArg = true;
+    eventInArg = true;
+
+    parsedHandler = {
+      callee: { name: handlerExpr },
+      params: []
+    };
+    handlerExpr = `${expr}.apply(_vm, $args || [$event])`;
+  } else {
+    try {
+      parsedHandler = paramsDetect(handlerExpr);
+    } catch (e) {
+      throw new Error(`Can not parse "${handlerExpr}"`);
+    }
+
+    for (let id in parsedHandler.identifiers) {
+      let fetch = scope;
+      while (fetch) {
+        if (!parsedHandler.identifiers[id].callable && fetch.declared.indexOf(id) !== -1) {
+          injectParams.push(id);
+          break;
+        }
+        fetch = fetch.parent;
+      }
+    }
+
+    if (parsedHandler.identifiers.$event) {
+      needDeclareWx = true;
+      eventInArg = true;
+    }
+
+    if (parsedHandler.identifiers.$wx) {
+      needDeclareWx = true;
+    }
+
+    if (parsedHandler.identifiers.arguments) {
+      needDeclareWx = true;
+      argumentsInArg = true;
+      handlerExpr = handlerExpr.replace('arguments', '$args');
+    }
+  }
+
+  const functionCode = handlerExpr;
+
+  let declaredCodes = [];
+
+  declaredCodes.push('const _vm=this;');
+  if (needDeclareWx) {
+    declaredCodes.push('const $wx = arguments[arguments.length - 1].$wx;');
+  }
+  if (eventInArg) {
+    declaredCodes.push(
+      '  const $event = ($wx.detail && $wx.detail.arguments) ? $wx.detail.arguments[0] : arguments[arguments.length -1];'
+    );
+  }
+  if (argumentsInArg) {
+    declaredCodes.push('  const $args = $wx.detail && $wx.detail.arguments;');
+  }
+
+  let proxy = `function proxy (${injectParams.join(', ')}) {
+  ${declaredCodes.join('\n')}
+  with (this) {
+  return (function () {
+    ${functionCode};
+  })();}
+}`;
+
+  proxy = vueWithTransform(proxy); // transform this
+  proxy = proxy.replace('var _h=_vm.$createElement;var _c=_vm._self._c||_h;', ''); // removed unused vue code;
+  if (proxy.indexOf('_vm=this') !== proxy.lastIndexOf('_vm=this')) {
+    proxy = proxy.replace('var _vm=this;\n', ''); // _vm will decalred twice;
+  }
+  return {
+    proxy: proxy,
+    params: injectParams,
+    parsed: parsedHandler
+  };
+};
+
+/**
+ * parse event handler
+ * @param  {String} key   event key, e.g. tap
+ * @param  {String} value event value, e.g. doSomething(item)
+ * @return {Object}       parse result, e.g. {type: "bind:tap", name: "doSomething", params: ["item"]}
+ */
+const parseHandler = (name = '', value = '', scope) => {
+  let type = '';
+  let info;
+  info = parseHandlerProxy(value, scope);
+
+  if (name === 'click') name = 'tap';
+  type = 'bind:' + name;
+  return {
+    event: name,
+    type: type,
+    params: info.params,
+    proxy: info.proxy,
+    parsed: info.parsed,
+    expr: CONST.EVENT_DISPATCHER
+  };
+};
+/*
+ * parse @tap="click", v-on:tap="click"
+ */
+exports = module.exports = function() {
+  let totalEvtCache = {}; // Global event cache
+
+  this.register('template-parse-ast-attr-v-on.capture', function({ item, name, expr, event, scope, ctx }) {
+    // bind:tap="xxx" or catch:tap="xxx"
+    event.type = event.type.replace(/^bind/, 'bind').replace(/^catch/, 'catch');
+    event.type = 'capture-' + event.type;
+    return { item, name, expr, event, scope, ctx };
+  });
+
+  this.register('template-parse-ast-attr-v-on.stop', function({ item, name, expr, event, scope, ctx }) {
+    if (event.type.startsWith('bind')) {
+      // bindtap="xxx"
+      event.type = event.type.replace(/^bind/, 'catch');
+    } else if (event.type.indexOf('-bind') > -1) {
+      // capture-bindtap="xxx"
+      event.type = event.type.replace(/-bind/, '-catch');
+    }
+    return { item, name, expr, event, scope, ctx };
+  });
+
+  this.register('template-parse-ast-attr-v-on.wxs', function({ item, name, expr, event, scope, ctx }) {
+    event.expr = `{{ ${event.parsed.callee.name} }}`;
+    event.proxy = false;
+    event.params = event.parsed.params.map(p => {
+      if (p.type === 'Literal') {
+        return p.name;
+      } else {
+        return `{{ ${p.name} }}`;
+      }
+    });
+    return { item, name, expr, event, scope, ctx };
+  });
+
+  this.register('template-parse-ast-attr-v-on', function parseAstOn({ item, name, expr, modifiers, scope, ctx }) {
+    let handler = expr.trim();
+
+    let parsedEvent;
+
+    try {
+      parsedEvent = parseHandler(name, handler, scope);
+    } catch (e) {
+      this.hookUnique(
+        'error-handler',
+        'template',
+        {
+          code: expr,
+          ctx,
+          type: 'error',
+          message: 'Can not parse "v-on" expression',
+          title: 'v-on'
+        },
+        { item }
+      );
+      throw new Error('EXIT');
+    }
+
+    /**
+     * we can recognition wxs dynamically
+     * e.g:
+     *
+     *  <wxs module="m" lang="babel">
+     *  const touchmove = (event) => {
+     *    console.log('log event', JSON.stringify(event))
+     *  }
+     *  module.exports.touchmove = touchmove;
+     *  </wxs>
+     *  <template>
+     *    <div class="container">
+     *      <div class="userinfo" @touchmove="m.touchmove">
+     *    </div>
+     *    </div>
+     *  </template>
+     */
+    const eventCallee = parsedEvent.parsed.callee;
+    if (!modifiers.wxs && eventCallee && eventCallee.name) {
+      const calleeChunks = eventCallee.name.split('.');
+      const wxsBlock = ctx.sfc.wxs;
+
+      if (
+        calleeChunks.length > 1 &&
+        wxsBlock &&
+        Array.isArray(wxsBlock) &&
+        wxsBlock.find(item => item.attrs.module === calleeChunks[0])
+      ) {
+        modifiers.wxs = true;
+        this.hookUnique(
+          'error-handler',
+          'template',
+          {
+            ctx: ctx,
+            message: `seems '${calleeChunks[0]}' is a wxs module, please manully add a  .wxs modifier for the event.`,
+            type: 'warn',
+            title: 'v-on'
+          },
+          {
+            item: item,
+            attr: name,
+            expr: expr
+          }
+        );
+      }
+    }
+
+    for (let k in modifiers) {
+      let hookName = 'template-parse-ast-attr-v-on.' + k;
+      if (this.hasHook(hookName)) {
+        this.hook(hookName, { item, name, expr, event: parsedEvent, scope, ctx });
+      }
+    }
+    parsedEvent.params.forEach((p, i) => {
+      let paramAttr = 'data-wpy' + parsedEvent.event.toLowerCase() + '-' + String.fromCharCode(97 + i);
+      if (paramAttr.length > 31) {
+        this.logger.warn(`Function name is too long, it may cause an Error. "${parsedEvent.handler}"`);
+      }
+    });
+    parsedEvent.tag = item.name;
+    if (parsedEvent.proxy) {
+      let assetsId = this.assets.get(ctx.file);
+      let evtCache;
+
+      if (!totalEvtCache[assetsId]) {
+        totalEvtCache[assetsId] = {
+          increaseId: 0
+        };
+      }
+      evtCache = totalEvtCache[assetsId];
+
+      if (!item.events) {
+        item.events = [];
+        parsedEvent.id = `${assetsId}-${evtCache.increaseId}`;
+      } else {
+        parsedEvent.id = item.events[item.events.length - 1].id;
+      }
+      if (!ctx.events) {
+        // generate rel
+        ctx.events = [];
+        ctx.events.push(parsedEvent);
+      }
+      evtCache.increaseId++;
+      parsedEvent.params = parsedEvent.params.map(p => `{{ ${p} }}`);
+    }
+    if (!item.events) {
+      item.events = [];
+    }
+    item.events.push(parsedEvent);
+
+    return {
+      hook: 'template-parse-ast-attr-v-on-apply',
+      'v-on': parsedEvent,
+      attrs: {}
+    };
+  });
+
+  this.register('template-parse-ast-attr-v-on-apply', function parseBindClass({ parsed, rel }) {
+    let vOn = parsed['v-on'];
+
+    if (!vOn.proxy) {
+      return { parsed, rel };
+    }
+
+    let isComponent = !!rel.components[vOn.tag];
+
+    if (isComponent) {
+      // it is a custom defined component
+      rel.on[vOn.id] = rel.on[vOn.id] || [];
+
+      if (rel.on[vOn.id].includes(vOn.event)) {
+        // Todo: repeat event
+        // this.logger.warn('v-on', ``);
+      } else {
+        rel.on[vOn.id].push(vOn.event);
+      }
+    }
+    if (!rel.handlers[vOn.id]) rel.handlers[vOn.id] = {};
+
+    rel.handlers[vOn.id][vOn.event] = vOn.proxy;
+
+    return { parsed, rel };
+  });
+};
diff --git a/packages/cli/core/plugins/template/parse.js b/packages/cli/core/plugins/template/parse.js
new file mode 100644
index 000000000..89f9235ff
--- /dev/null
+++ b/packages/cli/core/plugins/template/parse.js
@@ -0,0 +1,246 @@
+const htmlparser = require('htmlparser2');
+const tools = require('../../util/tools');
+const modifierRE = /\.[^.]+/g;
+
+const toAST = html => {
+  return new Promise((resolve, reject) => {
+    const handler = new htmlparser.DomHandler(
+      function(error, dom) {
+        if (error) {
+          reject(error);
+        } else {
+          resolve(dom);
+        }
+      },
+      { withStartIndices: true, withEndIndices: true }
+    );
+    const parser = new htmlparser.Parser(handler, { xmlMode: true });
+    parser.write(html);
+    parser.end();
+  });
+};
+/**
+ * parse modifiers
+ * @param  {String} name e.g. tap.stop.other
+ * @return {Object}      e.g. {stop: true, other: true}
+ */
+const parseModifiers = (name = '') => {
+  let ret = {};
+  let match = name.match(modifierRE);
+  if (match) {
+    match.forEach(function(m) {
+      ret[m.slice(1)] = true;
+    });
+  }
+  return ret;
+};
+
+const decodingMap = {
+  '&lt;': '<',
+  '&gt;': '>',
+  '&amp;': '&'
+};
+
+function decodeAttr(value) {
+  return value.replace(/&(?:lt|gt|amp);/g, function(match) {
+    return decodingMap[match];
+  });
+}
+
+exports = module.exports = function() {
+  this.register('template-parse-ast-attr', function parseAstAttr(item, scope, rel, ctx) {
+    let attrs = item.attribs;
+    let parsedAttr = item.parsedAttr || {};
+    let parsed = null;
+
+    let cleanAttrs = [];
+
+    // Pre walk attributes
+    for (let name in attrs) {
+      let expr = attrs[name];
+
+      expr = decodeAttr(expr);
+
+      ({ item, name, expr } = this.hookUniqueReturnArg('template-parse-ast-pre-attr-' + name, { item, name, expr }));
+
+      let modifiers = parseModifiers(name);
+
+      if (modifiers) {
+        name = name.replace(modifierRE, '');
+      }
+
+      let hook = 'template-parse-ast-pre-attr-' + name;
+
+      if (!this.hasHook(hook)) {
+        hook = 'template-parse-ast-pre-attr-[other]';
+      }
+
+      ({ item, name, expr, modifiers, scope, ctx } = this.hookUniqueReturnArg(hook, {
+        item,
+        name,
+        expr,
+        modifiers,
+        scope,
+        ctx
+      }));
+
+      cleanAttrs.push({
+        item: item,
+        name: name,
+        expr: expr,
+        modifiers: modifiers
+      });
+    }
+
+    // Apply walk attributes
+    cleanAttrs.forEach(({ item, name, expr, modifiers }) => {
+      let hook = 'template-parse-ast-attr-' + name;
+      if (!this.hasHook(hook)) {
+        hook = 'template-parse-ast-attr-[other]';
+      }
+
+      parsed = this.hookUnique(hook, { item, name, expr, modifiers, scope, ctx, rel });
+      rel = parsed.rel || rel;
+
+      let applyHook = parsed.hook || `template-parse-ast-attr-${name}-apply`;
+      if (!this.hasHook(applyHook)) {
+        applyHook = `template-parse-ast-attr-[other]-apply`;
+      }
+
+      ({ parsed, rel } = this.hookUniqueReturnArg(applyHook, { parsed, rel }));
+
+      if (parsed && parsed.attrs) {
+        parsedAttr = Object.assign(parsedAttr, parsed.attrs);
+      }
+    });
+
+    item.parsedAttr = parsedAttr;
+
+    return [item, scope, rel, ctx];
+  });
+
+  this.register('template-parse-ast-tag', function parseAstTag(item, rel) {
+    let htmlTags = this.tags.htmlTags;
+    let wxmlTags = this.tags.wxmlTags;
+    let html2wxmlMap = this.tags.html2wxmlMap;
+    let logger = this.logger;
+
+    let components = rel.components;
+    if (components[item.name]) {
+      // It's a user defined component
+      logger.silly('tag', `Found user defined component "${item.name}"`);
+      item.parsedAttr = item.parsedAttr || {};
+      item.parsedAttr['bind_init'] = '__initComponent';
+    } else if (html2wxmlMap[item.name]) {
+      // Tag is in the map list
+      logger.silly('html2wxml', `Change "${item.name}" to "${html2wxmlMap[item.name]}"`);
+      item.name = html2wxmlMap[item.name];
+    } else if (wxmlTags.indexOf(item.name) > -1) {
+      // Tag is a wxml tag
+    } else if (htmlTags.indexOf(item.name) > -1) {
+      // Tag is a html tag
+      logger.silly('html2wxml', `Change "${item.name}" is a html tag, changed to "view"`);
+      item.name = 'view';
+    } else {
+      // Tag is a unknow tag
+      logger.silly('tag', `Assume "${item.name}" is a user defined component`);
+    }
+
+    return [item, rel];
+  });
+
+  this.register('template-parse-ast', function parseAST(ast, scope, rel, ctx) {
+    let currentScope;
+    ast.forEach(item => {
+      if (item.type === 'tag') {
+        [item, rel] = this.hookSeq('template-parse-ast-tag', item, rel);
+      }
+      if (item.attribs) {
+        [item, currentScope, rel] = this.hookSeq('template-parse-ast-attr', item, scope, rel, ctx);
+      }
+      if (item.children && item.children.length) {
+        [item.childen, currentScope, rel] = this.hookSeq('template-parse-ast', item.children, currentScope, rel, ctx);
+      }
+    });
+    return [ast, scope, rel, ctx];
+  });
+
+  this.register('template-parse-ast-to-str', function astToStr(ast) {
+    let str = '';
+    ast.forEach(item => {
+      if (item.type === 'text') {
+        str += item.data;
+      } else if (item.type === 'tag') {
+        str += '<' + item.name;
+        if (item.events) {
+          item.events.forEach(evt => {
+            if (evt.proxy) item.parsedAttr['data-wpy-evt'] = evt.id;
+            item.parsedAttr[evt.type] = evt.expr;
+            evt.params.forEach((p, i) => {
+              if (i > 26) {
+                // Maxium params.
+                this.logger.warn(`Too many params`);
+              } else {
+                let evtAttr = 'data-wpy' + evt.event.toLowerCase() + '-' + String.fromCharCode(97 + i);
+                if (evtAttr.length > 31) {
+                  this.logger.warn(`Function name is too long, it may cause an Error. "${evt.handler}"`);
+                }
+                item.parsedAttr[evtAttr] = `${p}`;
+              }
+            });
+          });
+        }
+        if (item.parsedAttr) {
+          Object.keys(item.parsedAttr).forEach(attr => {
+            if (item.parsedAttr[attr] !== undefined && attr !== 'class' && attr !== 'style')
+              str +=
+                tools.isTrue(item.parsedAttr[attr]) || item.parsedAttr[attr] === ''
+                  ? ` ${attr}`
+                  : ` ${attr}="${item.parsedAttr[attr]}"`;
+          });
+        }
+        if (item.parsedAttr.style || (item.bindStyle && item.bindStyle.length)) {
+          let staticStyle = (item.parsedAttr.style || '').trim();
+          if (staticStyle !== '' && /;$/.test(staticStyle) === false) {
+            staticStyle += ';';
+          }
+          let bindStyle = item.bindStyle && item.bindStyle.length ? ` {{ ${item.bindStyle.join(' + ')} }}` : '';
+          str += ` style="${staticStyle + bindStyle}"`;
+        }
+        if (item.parsedAttr.class || (item.bindClass && item.bindClass.length)) {
+          let staticClass = item.parsedAttr.class || '';
+          let bindClass = item.bindClass && item.bindClass.length ? ` {{ [ ${item.bindClass.join(',')} ] }}` : '';
+          str += ` class="${staticClass + bindClass}"`;
+        }
+        if (this.tags.selfCloseTags.includes(item.name) || (item.name === 'template' && !item.children.length)) {
+          str += ' />';
+        } else {
+          str += '>';
+          if (item.children && item.children.length) {
+            str += this.hookUnique('template-parse-ast-to-str', item.children);
+          }
+          str += `</${item.name}>`;
+        }
+      }
+    });
+    return str;
+  });
+
+  this.register('template-parse', function parse(html, components, ctx) {
+    return toAST(html).then(ast => {
+      let rel = { handlers: {}, components: components, on: {} };
+
+      // eslint-disable-next-line
+      let scope = null;
+      [ast, scope, rel] = this.hookSeq('template-parse-ast', ast, null, rel, ctx);
+
+      let code = this.hookUnique('template-parse-ast-to-str', ast);
+
+      return {
+        code: code,
+        rel: rel,
+        ast: ast
+      };
+    });
+  });
+};
diff --git a/packages/cli/core/plugins/template/util/check.js b/packages/cli/core/plugins/template/util/check.js
new file mode 100644
index 000000000..ec896dc0b
--- /dev/null
+++ b/packages/cli/core/plugins/template/util/check.js
@@ -0,0 +1,31 @@
+// strip strings in expressions
+const stripStringRE = /'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g;
+
+// these keywords should not appear inside expressions, but operators like
+// typeof, instanceof and in are allowed
+const prohibitedKeywordRE = new RegExp(
+  '\\b' +
+    (
+      'do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,' +
+      'super,throw,while,yield,delete,export,import,return,switch,default,' +
+      'extends,finally,continue,debugger,function,arguments'
+    )
+      .split(',')
+      .join('\\b|\\b') +
+    '\\b'
+);
+
+exports = module.exports = {
+  checkExpression: function(expr, text) {
+    try {
+      new Function('return ' + expr);
+    } catch (e) {
+      let keywordMatch = expr.replace(stripStringRE, '').match(prohibitedKeywordRE);
+      if (keywordMatch) {
+        return `avoid using Javascript keyword as property name: "${keywordMatch[0]}". Raw expression: ${text.trim()}`;
+      } else {
+        return `Invalid expression: ${e.message} in "${expr}". Raw Expression: ${text.trim()}`;
+      }
+    }
+  }
+};
diff --git a/packages/cli/core/tag.js b/packages/cli/core/tag.js
new file mode 100644
index 000000000..f92ff4ccd
--- /dev/null
+++ b/packages/cli/core/tag.js
@@ -0,0 +1,138 @@
+const { isArr } = require('./util/tools');
+
+// https://developer.mozilla.org/en-US/docs/Web/HTML/Element
+const HTML_TAGS = [
+  // Main root
+  'html',
+  // Document metadata
+  'link,meta,style,title',
+  // Sectioning root
+  'body',
+  // Content sectioning
+  'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section',
+  // Text content
+  'blockquote,dd,dir,div,dl,dt,figcaption,figure,hr,li,main,ol,p,pre,ul',
+  // Inline text semantics
+  'a,abbr,b,bdi,bdo,br,cite,code,data,dfn,em,i,kdb,mark,nobr,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,tt,u,var,wbr',
+  // Image and multimedia
+  'area,audio,img,map,track,video',
+  // Embedded content
+  'applet,embed,iframe,noembed,object,param,picture,source',
+  // Scripting
+  'canvas,noscript,script',
+  // Demarcating edits
+  'del,ins',
+  // Table content
+  'caption,col,colgroup,table,tbody,td,tfoot,th,thead,tr',
+  // Forms
+  'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea',
+  // Interactive elements
+  'details,dialog,menu,menuitem,summary',
+  // Web Components
+  'content,element,shadow,slot,template',
+  // Obsolete and deprecated elements
+  'acronym,applet,basefont,bgsound,big,blink,center,command,content,dir,element,font,frame,frameset,image,isindex,keygen,listing,marquee,menuitem,multicol,nextid,nobr,noembed,noframes,plaintext,shadow,spacer,strike,tt,xmp'
+]
+  .join(',')
+  .split(',');
+
+// https://developers.weixin.qq.com/miniprogram/dev/component/
+const WXML_TAGS = [
+  // view
+  'block,view,scroll-view,swiper,movable-view,cover-view',
+  // base
+  'icon,text,rich-text,progress',
+  // form
+  'button,checkbox,form,input,label,picker,picker-view,radio,slider,switch,textarea',
+  // navigator
+  'navigator',
+  // audio
+  'image,video,camera,live-player,live-pusher',
+  // map
+  'map',
+  // canvas
+  'canvas',
+  // slot
+  'slot',
+  // ability
+  'open-data,web-view,ad',
+  // reference
+  'template,import,include'
+]
+  .join(',')
+  .split(',');
+
+const HTML2WXML_MAP = {
+  select: 'picker',
+  datalist: 'picker',
+  img: 'image',
+  source: 'audio',
+  video: 'video',
+  track: 'video',
+  a: 'navigator',
+  span: 'label',
+  'contact-button': 'contact-button',
+  // support template [template](https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxml/template.html)
+  'wx-template': 'template'
+};
+
+const SELF_CLOSE_TAGS = [
+  'progress',
+  'checkbox',
+  'input',
+  'radio',
+  'slider',
+  'switch',
+  'textarea',
+  'navigation-bar',
+  'include',
+  'import'
+];
+
+/**
+ * combine two tags array/object
+ * @param  {Array} original original tag list
+ * @param  {Undefined/String/Array/Object} additional additional list
+ * @return {Array} new tag list Array
+ */
+const combineTag = function(original, additional) {
+  if (isArr(additional)) {
+    return original.concat(additional);
+  } else if (typeof additional === 'string') {
+    return original.concat(additional.split(','));
+  } else if (typeof additional !== 'object') {
+    return [].concat(original);
+  }
+
+  let addTags = [];
+  let removeTags = [];
+  for (let k in additional) {
+    if (addTags[k]) {
+      addTags.push(k);
+    } else {
+      removeTags.push(k);
+    }
+  }
+
+  let rst = original.concat(addTags);
+  removeTags.forEach(k => {
+    let index = rst.indexOf(k);
+    while (index !== -1) {
+      rst.splice(index, 1);
+      index = rst.indexOf(k);
+    }
+  });
+};
+
+const combineTagMap = function(original, additional = {}) {
+  return Object.assign({}, original, additional);
+};
+
+exports = module.exports = {
+  HTML_TAGS,
+  WXML_TAGS,
+  HTML2WXML_MAP,
+  SELF_CLOSE_TAGS,
+  combineTag,
+  combineTagMap
+};
diff --git a/packages/cli/core/util/ast.js b/packages/cli/core/util/ast.js
new file mode 100644
index 000000000..f42a79edc
--- /dev/null
+++ b/packages/cli/core/util/ast.js
@@ -0,0 +1,58 @@
+const acorn = require('acorn-dynamic-import').default;
+
+const ECMA_VERSION = 2017;
+
+const POSSIBLE_AST_OPTIONS = [
+  {
+    ranges: true,
+    locations: true,
+    ecmaVersion: ECMA_VERSION,
+    sourceType: 'module',
+    plugins: {
+      dynamicImport: true
+    }
+  },
+  {
+    ranges: true,
+    locations: true,
+    ecmaVersion: ECMA_VERSION,
+    sourceType: 'script',
+    plugins: {
+      dynamicImport: true
+    }
+  }
+];
+
+exports = module.exports = function ast(source) {
+  let ast;
+  const comments = [];
+  for (let i = 0, len = POSSIBLE_AST_OPTIONS.length; i < len; i++) {
+    if (!ast) {
+      try {
+        comments.length = 0;
+        POSSIBLE_AST_OPTIONS[i].onComment = comments;
+        ast = acorn.parse(source, POSSIBLE_AST_OPTIONS[i]);
+      } catch (e) {
+        // ignore the error
+      }
+    }
+  }
+
+  if (!ast) {
+    ast = acorn.parse(source, {
+      ranges: true,
+      locations: true,
+      ecmaVersion: ECMA_VERSION,
+      sourceType: 'module',
+      plugins: {
+        dynamicImport: true
+      },
+      onComment: comments
+    });
+  }
+
+  if (!ast || typeof ast !== 'object') {
+    throw new Error(`Source could't be parsed`);
+  }
+  return ast;
+};
diff --git a/packages/cli/core/util/const.js b/packages/cli/core/util/const.js
new file mode 100644
index 000000000..8b26c50bf
--- /dev/null
+++ b/packages/cli/core/util/const.js
@@ -0,0 +1,5 @@
+exports = module.exports = {
+  EVENT_DISPATCHER: '__dispatcher',
+  VENDOR_DIR: '$vendor',
+  WEAPP_EXT: '.$weapp'
+};
diff --git a/packages/cli/core/util/error.js b/packages/cli/core/util/error.js
new file mode 100644
index 000000000..fa340e214
--- /dev/null
+++ b/packages/cli/core/util/error.js
@@ -0,0 +1,24 @@
+const codeFrameColumns = require('@babel/code-frame').codeFrameColumns;
+const logger = require('./logger');
+
+exports = module.exports = {
+  warn(msg, file, codeFrame, location) {
+    logger.warn(msg);
+    logger.warn(file);
+    const result = codeFrameColumns(codeFrame, location, {
+      /* options */
+    });
+    // eslint-disable-next-line
+    console.log(result);
+  },
+  error(msg, file, codeFrame, location) {
+    logger.warn(msg);
+    logger.warn(file);
+    const result = codeFrameColumns(codeFrame, location, {
+      /* options */
+    });
+    // eslint-disable-next-line
+    console.log(result);
+    process.exit();
+  }
+};
diff --git a/packages/cli/core/util/exprParser.js b/packages/cli/core/util/exprParser.js
new file mode 100644
index 000000000..c40abc7b0
--- /dev/null
+++ b/packages/cli/core/util/exprParser.js
@@ -0,0 +1,95 @@
+const camelizeRE = /-(\w)/g;
+const hyphenateRE = /([^-])([A-Z])/g;
+
+const cached = fn => {
+  let cache = {};
+  return str => cache[str] || (cache[str] = fn(str));
+};
+
+exports = module.exports = {
+  hyphenate: cached(str => {
+    return str
+      .replace(hyphenateRE, '$1-$2')
+      .replace(hyphenateRE, '$1-$2')
+      .toLowerCase();
+  }),
+  camelize: cached(str => {
+    return str.replace(camelizeRE, function(_, c) {
+      return c ? c.toUpperCase() : '';
+    });
+  }),
+  /**
+   * str2obj   parse a object string to a real object
+   * @param  {String} str "{someKey: someCondition}"
+   * @return {Object}     {someKey: someCondition}
+   */
+  str2obj: cached(exp => {
+    exp = exp.replace(/^\s/gi, '').replace(/\s$/gi, '');
+    if (exp[0] === '{' && exp[exp.length - 1] === '}') {
+      exp = exp.substring(1, exp.length - 1);
+      let i = 0,
+        len = exp.length;
+      let flagStack = [],
+        flag = 'start';
+      let classNames = [],
+        result = {},
+        str = '';
+      for (i = 0; i < len; i++) {
+        // eslint-disable-next-line
+        if (exp[i] === '\'' || exp[i] === '"') {
+          if (flagStack.length && flagStack[0] === exp[i]) {
+            flagStack.pop();
+            if (flag === 'class') {
+              flag = ':';
+              continue;
+            } else if (flag === 'expression') {
+              str += exp[i];
+              continue;
+            }
+          } else {
+            if (flagStack.length === 0) {
+              flagStack.push(exp[i]);
+              if (flag === 'start') {
+                flag = 'class';
+                continue;
+              } else if (flag === 'expression') {
+                str += exp[i];
+                continue;
+              }
+            }
+          }
+        }
+        // {abc: num < 1} or {'abc': num <１}
+        if (exp[i] === ':' && (flag === ':' || flag === 'class') && flagStack.length === 0) {
+          flag = 'expression';
+          classNames.push(str);
+          str = '';
+          continue;
+        }
+        if (exp[i] === ',' && flag === 'expression' && flagStack.length === 0) {
+          result[classNames[classNames.length - 1]] = str.replace(/^\s/gi, '').replace(/\s$/gi, '');
+          str = '';
+          flag = 'start';
+          continue;
+        }
+        // get rid of the begining space
+        if (!str.length && exp[i] === ' ') continue;
+
+        // not started with '', like {abc: num < 1}
+        if (flag === 'start') {
+          flag = 'class';
+        }
+
+        if (flag === 'class' || flag === 'expression') {
+          str += exp[i];
+        }
+      }
+      if (str.length) {
+        result[classNames[classNames.length - 1]] = str.replace(/^\s/gi, '').replace(/\s$/gi, '');
+      }
+      return result;
+    } else {
+      throw `:class expression is not correct, it has to be {'className': mycondition}`;
+    }
+  })
+};
diff --git a/packages/cli/core/util/hash.js b/packages/cli/core/util/hash.js
new file mode 100644
index 000000000..d870b661a
--- /dev/null
+++ b/packages/cli/core/util/hash.js
@@ -0,0 +1,14 @@
+const crypto = require('crypto');
+const fs = require('fs');
+
+exports = module.exports = {
+  hash(s) {
+    let md5 = crypto.createHash('md5');
+    md5.update(s);
+    return md5.digest('hex');
+  },
+  hashFile(path) {
+    let s = fs.readFileSync(path);
+    return this.hash(s);
+  }
+};
diff --git a/packages/cli/core/util/logger.js b/packages/cli/core/util/logger.js
new file mode 100644
index 000000000..adbed3af6
--- /dev/null
+++ b/packages/cli/core/util/logger.js
@@ -0,0 +1,43 @@
+const log = require('npmlog');
+
+const mylog = {};
+
+const datetime = (date = new Date(), format = 'HH:mm:ss') => {
+  let fn = d => {
+    return ('0' + d).slice(-2);
+  };
+  if (date && typeof date === 'string') {
+    date = new Date(Date.parse(date));
+  }
+  const formats = {
+    YYYY: date.getFullYear(),
+    MM: fn(date.getMonth() + 1),
+    DD: fn(date.getDate()),
+    HH: fn(date.getHours()),
+    mm: fn(date.getMinutes()),
+    ss: fn(date.getSeconds())
+  };
+  return format.replace(/([a-z])\1+/gi, function(a) {
+    return formats[a] || a;
+  });
+};
+
+['info', 'silly', 'verbose', 'http', 'timing', 'notice', 'silent', 'warn', 'error'].forEach(v => {
+  mylog[v] = (...args) => {
+    log.heading = '[' + datetime() + ']';
+    if (args.length === 1) {
+      args = [''].concat(args);
+    }
+    if (log.level !== 'trace') {
+      args.forEach(
+        (arg, i) =>
+          typeof arg === 'object' && arg instanceof Error && arg.stack && arg.message && (args[i] = arg.message)
+      );
+    }
+    log.log.apply(log, [v].concat(args));
+  };
+});
+
+mylog.level = v => (v ? (log.level = v) : log.level);
+
+exports = module.exports = mylog;
diff --git a/packages/cli/core/util/tools.js b/packages/cli/core/util/tools.js
new file mode 100644
index 000000000..5a29f7f5b
--- /dev/null
+++ b/packages/cli/core/util/tools.js
@@ -0,0 +1,65 @@
+/**
+ * String type check
+ */
+exports.isStr = v => typeof v === 'string';
+/**
+ * Number type check
+ */
+exports.isNum = v => typeof v === 'number';
+/**
+ * Array type check
+ */
+exports.isArr = Array.isArray;
+/**
+ * undefined type check
+ */
+exports.isUndef = v => v === undefined;
+
+exports.isTrue = v => v === true;
+
+exports.isFalse = v => v === false;
+/**
+ * Function type check
+ */
+exports.isFunc = v => typeof v === 'function';
+/**
+ * Quick object check - this is primarily used to tell
+ * Objects from primitive values when we know the value
+ * is a JSON-compliant type.
+ */
+exports.isObj = exports.isObject = obj => {
+  return obj !== null && typeof obj === 'object';
+};
+
+/**
+ * Strict object type check. Only returns true
+ * for plain JavaScript objects.
+ */
+const _toString = Object.prototype.toString;
+exports.isPlainObject = obj => {
+  return _toString.call(obj) === '[object Object]';
+};
+
+/**
+ * Check whether the object has the property.
+ */
+const hasOwnProperty = Object.prototype.hasOwnProperty;
+exports.hasOwn = (obj, key) => {
+  return hasOwnProperty.call(obj, key);
+};
+
+/**
+ * Perform no operation.
+ * Stubbing args to make Flow happy without leaving useless transpiled code
+ * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/)
+ */
+// eslint-disable-next-line
+exports.noop = (a, b, c) => {};
+
+/**
+ * Check if val is a valid array index.
+ */
+exports.isValidArrayIndex = val => {
+  const n = parseFloat(String(val));
+  return n >= 0 && Math.floor(n) === n && isFinite(val);
+};
diff --git a/packages/cli/core/util/xmllint.js b/packages/cli/core/util/xmllint.js
new file mode 100644
index 000000000..01bb8c0cb
--- /dev/null
+++ b/packages/cli/core/util/xmllint.js
@@ -0,0 +1,42 @@
+const HTMLHint = require('htmlhint').default;
+
+const DEFAULT_RULES = {
+  // Component can be uppercase
+  'tagname-lowercase': false,
+  'attr-lowercase': false,
+  'attr-value-double-quotes': true,
+  'attr-value-not-empty': false,
+  'attr-no-duplication': true,
+  // no need doctype
+  'doctype-first': false,
+  'tag-pair': true,
+  'tag-self-close': false,
+  'spec-char-escape': false,
+  'id-unique': true,
+  'src-not-empty': true,
+  // do not need title
+  'title-require': false,
+  // do not need alt
+  'alt-require': false,
+  'doctype-html5': false,
+  'id-class-value': false,
+  'style-disabled': false,
+  'inline-style-disabled': false,
+  'inline-script-disabled': true,
+  'space-tab-mixed-disabled': 'space',
+  'id-class-ad-disabled': false,
+  'href-abs-or-rel': false,
+  'attr-unsafe-chars': true,
+  'head-script-disabled': true
+};
+
+exports = module.exports = {
+  verify(html, rules) {
+    if (!rules) {
+      rules = DEFAULT_RULES;
+    } else {
+      rules = Object.assign({}, DEFAULT_RULES, rules);
+    }
+    return HTMLHint.verify(html, rules);
+  }
+};
diff --git a/packages/cli/index.js b/packages/cli/index.js
new file mode 100644
index 000000000..a7a2bd6ce
--- /dev/null
+++ b/packages/cli/index.js
@@ -0,0 +1 @@
+exports = module.exports = require('./core/compile.js');
diff --git a/packages/cli/package-lock.json b/packages/cli/package-lock.json
new file mode 100644
index 000000000..7f65d0172
--- /dev/null
+++ b/packages/cli/package-lock.json
@@ -0,0 +1,4581 @@
+{
+	"name": "@wepy/cli",
+	"version": "2.1.0",
+	"lockfileVersion": 1,
+	"requires": true,
+	"dependencies": {
+		"@babel/code-frame": {
+			"version": "7.8.3",
+			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
+			"integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+			"requires": {
+				"@babel/highlight": "^7.8.3"
+			}
+		},
+		"@babel/helper-validator-identifier": {
+			"version": "7.9.5",
+			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz",
+			"integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g=="
+		},
+		"@babel/highlight": {
+			"version": "7.9.0",
+			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
+			"integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
+			"requires": {
+				"@babel/helper-validator-identifier": "^7.9.0",
+				"chalk": "^2.0.0",
+				"js-tokens": "^4.0.0"
+			}
+		},
+		"@types/color-name": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+			"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
+		},
+		"absolute": {
+			"version": "0.0.1",
+			"resolved": "https://registry.npmjs.org/absolute/-/absolute-0.0.1.tgz",
+			"integrity": "sha1-wigi+H4ck59XmIdQTZwQnEFzgp0="
+		},
+		"acorn": {
+			"version": "5.7.4",
+			"resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
+			"integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg=="
+		},
+		"acorn-dynamic-import": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz",
+			"integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==",
+			"requires": {
+				"acorn": "^5.0.0"
+			}
+		},
+		"ajv": {
+			"version": "6.12.6",
+			"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+			"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+			"requires": {
+				"fast-deep-equal": "^3.1.1",
+				"fast-json-stable-stringify": "^2.0.0",
+				"json-schema-traverse": "^0.4.1",
+				"uri-js": "^4.2.2"
+			}
+		},
+		"ansi-align": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz",
+			"integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=",
+			"requires": {
+				"string-width": "^1.0.1"
+			},
+			"dependencies": {
+				"ansi-regex": {
+					"version": "2.1.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+					"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+				},
+				"is-fullwidth-code-point": {
+					"version": "1.0.0",
+					"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+					"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+					"requires": {
+						"number-is-nan": "^1.0.0"
+					}
+				},
+				"string-width": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+					"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+					"requires": {
+						"code-point-at": "^1.0.0",
+						"is-fullwidth-code-point": "^1.0.0",
+						"strip-ansi": "^3.0.0"
+					}
+				},
+				"strip-ansi": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+					"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+					"requires": {
+						"ansi-regex": "^2.0.0"
+					}
+				}
+			}
+		},
+		"ansi-escapes": {
+			"version": "3.2.0",
+			"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+			"integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ=="
+		},
+		"ansi-red": {
+			"version": "0.1.1",
+			"resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
+			"integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
+			"requires": {
+				"ansi-wrap": "0.1.0"
+			}
+		},
+		"ansi-regex": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+			"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+		},
+		"ansi-styles": {
+			"version": "3.2.1",
+			"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+			"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+			"requires": {
+				"color-convert": "^1.9.0"
+			}
+		},
+		"ansi-wrap": {
+			"version": "0.1.0",
+			"resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+			"integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768="
+		},
+		"anymatch": {
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+			"integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+			"requires": {
+				"normalize-path": "^3.0.0",
+				"picomatch": "^2.0.4"
+			}
+		},
+		"aproba": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+			"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+		},
+		"are-we-there-yet": {
+			"version": "1.1.5",
+			"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
+			"integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+			"requires": {
+				"delegates": "^1.0.0",
+				"readable-stream": "^2.0.6"
+			}
+		},
+		"argparse": {
+			"version": "1.0.10",
+			"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+			"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+			"requires": {
+				"sprintf-js": "~1.0.2"
+			}
+		},
+		"array-differ": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
+			"integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE="
+		},
+		"array-union": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+			"integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+			"requires": {
+				"array-uniq": "^1.0.1"
+			}
+		},
+		"array-uniq": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+			"integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
+		},
+		"arrify": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+			"integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
+		},
+		"asn1": {
+			"version": "0.2.4",
+			"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+			"integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+			"requires": {
+				"safer-buffer": "~2.1.0"
+			}
+		},
+		"assert-plus": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+			"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+		},
+		"assertion-error": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+			"integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+			"dev": true
+		},
+		"async": {
+			"version": "2.6.4",
+			"resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
+			"integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
+			"requires": {
+				"lodash": "^4.17.14"
+			}
+		},
+		"asynckit": {
+			"version": "0.4.0",
+			"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+			"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+		},
+		"atob": {
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+			"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
+		},
+		"aws-sign2": {
+			"version": "0.7.0",
+			"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+			"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
+		},
+		"aws4": {
+			"version": "1.9.1",
+			"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
+			"integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug=="
+		},
+		"babel": {
+			"version": "6.23.0",
+			"resolved": "https://registry.npmjs.org/babel/-/babel-6.23.0.tgz",
+			"integrity": "sha1-0NHn2APpdHZb7qMjLU4VPA77kPQ=",
+			"dev": true
+		},
+		"babel-code-frame": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+			"integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+			"dev": true,
+			"requires": {
+				"chalk": "^1.1.3",
+				"esutils": "^2.0.2",
+				"js-tokens": "^3.0.2"
+			},
+			"dependencies": {
+				"ansi-regex": {
+					"version": "2.1.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+					"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+					"dev": true
+				},
+				"ansi-styles": {
+					"version": "2.2.1",
+					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+					"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+					"dev": true
+				},
+				"chalk": {
+					"version": "1.1.3",
+					"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+					"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+					"dev": true,
+					"requires": {
+						"ansi-styles": "^2.2.1",
+						"escape-string-regexp": "^1.0.2",
+						"has-ansi": "^2.0.0",
+						"strip-ansi": "^3.0.0",
+						"supports-color": "^2.0.0"
+					}
+				},
+				"js-tokens": {
+					"version": "3.0.2",
+					"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+					"integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+					"dev": true
+				},
+				"strip-ansi": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+					"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+					"dev": true,
+					"requires": {
+						"ansi-regex": "^2.0.0"
+					}
+				},
+				"supports-color": {
+					"version": "2.0.0",
+					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+					"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+					"dev": true
+				}
+			}
+		},
+		"babel-helper-bindify-decorators": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz",
+			"integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-builder-binary-assignment-operator-visitor": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
+			"integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+			"dev": true,
+			"requires": {
+				"babel-helper-explode-assignable-expression": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-call-delegate": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+			"integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+			"dev": true,
+			"requires": {
+				"babel-helper-hoist-variables": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-define-map": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+			"integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+			"dev": true,
+			"requires": {
+				"babel-helper-function-name": "^6.24.1",
+				"babel-runtime": "^6.26.0",
+				"babel-types": "^6.26.0",
+				"lodash": "^4.17.4"
+			}
+		},
+		"babel-helper-explode-assignable-expression": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
+			"integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-explode-class": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz",
+			"integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=",
+			"dev": true,
+			"requires": {
+				"babel-helper-bindify-decorators": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-function-name": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+			"integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+			"dev": true,
+			"requires": {
+				"babel-helper-get-function-arity": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-get-function-arity": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+			"integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-hoist-variables": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+			"integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-optimise-call-expression": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+			"integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-regex": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+			"integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.26.0",
+				"babel-types": "^6.26.0",
+				"lodash": "^4.17.4"
+			}
+		},
+		"babel-helper-remap-async-to-generator": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
+			"integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
+			"dev": true,
+			"requires": {
+				"babel-helper-function-name": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-replace-supers": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+			"integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+			"dev": true,
+			"requires": {
+				"babel-helper-optimise-call-expression": "^6.24.1",
+				"babel-messages": "^6.23.0",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-messages": {
+			"version": "6.23.0",
+			"resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+			"integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-check-es2015-constants": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+			"integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-syntax-async-functions": {
+			"version": "6.13.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+			"integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
+			"dev": true
+		},
+		"babel-plugin-syntax-async-generators": {
+			"version": "6.13.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
+			"integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=",
+			"dev": true
+		},
+		"babel-plugin-syntax-class-constructor-call": {
+			"version": "6.18.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz",
+			"integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=",
+			"dev": true
+		},
+		"babel-plugin-syntax-class-properties": {
+			"version": "6.13.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz",
+			"integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=",
+			"dev": true
+		},
+		"babel-plugin-syntax-decorators": {
+			"version": "6.13.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz",
+			"integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=",
+			"dev": true
+		},
+		"babel-plugin-syntax-dynamic-import": {
+			"version": "6.18.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
+			"integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=",
+			"dev": true
+		},
+		"babel-plugin-syntax-exponentiation-operator": {
+			"version": "6.13.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+			"integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
+			"dev": true
+		},
+		"babel-plugin-syntax-export-extensions": {
+			"version": "6.13.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz",
+			"integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=",
+			"dev": true
+		},
+		"babel-plugin-syntax-object-rest-spread": {
+			"version": "6.13.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
+			"integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
+			"dev": true
+		},
+		"babel-plugin-syntax-trailing-function-commas": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
+			"integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
+			"dev": true
+		},
+		"babel-plugin-transform-async-generator-functions": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
+			"integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
+			"dev": true,
+			"requires": {
+				"babel-helper-remap-async-to-generator": "^6.24.1",
+				"babel-plugin-syntax-async-generators": "^6.5.0",
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-async-to-generator": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
+			"integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
+			"dev": true,
+			"requires": {
+				"babel-helper-remap-async-to-generator": "^6.24.1",
+				"babel-plugin-syntax-async-functions": "^6.8.0",
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-class-constructor-call": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz",
+			"integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=",
+			"dev": true,
+			"requires": {
+				"babel-plugin-syntax-class-constructor-call": "^6.18.0",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-class-properties": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz",
+			"integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=",
+			"dev": true,
+			"requires": {
+				"babel-helper-function-name": "^6.24.1",
+				"babel-plugin-syntax-class-properties": "^6.8.0",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-decorators": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz",
+			"integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=",
+			"dev": true,
+			"requires": {
+				"babel-helper-explode-class": "^6.24.1",
+				"babel-plugin-syntax-decorators": "^6.13.0",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-arrow-functions": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+			"integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-block-scoped-functions": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+			"integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-block-scoping": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+			"integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.26.0",
+				"babel-template": "^6.26.0",
+				"babel-traverse": "^6.26.0",
+				"babel-types": "^6.26.0",
+				"lodash": "^4.17.4"
+			}
+		},
+		"babel-plugin-transform-es2015-classes": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+			"integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+			"dev": true,
+			"requires": {
+				"babel-helper-define-map": "^6.24.1",
+				"babel-helper-function-name": "^6.24.1",
+				"babel-helper-optimise-call-expression": "^6.24.1",
+				"babel-helper-replace-supers": "^6.24.1",
+				"babel-messages": "^6.23.0",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-computed-properties": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+			"integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-destructuring": {
+			"version": "6.23.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+			"integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-duplicate-keys": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+			"integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-for-of": {
+			"version": "6.23.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+			"integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-function-name": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+			"integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+			"dev": true,
+			"requires": {
+				"babel-helper-function-name": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-literals": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+			"integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-modules-amd": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+			"integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+			"dev": true,
+			"requires": {
+				"babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-modules-commonjs": {
+			"version": "6.26.2",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
+			"integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
+			"dev": true,
+			"requires": {
+				"babel-plugin-transform-strict-mode": "^6.24.1",
+				"babel-runtime": "^6.26.0",
+				"babel-template": "^6.26.0",
+				"babel-types": "^6.26.0"
+			}
+		},
+		"babel-plugin-transform-es2015-modules-systemjs": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+			"integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+			"dev": true,
+			"requires": {
+				"babel-helper-hoist-variables": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-modules-umd": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+			"integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+			"dev": true,
+			"requires": {
+				"babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-object-super": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+			"integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+			"dev": true,
+			"requires": {
+				"babel-helper-replace-supers": "^6.24.1",
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-parameters": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+			"integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+			"dev": true,
+			"requires": {
+				"babel-helper-call-delegate": "^6.24.1",
+				"babel-helper-get-function-arity": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-shorthand-properties": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+			"integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-spread": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+			"integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-sticky-regex": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+			"integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+			"dev": true,
+			"requires": {
+				"babel-helper-regex": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-template-literals": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+			"integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-typeof-symbol": {
+			"version": "6.23.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+			"integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-unicode-regex": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+			"integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+			"dev": true,
+			"requires": {
+				"babel-helper-regex": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"regexpu-core": "^2.0.0"
+			}
+		},
+		"babel-plugin-transform-exponentiation-operator": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
+			"integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+			"dev": true,
+			"requires": {
+				"babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
+				"babel-plugin-syntax-exponentiation-operator": "^6.8.0",
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-export-extensions": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz",
+			"integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=",
+			"dev": true,
+			"requires": {
+				"babel-plugin-syntax-export-extensions": "^6.8.0",
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-object-rest-spread": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
+			"integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
+			"dev": true,
+			"requires": {
+				"babel-plugin-syntax-object-rest-spread": "^6.8.0",
+				"babel-runtime": "^6.26.0"
+			}
+		},
+		"babel-plugin-transform-regenerator": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+			"integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+			"dev": true,
+			"requires": {
+				"regenerator-transform": "^0.10.0"
+			}
+		},
+		"babel-plugin-transform-strict-mode": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+			"integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-preset-es2015": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz",
+			"integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=",
+			"dev": true,
+			"requires": {
+				"babel-plugin-check-es2015-constants": "^6.22.0",
+				"babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
+				"babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
+				"babel-plugin-transform-es2015-block-scoping": "^6.24.1",
+				"babel-plugin-transform-es2015-classes": "^6.24.1",
+				"babel-plugin-transform-es2015-computed-properties": "^6.24.1",
+				"babel-plugin-transform-es2015-destructuring": "^6.22.0",
+				"babel-plugin-transform-es2015-duplicate-keys": "^6.24.1",
+				"babel-plugin-transform-es2015-for-of": "^6.22.0",
+				"babel-plugin-transform-es2015-function-name": "^6.24.1",
+				"babel-plugin-transform-es2015-literals": "^6.22.0",
+				"babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+				"babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
+				"babel-plugin-transform-es2015-modules-systemjs": "^6.24.1",
+				"babel-plugin-transform-es2015-modules-umd": "^6.24.1",
+				"babel-plugin-transform-es2015-object-super": "^6.24.1",
+				"babel-plugin-transform-es2015-parameters": "^6.24.1",
+				"babel-plugin-transform-es2015-shorthand-properties": "^6.24.1",
+				"babel-plugin-transform-es2015-spread": "^6.22.0",
+				"babel-plugin-transform-es2015-sticky-regex": "^6.24.1",
+				"babel-plugin-transform-es2015-template-literals": "^6.22.0",
+				"babel-plugin-transform-es2015-typeof-symbol": "^6.22.0",
+				"babel-plugin-transform-es2015-unicode-regex": "^6.24.1",
+				"babel-plugin-transform-regenerator": "^6.24.1"
+			}
+		},
+		"babel-preset-stage-1": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz",
+			"integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=",
+			"dev": true,
+			"requires": {
+				"babel-plugin-transform-class-constructor-call": "^6.24.1",
+				"babel-plugin-transform-export-extensions": "^6.22.0",
+				"babel-preset-stage-2": "^6.24.1"
+			}
+		},
+		"babel-preset-stage-2": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz",
+			"integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=",
+			"dev": true,
+			"requires": {
+				"babel-plugin-syntax-dynamic-import": "^6.18.0",
+				"babel-plugin-transform-class-properties": "^6.24.1",
+				"babel-plugin-transform-decorators": "^6.24.1",
+				"babel-preset-stage-3": "^6.24.1"
+			}
+		},
+		"babel-preset-stage-3": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz",
+			"integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=",
+			"dev": true,
+			"requires": {
+				"babel-plugin-syntax-trailing-function-commas": "^6.22.0",
+				"babel-plugin-transform-async-generator-functions": "^6.24.1",
+				"babel-plugin-transform-async-to-generator": "^6.24.1",
+				"babel-plugin-transform-exponentiation-operator": "^6.24.1",
+				"babel-plugin-transform-object-rest-spread": "^6.22.0"
+			}
+		},
+		"babel-runtime": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+			"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+			"dev": true,
+			"requires": {
+				"core-js": "^2.4.0",
+				"regenerator-runtime": "^0.11.0"
+			}
+		},
+		"babel-template": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+			"integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.26.0",
+				"babel-traverse": "^6.26.0",
+				"babel-types": "^6.26.0",
+				"babylon": "^6.18.0",
+				"lodash": "^4.17.4"
+			}
+		},
+		"babel-traverse": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+			"integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+			"dev": true,
+			"requires": {
+				"babel-code-frame": "^6.26.0",
+				"babel-messages": "^6.23.0",
+				"babel-runtime": "^6.26.0",
+				"babel-types": "^6.26.0",
+				"babylon": "^6.18.0",
+				"debug": "^2.6.8",
+				"globals": "^9.18.0",
+				"invariant": "^2.2.2",
+				"lodash": "^4.17.4"
+			}
+		},
+		"babel-types": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+			"integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.26.0",
+				"esutils": "^2.0.2",
+				"lodash": "^4.17.4",
+				"to-fast-properties": "^1.0.3"
+			}
+		},
+		"babylon": {
+			"version": "6.18.0",
+			"resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+			"integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+			"dev": true
+		},
+		"balanced-match": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+			"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+		},
+		"base64-js": {
+			"version": "1.3.1",
+			"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
+			"integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
+		},
+		"bcrypt-pbkdf": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+			"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+			"requires": {
+				"tweetnacl": "^0.14.3"
+			}
+		},
+		"big.js": {
+			"version": "5.2.2",
+			"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+			"integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
+		},
+		"binary-extensions": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
+			"integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow=="
+		},
+		"bl": {
+			"version": "1.2.3",
+			"resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz",
+			"integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==",
+			"requires": {
+				"readable-stream": "^2.3.5",
+				"safe-buffer": "^5.1.1"
+			}
+		},
+		"bluebird": {
+			"version": "3.7.2",
+			"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+			"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+		},
+		"boxen": {
+			"version": "0.6.0",
+			"resolved": "https://registry.npmjs.org/boxen/-/boxen-0.6.0.tgz",
+			"integrity": "sha1-g2TUJIrDT/DvGy8r9JpsYM4NgbY=",
+			"requires": {
+				"ansi-align": "^1.1.0",
+				"camelcase": "^2.1.0",
+				"chalk": "^1.1.1",
+				"cli-boxes": "^1.0.0",
+				"filled-array": "^1.0.0",
+				"object-assign": "^4.0.1",
+				"repeating": "^2.0.0",
+				"string-width": "^1.0.1",
+				"widest-line": "^1.0.0"
+			},
+			"dependencies": {
+				"ansi-regex": {
+					"version": "2.1.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+					"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+				},
+				"ansi-styles": {
+					"version": "2.2.1",
+					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+					"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+				},
+				"camelcase": {
+					"version": "2.1.1",
+					"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+					"integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8="
+				},
+				"chalk": {
+					"version": "1.1.3",
+					"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+					"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+					"requires": {
+						"ansi-styles": "^2.2.1",
+						"escape-string-regexp": "^1.0.2",
+						"has-ansi": "^2.0.0",
+						"strip-ansi": "^3.0.0",
+						"supports-color": "^2.0.0"
+					}
+				},
+				"is-fullwidth-code-point": {
+					"version": "1.0.0",
+					"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+					"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+					"requires": {
+						"number-is-nan": "^1.0.0"
+					}
+				},
+				"string-width": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+					"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+					"requires": {
+						"code-point-at": "^1.0.0",
+						"is-fullwidth-code-point": "^1.0.0",
+						"strip-ansi": "^3.0.0"
+					}
+				},
+				"strip-ansi": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+					"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+					"requires": {
+						"ansi-regex": "^2.0.0"
+					}
+				},
+				"supports-color": {
+					"version": "2.0.0",
+					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+					"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+				}
+			}
+		},
+		"brace-expansion": {
+			"version": "1.1.11",
+			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+			"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+			"requires": {
+				"balanced-match": "^1.0.0",
+				"concat-map": "0.0.1"
+			}
+		},
+		"braces": {
+			"version": "3.0.2",
+			"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+			"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+			"requires": {
+				"fill-range": "^7.0.1"
+			}
+		},
+		"breakword": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/breakword/-/breakword-1.0.5.tgz",
+			"integrity": "sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==",
+			"requires": {
+				"wcwidth": "^1.0.1"
+			}
+		},
+		"buffer": {
+			"version": "5.5.0",
+			"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz",
+			"integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==",
+			"requires": {
+				"base64-js": "^1.0.2",
+				"ieee754": "^1.1.4"
+			}
+		},
+		"buffer-alloc": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
+			"integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+			"requires": {
+				"buffer-alloc-unsafe": "^1.1.0",
+				"buffer-fill": "^1.0.0"
+			}
+		},
+		"buffer-alloc-unsafe": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
+			"integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
+		},
+		"buffer-crc32": {
+			"version": "0.2.13",
+			"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+			"integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
+		},
+		"buffer-fill": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
+			"integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
+		},
+		"builtins": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
+			"integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og="
+		},
+		"camelcase": {
+			"version": "5.3.1",
+			"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+			"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+		},
+		"capture-stack-trace": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz",
+			"integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw=="
+		},
+		"caseless": {
+			"version": "0.12.0",
+			"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+			"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+		},
+		"caw": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz",
+			"integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==",
+			"requires": {
+				"get-proxy": "^2.0.0",
+				"isurl": "^1.0.0-alpha5",
+				"tunnel-agent": "^0.6.0",
+				"url-to-options": "^1.0.1"
+			}
+		},
+		"chai": {
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
+			"integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
+			"dev": true,
+			"requires": {
+				"assertion-error": "^1.1.0",
+				"check-error": "^1.0.2",
+				"deep-eql": "^3.0.1",
+				"get-func-name": "^2.0.0",
+				"pathval": "^1.1.0",
+				"type-detect": "^4.0.5"
+			}
+		},
+		"chalk": {
+			"version": "2.4.2",
+			"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+			"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+			"requires": {
+				"ansi-styles": "^3.2.1",
+				"escape-string-regexp": "^1.0.5",
+				"supports-color": "^5.3.0"
+			}
+		},
+		"chardet": {
+			"version": "0.4.2",
+			"resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+			"integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I="
+		},
+		"check-error": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+			"integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+			"dev": true
+		},
+		"chokidar": {
+			"version": "3.3.1",
+			"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz",
+			"integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==",
+			"requires": {
+				"anymatch": "~3.1.1",
+				"braces": "~3.0.2",
+				"fsevents": "~2.1.2",
+				"glob-parent": "~5.1.0",
+				"is-binary-path": "~2.1.0",
+				"is-glob": "~4.0.1",
+				"normalize-path": "~3.0.0",
+				"readdirp": "~3.3.0"
+			}
+		},
+		"cli": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz",
+			"integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=",
+			"optional": true,
+			"requires": {
+				"exit": "0.1.2",
+				"glob": "^7.1.1"
+			}
+		},
+		"cli-boxes": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+			"integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM="
+		},
+		"cli-cursor": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+			"integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+			"requires": {
+				"restore-cursor": "^2.0.0"
+			}
+		},
+		"cli-spinners": {
+			"version": "1.3.1",
+			"resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz",
+			"integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg=="
+		},
+		"cli-width": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+			"integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
+		},
+		"cliui": {
+			"version": "6.0.0",
+			"resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+			"integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+			"requires": {
+				"string-width": "^4.2.0",
+				"strip-ansi": "^6.0.0",
+				"wrap-ansi": "^6.2.0"
+			},
+			"dependencies": {
+				"ansi-regex": {
+					"version": "5.0.0",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+					"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+				},
+				"is-fullwidth-code-point": {
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+					"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+				},
+				"string-width": {
+					"version": "4.2.0",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+					"integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+					"requires": {
+						"emoji-regex": "^8.0.0",
+						"is-fullwidth-code-point": "^3.0.0",
+						"strip-ansi": "^6.0.0"
+					}
+				},
+				"strip-ansi": {
+					"version": "6.0.0",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+					"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+					"requires": {
+						"ansi-regex": "^5.0.0"
+					}
+				}
+			}
+		},
+		"clone": {
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+			"integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+			"optional": true
+		},
+		"co": {
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz",
+			"integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g="
+		},
+		"co-from-stream": {
+			"version": "0.0.0",
+			"resolved": "https://registry.npmjs.org/co-from-stream/-/co-from-stream-0.0.0.tgz",
+			"integrity": "sha1-GlzYztdyY5RglPo58kmaYyl7yvk=",
+			"requires": {
+				"co-read": "0.0.1"
+			}
+		},
+		"co-fs-extra": {
+			"version": "1.2.1",
+			"resolved": "https://registry.npmjs.org/co-fs-extra/-/co-fs-extra-1.2.1.tgz",
+			"integrity": "sha1-O2rXfPJhRTD2d7HPYmZPW6dWtyI=",
+			"requires": {
+				"co-from-stream": "~0.0.0",
+				"fs-extra": "~0.26.5",
+				"thunkify-wrap": "~1.0.4"
+			},
+			"dependencies": {
+				"fs-extra": {
+					"version": "0.26.7",
+					"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz",
+					"integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=",
+					"requires": {
+						"graceful-fs": "^4.1.2",
+						"jsonfile": "^2.1.0",
+						"klaw": "^1.0.0",
+						"path-is-absolute": "^1.0.0",
+						"rimraf": "^2.2.8"
+					}
+				},
+				"jsonfile": {
+					"version": "2.4.0",
+					"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
+					"integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
+					"requires": {
+						"graceful-fs": "^4.1.6"
+					}
+				}
+			}
+		},
+		"co-read": {
+			"version": "0.0.1",
+			"resolved": "https://registry.npmjs.org/co-read/-/co-read-0.0.1.tgz",
+			"integrity": "sha1-+Bs+uKhmdf7FHj2IOn9WToc8k4k="
+		},
+		"code-point-at": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+			"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
+		},
+		"coffee-script": {
+			"version": "1.12.7",
+			"resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz",
+			"integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw=="
+		},
+		"color-convert": {
+			"version": "1.9.3",
+			"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+			"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+			"requires": {
+				"color-name": "1.1.3"
+			}
+		},
+		"color-name": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+			"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+		},
+		"colors": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+			"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="
+		},
+		"combined-stream": {
+			"version": "1.0.8",
+			"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+			"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+			"requires": {
+				"delayed-stream": "~1.0.0"
+			}
+		},
+		"commander": {
+			"version": "2.20.3",
+			"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+			"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+		},
+		"compare-versions": {
+			"version": "3.6.0",
+			"resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
+			"integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA=="
+		},
+		"concat-map": {
+			"version": "0.0.1",
+			"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+			"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+		},
+		"config-chain": {
+			"version": "1.1.12",
+			"resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz",
+			"integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==",
+			"requires": {
+				"ini": "^1.3.4",
+				"proto-list": "~1.2.1"
+			}
+		},
+		"configstore": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz",
+			"integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=",
+			"requires": {
+				"dot-prop": "^3.0.0",
+				"graceful-fs": "^4.1.2",
+				"mkdirp": "^0.5.0",
+				"object-assign": "^4.0.1",
+				"os-tmpdir": "^1.0.0",
+				"osenv": "^0.1.0",
+				"uuid": "^2.0.1",
+				"write-file-atomic": "^1.1.2",
+				"xdg-basedir": "^2.0.0"
+			},
+			"dependencies": {
+				"uuid": {
+					"version": "2.0.3",
+					"resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
+					"integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho="
+				}
+			}
+		},
+		"console-browserify": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
+			"integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+			"optional": true,
+			"requires": {
+				"date-now": "^0.1.4"
+			}
+		},
+		"console-control-strings": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+			"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
+		},
+		"consolidate": {
+			"version": "0.15.1",
+			"resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz",
+			"integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==",
+			"requires": {
+				"bluebird": "^3.1.1"
+			}
+		},
+		"content-disposition": {
+			"version": "0.5.3",
+			"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+			"integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+			"requires": {
+				"safe-buffer": "5.1.2"
+			},
+			"dependencies": {
+				"safe-buffer": {
+					"version": "5.1.2",
+					"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+					"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+				}
+			}
+		},
+		"core-js": {
+			"version": "2.6.11",
+			"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
+			"integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
+			"dev": true
+		},
+		"core-util-is": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+			"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+		},
+		"create-error-class": {
+			"version": "3.0.2",
+			"resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+			"integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+			"requires": {
+				"capture-stack-trace": "^1.0.0"
+			}
+		},
+		"css": {
+			"version": "2.2.4",
+			"resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz",
+			"integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==",
+			"requires": {
+				"inherits": "^2.0.3",
+				"source-map": "^0.6.1",
+				"source-map-resolve": "^0.5.2",
+				"urix": "^0.1.0"
+			}
+		},
+		"csslint": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/csslint/-/csslint-1.0.5.tgz",
+			"integrity": "sha1-Gcw+2jIhYP0/cjKvHLKjYOiYouk=",
+			"optional": true,
+			"requires": {
+				"clone": "~2.1.0",
+				"parserlib": "~1.1.1"
+			}
+		},
+		"csv": {
+			"version": "5.3.2",
+			"resolved": "https://registry.npmjs.org/csv/-/csv-5.3.2.tgz",
+			"integrity": "sha512-odDyucr9OgJTdGM2wrMbJXbOkJx3nnUX3Pt8SFOwlAMOpsUQlz1dywvLMXJWX/4Ib0rjfOsaawuuwfI5ucqBGQ==",
+			"requires": {
+				"csv-generate": "^3.2.4",
+				"csv-parse": "^4.8.8",
+				"csv-stringify": "^5.3.6",
+				"stream-transform": "^2.0.1"
+			}
+		},
+		"csv-generate": {
+			"version": "3.2.4",
+			"resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-3.2.4.tgz",
+			"integrity": "sha512-qNM9eqlxd53TWJeGtY1IQPj90b563Zx49eZs8e0uMyEvPgvNVmX1uZDtdzAcflB3PniuH9creAzcFOdyJ9YGvA=="
+		},
+		"csv-parse": {
+			"version": "4.8.8",
+			"resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.8.8.tgz",
+			"integrity": "sha512-Kv3Ilz2GV58dOoHBXRCTF8ijxlLjl80bG3d67XPI6DNqffb3AnbPbKr/WvCUMJq5V0AZYi6sukOaOQAVpfuVbg=="
+		},
+		"csv-stringify": {
+			"version": "5.3.6",
+			"resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.3.6.tgz",
+			"integrity": "sha512-kPcRbMvo5NLLD71TAqW5K+g9kbM2HpIZJLAzm73Du8U+5TXmDp9YtXKCBLyxEh0q3Jbg8QhNFBz3b5VJzjZ/jw=="
+		},
+		"dashdash": {
+			"version": "1.14.1",
+			"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+			"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+			"requires": {
+				"assert-plus": "^1.0.0"
+			}
+		},
+		"date-now": {
+			"version": "0.1.4",
+			"resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
+			"integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
+			"optional": true
+		},
+		"de-indent": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
+			"integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0="
+		},
+		"debug": {
+			"version": "2.6.9",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+			"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+			"dev": true,
+			"requires": {
+				"ms": "2.0.0"
+			}
+		},
+		"decamelize": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+			"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+		},
+		"decode-uri-component": {
+			"version": "0.2.0",
+			"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+			"integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+		},
+		"decompress": {
+			"version": "4.2.1",
+			"resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz",
+			"integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==",
+			"requires": {
+				"decompress-tar": "^4.0.0",
+				"decompress-tarbz2": "^4.0.0",
+				"decompress-targz": "^4.0.0",
+				"decompress-unzip": "^4.0.1",
+				"graceful-fs": "^4.1.10",
+				"make-dir": "^1.0.0",
+				"pify": "^2.3.0",
+				"strip-dirs": "^2.0.0"
+			},
+			"dependencies": {
+				"pify": {
+					"version": "2.3.0",
+					"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+					"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+				}
+			}
+		},
+		"decompress-response": {
+			"version": "3.3.0",
+			"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+			"integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+			"requires": {
+				"mimic-response": "^1.0.0"
+			}
+		},
+		"decompress-tar": {
+			"version": "4.1.1",
+			"resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz",
+			"integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==",
+			"requires": {
+				"file-type": "^5.2.0",
+				"is-stream": "^1.1.0",
+				"tar-stream": "^1.5.2"
+			}
+		},
+		"decompress-tarbz2": {
+			"version": "4.1.1",
+			"resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz",
+			"integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==",
+			"requires": {
+				"decompress-tar": "^4.1.0",
+				"file-type": "^6.1.0",
+				"is-stream": "^1.1.0",
+				"seek-bzip": "^1.0.5",
+				"unbzip2-stream": "^1.0.9"
+			},
+			"dependencies": {
+				"file-type": {
+					"version": "6.2.0",
+					"resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz",
+					"integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg=="
+				}
+			}
+		},
+		"decompress-targz": {
+			"version": "4.1.1",
+			"resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz",
+			"integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==",
+			"requires": {
+				"decompress-tar": "^4.1.1",
+				"file-type": "^5.2.0",
+				"is-stream": "^1.1.0"
+			}
+		},
+		"decompress-unzip": {
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz",
+			"integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=",
+			"requires": {
+				"file-type": "^3.8.0",
+				"get-stream": "^2.2.0",
+				"pify": "^2.3.0",
+				"yauzl": "^2.4.2"
+			},
+			"dependencies": {
+				"file-type": {
+					"version": "3.9.0",
+					"resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
+					"integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek="
+				},
+				"get-stream": {
+					"version": "2.3.1",
+					"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
+					"integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=",
+					"requires": {
+						"object-assign": "^4.0.1",
+						"pinkie-promise": "^2.0.0"
+					}
+				},
+				"pify": {
+					"version": "2.3.0",
+					"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+					"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+				}
+			}
+		},
+		"deep-eql": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+			"integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+			"dev": true,
+			"requires": {
+				"type-detect": "^4.0.0"
+			}
+		},
+		"deep-extend": {
+			"version": "0.6.0",
+			"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+			"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
+		},
+		"defaults": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+			"integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+			"requires": {
+				"clone": "^1.0.2"
+			},
+			"dependencies": {
+				"clone": {
+					"version": "1.0.4",
+					"resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+					"integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
+				}
+			}
+		},
+		"delayed-stream": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+			"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+		},
+		"delegates": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+			"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
+		},
+		"dom-serializer": {
+			"version": "0.2.2",
+			"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+			"integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+			"requires": {
+				"domelementtype": "^2.0.1",
+				"entities": "^2.0.0"
+			},
+			"dependencies": {
+				"domelementtype": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
+					"integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ=="
+				},
+				"entities": {
+					"version": "2.0.0",
+					"resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz",
+					"integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw=="
+				}
+			}
+		},
+		"domelementtype": {
+			"version": "1.3.1",
+			"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+			"integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+		},
+		"domhandler": {
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
+			"integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
+			"requires": {
+				"domelementtype": "1"
+			}
+		},
+		"domutils": {
+			"version": "1.5.1",
+			"resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+			"integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+			"requires": {
+				"dom-serializer": "0",
+				"domelementtype": "1"
+			}
+		},
+		"dot-prop": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz",
+			"integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=",
+			"requires": {
+				"is-obj": "^1.0.0"
+			}
+		},
+		"download": {
+			"version": "6.2.5",
+			"resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz",
+			"integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==",
+			"requires": {
+				"caw": "^2.0.0",
+				"content-disposition": "^0.5.2",
+				"decompress": "^4.0.0",
+				"ext-name": "^5.0.0",
+				"file-type": "5.2.0",
+				"filenamify": "^2.0.0",
+				"get-stream": "^3.0.0",
+				"got": "^7.0.0",
+				"make-dir": "^1.0.0",
+				"p-event": "^1.0.0",
+				"pify": "^3.0.0"
+			}
+		},
+		"download-git-repo": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/download-git-repo/-/download-git-repo-1.1.0.tgz",
+			"integrity": "sha512-yXcCvhkPKmq5M2cQXss6Qbig+LZnzRIT40XCYm/QCRnJaPG867StB1qnsBLxOGrPH1YEIRWW2gJq7LLMyw+NmA==",
+			"requires": {
+				"download": "^5.0.3",
+				"git-clone": "^0.1.0",
+				"rimraf": "^2.6.1"
+			},
+			"dependencies": {
+				"download": {
+					"version": "5.0.3",
+					"resolved": "https://registry.npmjs.org/download/-/download-5.0.3.tgz",
+					"integrity": "sha1-Y1N/l3+ZJmow64oqL70fILgAD3o=",
+					"requires": {
+						"caw": "^2.0.0",
+						"decompress": "^4.0.0",
+						"filenamify": "^2.0.0",
+						"get-stream": "^3.0.0",
+						"got": "^6.3.0",
+						"mkdirp": "^0.5.1",
+						"pify": "^2.3.0"
+					}
+				},
+				"got": {
+					"version": "6.7.1",
+					"resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+					"integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+					"requires": {
+						"create-error-class": "^3.0.0",
+						"duplexer3": "^0.1.4",
+						"get-stream": "^3.0.0",
+						"is-redirect": "^1.0.0",
+						"is-retry-allowed": "^1.0.0",
+						"is-stream": "^1.0.0",
+						"lowercase-keys": "^1.0.0",
+						"safe-buffer": "^5.0.1",
+						"timed-out": "^4.0.0",
+						"unzip-response": "^2.0.1",
+						"url-parse-lax": "^1.0.0"
+					}
+				},
+				"pify": {
+					"version": "2.3.0",
+					"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+					"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+				}
+			}
+		},
+		"duplexer2": {
+			"version": "0.1.4",
+			"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+			"integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+			"requires": {
+				"readable-stream": "^2.0.2"
+			}
+		},
+		"duplexer3": {
+			"version": "0.1.4",
+			"resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+			"integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
+		},
+		"ecc-jsbn": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+			"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+			"requires": {
+				"jsbn": "~0.1.0",
+				"safer-buffer": "^2.1.0"
+			}
+		},
+		"emoji-regex": {
+			"version": "8.0.0",
+			"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+			"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+		},
+		"emojis-list": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+			"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
+		},
+		"enable": {
+			"version": "1.3.2",
+			"resolved": "https://registry.npmjs.org/enable/-/enable-1.3.2.tgz",
+			"integrity": "sha1-nrpoN9FtCYK1n4fYib91REPVKTE="
+		},
+		"end-of-stream": {
+			"version": "1.4.4",
+			"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+			"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+			"requires": {
+				"once": "^1.4.0"
+			}
+		},
+		"enhanced-resolve": {
+			"version": "4.1.1",
+			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz",
+			"integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==",
+			"requires": {
+				"graceful-fs": "^4.1.2",
+				"memory-fs": "^0.5.0",
+				"tapable": "^1.0.0"
+			}
+		},
+		"entities": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
+			"integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=",
+			"optional": true
+		},
+		"errno": {
+			"version": "0.1.7",
+			"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+			"integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+			"requires": {
+				"prr": "~1.0.1"
+			}
+		},
+		"error-ex": {
+			"version": "1.3.2",
+			"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+			"integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+			"requires": {
+				"is-arrayish": "^0.2.1"
+			}
+		},
+		"escape-string-regexp": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+			"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+		},
+		"esprima": {
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+			"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+		},
+		"esutils": {
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+			"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+			"dev": true
+		},
+		"exit": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+			"integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+			"optional": true
+		},
+		"ext-list": {
+			"version": "2.2.2",
+			"resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz",
+			"integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==",
+			"requires": {
+				"mime-db": "^1.28.0"
+			}
+		},
+		"ext-name": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz",
+			"integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==",
+			"requires": {
+				"ext-list": "^2.0.0",
+				"sort-keys-length": "^1.0.0"
+			}
+		},
+		"extend": {
+			"version": "3.0.2",
+			"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+			"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+		},
+		"extend-shallow": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+			"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+			"requires": {
+				"is-extendable": "^0.1.0"
+			}
+		},
+		"external-editor": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
+			"integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
+			"requires": {
+				"chardet": "^0.4.0",
+				"iconv-lite": "^0.4.17",
+				"tmp": "^0.0.33"
+			}
+		},
+		"extsprintf": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+			"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+		},
+		"fast-deep-equal": {
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
+			"integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA=="
+		},
+		"fast-json-stable-stringify": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+			"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+		},
+		"fd-slicer": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+			"integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
+			"requires": {
+				"pend": "~1.2.0"
+			}
+		},
+		"figures": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+			"integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+			"requires": {
+				"escape-string-regexp": "^1.0.5"
+			}
+		},
+		"file-type": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
+			"integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY="
+		},
+		"filename-reserved-regex": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
+			"integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik="
+		},
+		"filenamify": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz",
+			"integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==",
+			"requires": {
+				"filename-reserved-regex": "^2.0.0",
+				"strip-outer": "^1.0.0",
+				"trim-repeated": "^1.0.0"
+			}
+		},
+		"fill-range": {
+			"version": "7.0.1",
+			"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+			"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+			"requires": {
+				"to-regex-range": "^5.0.1"
+			}
+		},
+		"filled-array": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/filled-array/-/filled-array-1.1.0.tgz",
+			"integrity": "sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q="
+		},
+		"find-up": {
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+			"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+			"requires": {
+				"locate-path": "^5.0.0",
+				"path-exists": "^4.0.0"
+			}
+		},
+		"flatten": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz",
+			"integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg=="
+		},
+		"forever-agent": {
+			"version": "0.6.1",
+			"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+			"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+		},
+		"form-data": {
+			"version": "2.3.3",
+			"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+			"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+			"requires": {
+				"asynckit": "^0.4.0",
+				"combined-stream": "^1.0.6",
+				"mime-types": "^2.1.12"
+			}
+		},
+		"fs-constants": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+			"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
+		},
+		"fs-extra": {
+			"version": "8.1.0",
+			"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+			"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+			"requires": {
+				"graceful-fs": "^4.2.0",
+				"jsonfile": "^4.0.0",
+				"universalify": "^0.1.0"
+			}
+		},
+		"fs.realpath": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+			"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+		},
+		"fsevents": {
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
+			"integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
+			"optional": true
+		},
+		"gauge": {
+			"version": "2.7.4",
+			"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+			"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+			"requires": {
+				"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"
+			},
+			"dependencies": {
+				"ansi-regex": {
+					"version": "2.1.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+					"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+				},
+				"is-fullwidth-code-point": {
+					"version": "1.0.0",
+					"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+					"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+					"requires": {
+						"number-is-nan": "^1.0.0"
+					}
+				},
+				"string-width": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+					"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+					"requires": {
+						"code-point-at": "^1.0.0",
+						"is-fullwidth-code-point": "^1.0.0",
+						"strip-ansi": "^3.0.0"
+					}
+				},
+				"strip-ansi": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+					"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+					"requires": {
+						"ansi-regex": "^2.0.0"
+					}
+				}
+			}
+		},
+		"get-caller-file": {
+			"version": "2.0.5",
+			"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+			"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+		},
+		"get-func-name": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+			"integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+			"dev": true
+		},
+		"get-proxy": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz",
+			"integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==",
+			"requires": {
+				"npm-conf": "^1.1.0"
+			}
+		},
+		"get-stream": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+			"integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
+		},
+		"getpass": {
+			"version": "0.1.7",
+			"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+			"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+			"requires": {
+				"assert-plus": "^1.0.0"
+			}
+		},
+		"git-clone": {
+			"version": "0.1.0",
+			"resolved": "https://registry.npmjs.org/git-clone/-/git-clone-0.1.0.tgz",
+			"integrity": "sha1-DXYWN3gJOu9/HDAjjyqe8/B6Lrk="
+		},
+		"glob": {
+			"version": "7.1.6",
+			"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+			"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+			"requires": {
+				"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"
+			}
+		},
+		"glob-base": {
+			"version": "0.3.0",
+			"resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+			"integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+			"requires": {
+				"glob-parent": "^2.0.0",
+				"is-glob": "^2.0.0"
+			},
+			"dependencies": {
+				"glob-parent": {
+					"version": "2.0.0",
+					"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+					"integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+					"requires": {
+						"is-glob": "^2.0.0"
+					}
+				},
+				"is-extglob": {
+					"version": "1.0.0",
+					"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+					"integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
+				},
+				"is-glob": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+					"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+					"requires": {
+						"is-extglob": "^1.0.0"
+					}
+				}
+			}
+		},
+		"glob-parent": {
+			"version": "5.1.1",
+			"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+			"integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+			"requires": {
+				"is-glob": "^4.0.1"
+			}
+		},
+		"globals": {
+			"version": "9.18.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+			"integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+			"dev": true
+		},
+		"got": {
+			"version": "7.1.0",
+			"resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz",
+			"integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==",
+			"requires": {
+				"decompress-response": "^3.2.0",
+				"duplexer3": "^0.1.4",
+				"get-stream": "^3.0.0",
+				"is-plain-obj": "^1.1.0",
+				"is-retry-allowed": "^1.0.0",
+				"is-stream": "^1.0.0",
+				"isurl": "^1.0.0-alpha5",
+				"lowercase-keys": "^1.0.0",
+				"p-cancelable": "^0.3.0",
+				"p-timeout": "^1.1.1",
+				"safe-buffer": "^5.0.1",
+				"timed-out": "^4.0.0",
+				"url-parse-lax": "^1.0.0",
+				"url-to-options": "^1.0.1"
+			}
+		},
+		"graceful-fs": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
+			"integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
+		},
+		"graceful-readlink": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+			"integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
+		},
+		"grapheme-splitter": {
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+			"integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ=="
+		},
+		"gray-matter": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz",
+			"integrity": "sha1-MELZrewqHe1qdwep7SOA+KF6Qw4=",
+			"requires": {
+				"ansi-red": "^0.1.1",
+				"coffee-script": "^1.12.4",
+				"extend-shallow": "^2.0.1",
+				"js-yaml": "^3.8.1",
+				"toml": "^2.3.2"
+			}
+		},
+		"handlebars": {
+			"version": "4.7.7",
+			"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
+			"integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
+			"requires": {
+				"minimist": "^1.2.5",
+				"neo-async": "^2.6.0",
+				"source-map": "^0.6.1",
+				"uglify-js": "^3.1.4",
+				"wordwrap": "^1.0.0"
+			}
+		},
+		"har-schema": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+			"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
+		},
+		"har-validator": {
+			"version": "5.1.3",
+			"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+			"integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+			"requires": {
+				"ajv": "^6.5.5",
+				"har-schema": "^2.0.0"
+			}
+		},
+		"has-ansi": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+			"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+			"requires": {
+				"ansi-regex": "^2.0.0"
+			},
+			"dependencies": {
+				"ansi-regex": {
+					"version": "2.1.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+					"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+				}
+			}
+		},
+		"has-flag": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+			"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+		},
+		"has-generators": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/has-generators/-/has-generators-1.0.1.tgz",
+			"integrity": "sha1-pqLlVIYBGUBILhPiyTeRxEms9Ek="
+		},
+		"has-symbol-support-x": {
+			"version": "1.4.2",
+			"resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
+			"integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw=="
+		},
+		"has-to-string-tag-x": {
+			"version": "1.4.1",
+			"resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz",
+			"integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==",
+			"requires": {
+				"has-symbol-support-x": "^1.4.1"
+			}
+		},
+		"has-unicode": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+			"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
+		},
+		"hash-sum": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
+			"integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ="
+		},
+		"he": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+			"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
+		},
+		"htmlhint": {
+			"version": "0.11.0",
+			"resolved": "https://registry.npmjs.org/htmlhint/-/htmlhint-0.11.0.tgz",
+			"integrity": "sha512-uXuRyVhQa0HlNmZg5LJ1BRJvRq5f7IJL/34tItHhZr9re15pwaqAuLUAIcqtwd1bLUCE++7HVPtR+NSReFW0iA==",
+			"requires": {
+				"async": "2.6.1",
+				"colors": "1.3.2",
+				"commander": "2.17.1",
+				"csslint": "^1.0.5",
+				"glob": "7.1.3",
+				"jshint": "^2.9.6",
+				"parse-glob": "3.0.4",
+				"path-parse": "1.0.6",
+				"request": "2.88.0",
+				"strip-json-comments": "2.0.1",
+				"xml": "1.0.1"
+			},
+			"dependencies": {
+				"async": {
+					"version": "2.6.1",
+					"resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
+					"integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
+					"requires": {
+						"lodash": "^4.17.10"
+					}
+				},
+				"colors": {
+					"version": "1.3.2",
+					"resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz",
+					"integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ=="
+				},
+				"commander": {
+					"version": "2.17.1",
+					"resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
+					"integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
+				},
+				"glob": {
+					"version": "7.1.3",
+					"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+					"integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+					"requires": {
+						"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"
+					}
+				},
+				"request": {
+					"version": "2.88.0",
+					"resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+					"integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+					"requires": {
+						"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"
+					}
+				}
+			}
+		},
+		"htmlparser2": {
+			"version": "3.10.1",
+			"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
+			"integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+			"requires": {
+				"domelementtype": "^1.3.1",
+				"domhandler": "^2.3.0",
+				"domutils": "^1.5.1",
+				"entities": "^1.1.1",
+				"inherits": "^2.0.1",
+				"readable-stream": "^3.1.1"
+			},
+			"dependencies": {
+				"entities": {
+					"version": "1.1.2",
+					"resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+					"integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
+				},
+				"readable-stream": {
+					"version": "3.6.0",
+					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+					"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+					"requires": {
+						"inherits": "^2.0.3",
+						"string_decoder": "^1.1.1",
+						"util-deprecate": "^1.0.1"
+					}
+				}
+			}
+		},
+		"http-signature": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+			"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+			"requires": {
+				"assert-plus": "^1.0.0",
+				"jsprim": "^1.2.2",
+				"sshpk": "^1.7.0"
+			}
+		},
+		"iconv-lite": {
+			"version": "0.4.24",
+			"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+			"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+			"requires": {
+				"safer-buffer": ">= 2.1.2 < 3"
+			}
+		},
+		"ieee754": {
+			"version": "1.1.13",
+			"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
+			"integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
+		},
+		"ignore": {
+			"version": "3.3.10",
+			"resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+			"integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug=="
+		},
+		"imurmurhash": {
+			"version": "0.1.4",
+			"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+			"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+		},
+		"indexes-of": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+			"integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
+		},
+		"inflight": {
+			"version": "1.0.6",
+			"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+			"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+			"requires": {
+				"once": "^1.3.0",
+				"wrappy": "1"
+			}
+		},
+		"inherits": {
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+			"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+		},
+		"ini": {
+			"version": "1.3.7",
+			"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz",
+			"integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ=="
+		},
+		"inquirer": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz",
+			"integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==",
+			"requires": {
+				"ansi-escapes": "^3.0.0",
+				"chalk": "^2.0.0",
+				"cli-cursor": "^2.1.0",
+				"cli-width": "^2.0.0",
+				"external-editor": "^2.1.0",
+				"figures": "^2.0.0",
+				"lodash": "^4.3.0",
+				"mute-stream": "0.0.7",
+				"run-async": "^2.2.0",
+				"rxjs": "^5.5.2",
+				"string-width": "^2.1.0",
+				"strip-ansi": "^4.0.0",
+				"through": "^2.3.6"
+			}
+		},
+		"invariant": {
+			"version": "2.2.4",
+			"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+			"integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+			"dev": true,
+			"requires": {
+				"loose-envify": "^1.0.0"
+			}
+		},
+		"is": {
+			"version": "3.3.0",
+			"resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz",
+			"integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg=="
+		},
+		"is-arrayish": {
+			"version": "0.2.1",
+			"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+			"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+		},
+		"is-binary-path": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+			"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+			"requires": {
+				"binary-extensions": "^2.0.0"
+			}
+		},
+		"is-dotfile": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+			"integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE="
+		},
+		"is-extendable": {
+			"version": "0.1.1",
+			"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+			"integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+		},
+		"is-extglob": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+			"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+		},
+		"is-finite": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
+			"integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w=="
+		},
+		"is-fullwidth-code-point": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+			"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+		},
+		"is-glob": {
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+			"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+			"requires": {
+				"is-extglob": "^2.1.1"
+			}
+		},
+		"is-natural-number": {
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz",
+			"integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg="
+		},
+		"is-npm": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
+			"integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ="
+		},
+		"is-number": {
+			"version": "7.0.0",
+			"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+			"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+		},
+		"is-obj": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+			"integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
+		},
+		"is-object": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz",
+			"integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA="
+		},
+		"is-plain-obj": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+			"integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
+		},
+		"is-promise": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+			"integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
+		},
+		"is-redirect": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+			"integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ="
+		},
+		"is-retry-allowed": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
+			"integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg=="
+		},
+		"is-stream": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+			"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+		},
+		"is-typedarray": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+			"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+		},
+		"is-utf8": {
+			"version": "0.2.1",
+			"resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+			"integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
+		},
+		"isarray": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+			"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+		},
+		"isstream": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+			"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+		},
+		"isurl": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
+			"integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
+			"requires": {
+				"has-to-string-tag-x": "^1.2.0",
+				"is-object": "^1.0.1"
+			}
+		},
+		"js-base64": {
+			"version": "2.5.2",
+			"resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz",
+			"integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ=="
+		},
+		"js-tokens": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+			"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+		},
+		"js-yaml": {
+			"version": "3.13.1",
+			"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+			"integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+			"requires": {
+				"argparse": "^1.0.7",
+				"esprima": "^4.0.0"
+			}
+		},
+		"jsbn": {
+			"version": "0.1.1",
+			"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+			"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+		},
+		"jsesc": {
+			"version": "0.5.0",
+			"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+			"integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+			"dev": true
+		},
+		"jshint": {
+			"version": "2.11.0",
+			"resolved": "https://registry.npmjs.org/jshint/-/jshint-2.11.0.tgz",
+			"integrity": "sha512-ooaD/hrBPhu35xXW4gn+o3SOuzht73gdBuffgJzrZBJZPGgGiiTvJEgTyxFvBO2nz0+X1G6etF8SzUODTlLY6Q==",
+			"optional": true,
+			"requires": {
+				"cli": "~1.0.0",
+				"console-browserify": "1.1.x",
+				"exit": "0.1.x",
+				"htmlparser2": "3.8.x",
+				"lodash": "~4.17.11",
+				"minimatch": "~3.0.2",
+				"shelljs": "0.3.x",
+				"strip-json-comments": "1.0.x"
+			},
+			"dependencies": {
+				"htmlparser2": {
+					"version": "3.8.3",
+					"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
+					"integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
+					"optional": true,
+					"requires": {
+						"domelementtype": "1",
+						"domhandler": "2.3",
+						"domutils": "1.5",
+						"entities": "1.0",
+						"readable-stream": "1.1"
+					}
+				},
+				"isarray": {
+					"version": "0.0.1",
+					"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+					"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+					"optional": true
+				},
+				"readable-stream": {
+					"version": "1.1.14",
+					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+					"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+					"optional": true,
+					"requires": {
+						"core-util-is": "~1.0.0",
+						"inherits": "~2.0.1",
+						"isarray": "0.0.1",
+						"string_decoder": "~0.10.x"
+					}
+				},
+				"string_decoder": {
+					"version": "0.10.31",
+					"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+					"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+					"optional": true
+				},
+				"strip-json-comments": {
+					"version": "1.0.4",
+					"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
+					"integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=",
+					"optional": true
+				}
+			}
+		},
+		"json-schema": {
+			"version": "0.2.3",
+			"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+			"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+		},
+		"json-schema-traverse": {
+			"version": "0.4.1",
+			"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+			"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+		},
+		"json-stringify-safe": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+			"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+		},
+		"json5": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+			"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+			"requires": {
+				"minimist": "^1.2.0"
+			}
+		},
+		"jsonfile": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+			"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+			"requires": {
+				"graceful-fs": "^4.1.6"
+			}
+		},
+		"jsprim": {
+			"version": "1.4.1",
+			"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+			"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+			"requires": {
+				"assert-plus": "1.0.0",
+				"extsprintf": "1.3.0",
+				"json-schema": "0.2.3",
+				"verror": "1.10.0"
+			}
+		},
+		"klaw": {
+			"version": "1.3.1",
+			"resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
+			"integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
+			"requires": {
+				"graceful-fs": "^4.1.9"
+			}
+		},
+		"latest-version": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz",
+			"integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=",
+			"requires": {
+				"package-json": "^2.0.0"
+			}
+		},
+		"lazy-req": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz",
+			"integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w="
+		},
+		"loader-utils": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+			"integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+			"requires": {
+				"big.js": "^5.2.2",
+				"emojis-list": "^3.0.0",
+				"json5": "^1.0.1"
+			}
+		},
+		"locate-path": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+			"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+			"requires": {
+				"p-locate": "^4.1.0"
+			}
+		},
+		"lodash": {
+			"version": "4.17.21",
+			"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+			"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+		},
+		"log-symbols": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+			"integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+			"requires": {
+				"chalk": "^2.0.1"
+			}
+		},
+		"loose-envify": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+			"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+			"dev": true,
+			"requires": {
+				"js-tokens": "^3.0.0 || ^4.0.0"
+			}
+		},
+		"lowercase-keys": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+			"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
+		},
+		"make-dir": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+			"integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+			"requires": {
+				"pify": "^3.0.0"
+			}
+		},
+		"memory-fs": {
+			"version": "0.5.0",
+			"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+			"integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+			"requires": {
+				"errno": "^0.1.3",
+				"readable-stream": "^2.0.1"
+			}
+		},
+		"metalsmith": {
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/metalsmith/-/metalsmith-2.3.0.tgz",
+			"integrity": "sha1-gzr7taKmOF4tmuPZNeOeM+rqUjE=",
+			"requires": {
+				"absolute": "0.0.1",
+				"chalk": "^1.1.3",
+				"clone": "^1.0.2",
+				"co-fs-extra": "^1.2.1",
+				"commander": "^2.6.0",
+				"gray-matter": "^2.0.0",
+				"has-generators": "^1.0.1",
+				"is": "^3.1.0",
+				"is-utf8": "~0.2.0",
+				"recursive-readdir": "^2.1.0",
+				"rimraf": "^2.2.8",
+				"stat-mode": "^0.2.0",
+				"thunkify": "^2.1.2",
+				"unyield": "0.0.1",
+				"ware": "^1.2.0",
+				"win-fork": "^1.1.1"
+			},
+			"dependencies": {
+				"ansi-regex": {
+					"version": "2.1.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+					"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+				},
+				"ansi-styles": {
+					"version": "2.2.1",
+					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+					"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+				},
+				"chalk": {
+					"version": "1.1.3",
+					"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+					"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+					"requires": {
+						"ansi-styles": "^2.2.1",
+						"escape-string-regexp": "^1.0.2",
+						"has-ansi": "^2.0.0",
+						"strip-ansi": "^3.0.0",
+						"supports-color": "^2.0.0"
+					}
+				},
+				"clone": {
+					"version": "1.0.4",
+					"resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+					"integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
+				},
+				"strip-ansi": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+					"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+					"requires": {
+						"ansi-regex": "^2.0.0"
+					}
+				},
+				"supports-color": {
+					"version": "2.0.0",
+					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+					"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+				}
+			}
+		},
+		"mime-db": {
+			"version": "1.43.0",
+			"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
+			"integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ=="
+		},
+		"mime-types": {
+			"version": "2.1.26",
+			"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
+			"integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
+			"requires": {
+				"mime-db": "1.43.0"
+			}
+		},
+		"mimic-fn": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+			"integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
+		},
+		"mimic-response": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+			"integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
+		},
+		"minimatch": {
+			"version": "3.0.4",
+			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+			"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+			"requires": {
+				"brace-expansion": "^1.1.7"
+			}
+		},
+		"minimist": {
+			"version": "1.2.6",
+			"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+			"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
+		},
+		"mixme": {
+			"version": "0.3.5",
+			"resolved": "https://registry.npmjs.org/mixme/-/mixme-0.3.5.tgz",
+			"integrity": "sha512-SyV9uPETRig5ZmYev0ANfiGeB+g6N2EnqqEfBbCGmmJ6MgZ3E4qv5aPbnHVdZ60KAHHXV+T3sXopdrnIXQdmjQ=="
+		},
+		"mkdirp": {
+			"version": "0.5.5",
+			"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+			"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+			"requires": {
+				"minimist": "^1.2.5"
+			}
+		},
+		"ms": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+			"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+			"dev": true
+		},
+		"multimatch": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz",
+			"integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=",
+			"requires": {
+				"array-differ": "^1.0.0",
+				"array-union": "^1.0.1",
+				"arrify": "^1.0.0",
+				"minimatch": "^3.0.0"
+			}
+		},
+		"mute-stream": {
+			"version": "0.0.7",
+			"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+			"integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
+		},
+		"ncp": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
+			"integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M="
+		},
+		"neo-async": {
+			"version": "2.6.2",
+			"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+			"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+		},
+		"node-status-codes": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz",
+			"integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8="
+		},
+		"normalize-path": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+			"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+		},
+		"npm-conf": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz",
+			"integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==",
+			"requires": {
+				"config-chain": "^1.1.11",
+				"pify": "^3.0.0"
+			}
+		},
+		"npmlog": {
+			"version": "4.1.2",
+			"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+			"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+			"requires": {
+				"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": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+			"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+		},
+		"oauth-sign": {
+			"version": "0.9.0",
+			"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+			"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
+		},
+		"object-assign": {
+			"version": "4.1.1",
+			"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+			"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+		},
+		"once": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+			"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+			"requires": {
+				"wrappy": "1"
+			}
+		},
+		"onetime": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+			"integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+			"requires": {
+				"mimic-fn": "^1.0.0"
+			}
+		},
+		"ora": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/ora/-/ora-1.4.0.tgz",
+			"integrity": "sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw==",
+			"requires": {
+				"chalk": "^2.1.0",
+				"cli-cursor": "^2.1.0",
+				"cli-spinners": "^1.0.1",
+				"log-symbols": "^2.1.0"
+			}
+		},
+		"os-homedir": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+			"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+		},
+		"os-tmpdir": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+			"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+		},
+		"osenv": {
+			"version": "0.1.5",
+			"resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+			"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+			"requires": {
+				"os-homedir": "^1.0.0",
+				"os-tmpdir": "^1.0.0"
+			}
+		},
+		"p-cancelable": {
+			"version": "0.3.0",
+			"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz",
+			"integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw=="
+		},
+		"p-event": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz",
+			"integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=",
+			"requires": {
+				"p-timeout": "^1.1.1"
+			}
+		},
+		"p-finally": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+			"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+		},
+		"p-limit": {
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+			"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+			"requires": {
+				"p-try": "^2.0.0"
+			}
+		},
+		"p-locate": {
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+			"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+			"requires": {
+				"p-limit": "^2.2.0"
+			}
+		},
+		"p-timeout": {
+			"version": "1.2.1",
+			"resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz",
+			"integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=",
+			"requires": {
+				"p-finally": "^1.0.0"
+			}
+		},
+		"p-try": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+			"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+		},
+		"package-json": {
+			"version": "2.4.0",
+			"resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz",
+			"integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=",
+			"requires": {
+				"got": "^5.0.0",
+				"registry-auth-token": "^3.0.1",
+				"registry-url": "^3.0.3",
+				"semver": "^5.1.0"
+			},
+			"dependencies": {
+				"got": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz",
+					"integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=",
+					"requires": {
+						"create-error-class": "^3.0.1",
+						"duplexer2": "^0.1.4",
+						"is-redirect": "^1.0.0",
+						"is-retry-allowed": "^1.0.0",
+						"is-stream": "^1.0.0",
+						"lowercase-keys": "^1.0.0",
+						"node-status-codes": "^1.0.0",
+						"object-assign": "^4.0.1",
+						"parse-json": "^2.1.0",
+						"pinkie-promise": "^2.0.0",
+						"read-all-stream": "^3.0.0",
+						"readable-stream": "^2.0.5",
+						"timed-out": "^3.0.0",
+						"unzip-response": "^1.0.2",
+						"url-parse-lax": "^1.0.0"
+					}
+				},
+				"timed-out": {
+					"version": "3.1.3",
+					"resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz",
+					"integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc="
+				},
+				"unzip-response": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz",
+					"integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4="
+				}
+			}
+		},
+		"parse-glob": {
+			"version": "3.0.4",
+			"resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+			"integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+			"requires": {
+				"glob-base": "^0.3.0",
+				"is-dotfile": "^1.0.0",
+				"is-extglob": "^1.0.0",
+				"is-glob": "^2.0.0"
+			},
+			"dependencies": {
+				"is-extglob": {
+					"version": "1.0.0",
+					"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+					"integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
+				},
+				"is-glob": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+					"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+					"requires": {
+						"is-extglob": "^1.0.0"
+					}
+				}
+			}
+		},
+		"parse-json": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+			"integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+			"requires": {
+				"error-ex": "^1.2.0"
+			}
+		},
+		"parserlib": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/parserlib/-/parserlib-1.1.1.tgz",
+			"integrity": "sha1-pkz6ckBiQ0/fw1HJpOwtkrlMBvQ=",
+			"optional": true
+		},
+		"path-exists": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+			"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+		},
+		"path-is-absolute": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+			"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+		},
+		"path-parse": {
+			"version": "1.0.6",
+			"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+			"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
+		},
+		"pathval": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+			"integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+			"dev": true
+		},
+		"pend": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+			"integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
+		},
+		"performance-now": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+			"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+		},
+		"picomatch": {
+			"version": "2.2.2",
+			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+			"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
+		},
+		"pify": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+			"integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+		},
+		"pinkie": {
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+			"integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+		},
+		"pinkie-promise": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+			"integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+			"requires": {
+				"pinkie": "^2.0.0"
+			}
+		},
+		"postcss": {
+			"version": "5.2.18",
+			"resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+			"integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+			"requires": {
+				"chalk": "^1.1.3",
+				"js-base64": "^2.1.9",
+				"source-map": "^0.5.6",
+				"supports-color": "^3.2.3"
+			},
+			"dependencies": {
+				"ansi-regex": {
+					"version": "2.1.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+					"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+				},
+				"ansi-styles": {
+					"version": "2.2.1",
+					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+					"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+				},
+				"chalk": {
+					"version": "1.1.3",
+					"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+					"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+					"requires": {
+						"ansi-styles": "^2.2.1",
+						"escape-string-regexp": "^1.0.2",
+						"has-ansi": "^2.0.0",
+						"strip-ansi": "^3.0.0",
+						"supports-color": "^2.0.0"
+					},
+					"dependencies": {
+						"supports-color": {
+							"version": "2.0.0",
+							"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+							"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+						}
+					}
+				},
+				"has-flag": {
+					"version": "1.0.0",
+					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+					"integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+				},
+				"source-map": {
+					"version": "0.5.7",
+					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+					"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+				},
+				"strip-ansi": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+					"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+					"requires": {
+						"ansi-regex": "^2.0.0"
+					}
+				},
+				"supports-color": {
+					"version": "3.2.3",
+					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+					"integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+					"requires": {
+						"has-flag": "^1.0.0"
+					}
+				}
+			}
+		},
+		"postcss-selector-parser": {
+			"version": "2.2.3",
+			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz",
+			"integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=",
+			"requires": {
+				"flatten": "^1.0.2",
+				"indexes-of": "^1.0.1",
+				"uniq": "^1.0.1"
+			}
+		},
+		"prepend-http": {
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+			"integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
+		},
+		"private": {
+			"version": "0.1.8",
+			"resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+			"integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+			"dev": true
+		},
+		"process-nextick-args": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+			"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+		},
+		"proto-list": {
+			"version": "1.2.4",
+			"resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+			"integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk="
+		},
+		"prr": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+			"integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
+		},
+		"psl": {
+			"version": "1.8.0",
+			"resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+			"integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+		},
+		"punycode": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+			"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+		},
+		"qs": {
+			"version": "6.5.2",
+			"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+			"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
+		},
+		"rc": {
+			"version": "1.2.8",
+			"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+			"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+			"requires": {
+				"deep-extend": "^0.6.0",
+				"ini": "~1.3.0",
+				"minimist": "^1.2.0",
+				"strip-json-comments": "~2.0.1"
+			}
+		},
+		"read-all-stream": {
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz",
+			"integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=",
+			"requires": {
+				"pinkie-promise": "^2.0.0",
+				"readable-stream": "^2.0.0"
+			}
+		},
+		"read-metadata": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/read-metadata/-/read-metadata-1.0.0.tgz",
+			"integrity": "sha1-bfnL5RGE6M630GaLQO5Rkebz2sY=",
+			"requires": {
+				"yaml-js": "0.0.8"
+			}
+		},
+		"readable-stream": {
+			"version": "2.3.7",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+			"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+			"requires": {
+				"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"
+			},
+			"dependencies": {
+				"safe-buffer": {
+					"version": "5.1.2",
+					"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+					"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+				}
+			}
+		},
+		"readdirp": {
+			"version": "3.3.0",
+			"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz",
+			"integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==",
+			"requires": {
+				"picomatch": "^2.0.7"
+			}
+		},
+		"recursive-readdir": {
+			"version": "2.2.2",
+			"resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
+			"integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==",
+			"requires": {
+				"minimatch": "3.0.4"
+			}
+		},
+		"regenerate": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
+			"integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
+			"dev": true
+		},
+		"regenerator-runtime": {
+			"version": "0.11.1",
+			"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+			"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+			"dev": true
+		},
+		"regenerator-transform": {
+			"version": "0.10.1",
+			"resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+			"integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.18.0",
+				"babel-types": "^6.19.0",
+				"private": "^0.1.6"
+			}
+		},
+		"regexpu-core": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+			"integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+			"dev": true,
+			"requires": {
+				"regenerate": "^1.2.1",
+				"regjsgen": "^0.2.0",
+				"regjsparser": "^0.1.4"
+			}
+		},
+		"registry-auth-token": {
+			"version": "3.4.0",
+			"resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz",
+			"integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==",
+			"requires": {
+				"rc": "^1.1.6",
+				"safe-buffer": "^5.0.1"
+			}
+		},
+		"registry-url": {
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+			"integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+			"requires": {
+				"rc": "^1.0.1"
+			}
+		},
+		"regjsgen": {
+			"version": "0.2.0",
+			"resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+			"integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+			"dev": true
+		},
+		"regjsparser": {
+			"version": "0.1.5",
+			"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+			"integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+			"dev": true,
+			"requires": {
+				"jsesc": "~0.5.0"
+			}
+		},
+		"repeating": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+			"integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+			"requires": {
+				"is-finite": "^1.0.0"
+			}
+		},
+		"request": {
+			"version": "2.88.2",
+			"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+			"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+			"requires": {
+				"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.3",
+				"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.5.0",
+				"tunnel-agent": "^0.6.0",
+				"uuid": "^3.3.2"
+			},
+			"dependencies": {
+				"tough-cookie": {
+					"version": "2.5.0",
+					"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+					"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+					"requires": {
+						"psl": "^1.1.28",
+						"punycode": "^2.1.1"
+					}
+				}
+			}
+		},
+		"require-directory": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+			"integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+		},
+		"require-main-filename": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+			"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+		},
+		"resolve-url": {
+			"version": "0.2.1",
+			"resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+			"integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+		},
+		"restore-cursor": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+			"integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+			"requires": {
+				"onetime": "^2.0.0",
+				"signal-exit": "^3.0.2"
+			}
+		},
+		"rimraf": {
+			"version": "2.7.1",
+			"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+			"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+			"requires": {
+				"glob": "^7.1.3"
+			}
+		},
+		"run-async": {
+			"version": "2.4.0",
+			"resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz",
+			"integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==",
+			"requires": {
+				"is-promise": "^2.1.0"
+			}
+		},
+		"rxjs": {
+			"version": "5.5.12",
+			"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz",
+			"integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==",
+			"requires": {
+				"symbol-observable": "1.0.1"
+			}
+		},
+		"safe-buffer": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
+			"integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
+		},
+		"safer-buffer": {
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+			"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+		},
+		"seek-bzip": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz",
+			"integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=",
+			"requires": {
+				"commander": "~2.8.1"
+			},
+			"dependencies": {
+				"commander": {
+					"version": "2.8.1",
+					"resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
+					"integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
+					"requires": {
+						"graceful-readlink": ">= 1.0.0"
+					}
+				}
+			}
+		},
+		"semver": {
+			"version": "5.7.1",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+			"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+		},
+		"semver-diff": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
+			"integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
+			"requires": {
+				"semver": "^5.0.3"
+			}
+		},
+		"set-blocking": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+			"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+		},
+		"shelljs": {
+			"version": "0.3.0",
+			"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz",
+			"integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=",
+			"optional": true
+		},
+		"signal-exit": {
+			"version": "3.0.3",
+			"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+			"integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
+		},
+		"slash": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+			"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+		},
+		"slide": {
+			"version": "1.1.6",
+			"resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
+			"integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc="
+		},
+		"smartwrap": {
+			"version": "1.2.5",
+			"resolved": "https://registry.npmjs.org/smartwrap/-/smartwrap-1.2.5.tgz",
+			"integrity": "sha512-bzWRwHwu0RnWjwU7dFy7tF68pDAx/zMSu3g7xr9Nx5J0iSImYInglwEVExyHLxXljy6PWMjkSAbwF7t2mPnRmg==",
+			"requires": {
+				"breakword": "^1.0.5",
+				"grapheme-splitter": "^1.0.4",
+				"strip-ansi": "^6.0.0",
+				"wcwidth": "^1.0.1",
+				"yargs": "^15.1.0"
+			},
+			"dependencies": {
+				"ansi-regex": {
+					"version": "5.0.0",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+					"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+				},
+				"strip-ansi": {
+					"version": "6.0.0",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+					"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+					"requires": {
+						"ansi-regex": "^5.0.0"
+					}
+				}
+			}
+		},
+		"sort-keys": {
+			"version": "1.1.2",
+			"resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
+			"integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
+			"requires": {
+				"is-plain-obj": "^1.0.0"
+			}
+		},
+		"sort-keys-length": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz",
+			"integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=",
+			"requires": {
+				"sort-keys": "^1.0.0"
+			}
+		},
+		"source-list-map": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+			"integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="
+		},
+		"source-map": {
+			"version": "0.6.1",
+			"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+			"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+		},
+		"source-map-resolve": {
+			"version": "0.5.3",
+			"resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+			"integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+			"requires": {
+				"atob": "^2.1.2",
+				"decode-uri-component": "^0.2.0",
+				"resolve-url": "^0.2.1",
+				"source-map-url": "^0.4.0",
+				"urix": "^0.1.0"
+			}
+		},
+		"source-map-url": {
+			"version": "0.4.0",
+			"resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+			"integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
+		},
+		"sprintf-js": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+			"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+		},
+		"sshpk": {
+			"version": "1.16.1",
+			"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+			"integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+			"requires": {
+				"asn1": "~0.2.3",
+				"assert-plus": "^1.0.0",
+				"bcrypt-pbkdf": "^1.0.0",
+				"dashdash": "^1.12.0",
+				"ecc-jsbn": "~0.1.1",
+				"getpass": "^0.1.1",
+				"jsbn": "~0.1.0",
+				"safer-buffer": "^2.0.2",
+				"tweetnacl": "~0.14.0"
+			}
+		},
+		"stat-mode": {
+			"version": "0.2.2",
+			"resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz",
+			"integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI="
+		},
+		"stream-transform": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-2.0.1.tgz",
+			"integrity": "sha512-GiTcO/rRvZP2R8WPwxmxCFP+Of1yIATuFAmYkvSLDfcD93X2WHiPwdgIqeFT2CvL1gyAsjQvu1nB6RDNQ5b2jw==",
+			"requires": {
+				"mixme": "^0.3.1"
+			}
+		},
+		"string-width": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+			"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+			"requires": {
+				"is-fullwidth-code-point": "^2.0.0",
+				"strip-ansi": "^4.0.0"
+			}
+		},
+		"string_decoder": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+			"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+			"requires": {
+				"safe-buffer": "~5.1.0"
+			},
+			"dependencies": {
+				"safe-buffer": {
+					"version": "5.1.2",
+					"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+					"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+				}
+			}
+		},
+		"strip-ansi": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+			"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+			"requires": {
+				"ansi-regex": "^3.0.0"
+			}
+		},
+		"strip-dirs": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz",
+			"integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==",
+			"requires": {
+				"is-natural-number": "^4.0.1"
+			}
+		},
+		"strip-json-comments": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+			"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+		},
+		"strip-outer": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
+			"integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
+			"requires": {
+				"escape-string-regexp": "^1.0.2"
+			}
+		},
+		"supports-color": {
+			"version": "5.5.0",
+			"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+			"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+			"requires": {
+				"has-flag": "^3.0.0"
+			}
+		},
+		"symbol-observable": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz",
+			"integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ="
+		},
+		"tapable": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+			"integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="
+		},
+		"tar-stream": {
+			"version": "1.6.2",
+			"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz",
+			"integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
+			"requires": {
+				"bl": "^1.0.0",
+				"buffer-alloc": "^1.2.0",
+				"end-of-stream": "^1.0.0",
+				"fs-constants": "^1.0.0",
+				"readable-stream": "^2.3.0",
+				"to-buffer": "^1.1.1",
+				"xtend": "^4.0.0"
+			}
+		},
+		"throttle-debounce": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.1.0.tgz",
+			"integrity": "sha512-AOvyNahXQuU7NN+VVvOOX+uW6FPaWdAOdRP5HfwYxAfCzXTFKRMoIMk+n+po318+ktcChx+F1Dd91G3YHeMKyg=="
+		},
+		"through": {
+			"version": "2.3.8",
+			"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+			"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+		},
+		"thunkify": {
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz",
+			"integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0="
+		},
+		"thunkify-wrap": {
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/thunkify-wrap/-/thunkify-wrap-1.0.4.tgz",
+			"integrity": "sha1-tSvlSN3+/aIOALWMYJZ2K0PdaIA=",
+			"requires": {
+				"enable": "1"
+			}
+		},
+		"tildify": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz",
+			"integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=",
+			"requires": {
+				"os-homedir": "^1.0.0"
+			}
+		},
+		"time-ago": {
+			"version": "0.2.1",
+			"resolved": "https://registry.npmjs.org/time-ago/-/time-ago-0.2.1.tgz",
+			"integrity": "sha512-fQ3WQ5yPBoNefBgITR+kMnd5aWiKYhBNSgQH3FwpJgDCaVEmju7rWyP+Rk52KyQbRwQEnw3ox2yxcS4yMxgP+g=="
+		},
+		"timed-out": {
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+			"integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
+		},
+		"tmp": {
+			"version": "0.0.33",
+			"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+			"integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+			"requires": {
+				"os-tmpdir": "~1.0.2"
+			}
+		},
+		"to-buffer": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
+			"integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg=="
+		},
+		"to-fast-properties": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+			"integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+			"dev": true
+		},
+		"to-regex-range": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+			"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+			"requires": {
+				"is-number": "^7.0.0"
+			}
+		},
+		"toml": {
+			"version": "2.3.6",
+			"resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz",
+			"integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ=="
+		},
+		"tough-cookie": {
+			"version": "2.4.3",
+			"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+			"integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+			"requires": {
+				"psl": "^1.1.24",
+				"punycode": "^1.4.1"
+			},
+			"dependencies": {
+				"punycode": {
+					"version": "1.4.1",
+					"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+					"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+				}
+			}
+		},
+		"trim-repeated": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
+			"integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
+			"requires": {
+				"escape-string-regexp": "^1.0.2"
+			}
+		},
+		"tty-table": {
+			"version": "2.8.13",
+			"resolved": "https://registry.npmjs.org/tty-table/-/tty-table-2.8.13.tgz",
+			"integrity": "sha512-eVV/+kB6fIIdx+iUImhXrO22gl7f6VmmYh0Zbu6C196fe1elcHXd7U6LcLXu0YoVPc2kNesWiukYcdK8ZmJ6aQ==",
+			"requires": {
+				"chalk": "^3.0.0",
+				"csv": "^5.3.1",
+				"smartwrap": "^1.2.3",
+				"strip-ansi": "^6.0.0",
+				"wcwidth": "^1.0.1",
+				"yargs": "^15.1.0"
+			},
+			"dependencies": {
+				"ansi-regex": {
+					"version": "5.0.0",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+					"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+				},
+				"ansi-styles": {
+					"version": "4.2.1",
+					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+					"integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+					"requires": {
+						"@types/color-name": "^1.1.1",
+						"color-convert": "^2.0.1"
+					}
+				},
+				"chalk": {
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+					"integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+					"requires": {
+						"ansi-styles": "^4.1.0",
+						"supports-color": "^7.1.0"
+					}
+				},
+				"color-convert": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+					"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+					"requires": {
+						"color-name": "~1.1.4"
+					}
+				},
+				"color-name": {
+					"version": "1.1.4",
+					"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+				},
+				"has-flag": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+					"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+				},
+				"strip-ansi": {
+					"version": "6.0.0",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+					"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+					"requires": {
+						"ansi-regex": "^5.0.0"
+					}
+				},
+				"supports-color": {
+					"version": "7.1.0",
+					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+					"integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+					"requires": {
+						"has-flag": "^4.0.0"
+					}
+				}
+			}
+		},
+		"tunnel-agent": {
+			"version": "0.6.0",
+			"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+			"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+			"requires": {
+				"safe-buffer": "^5.0.1"
+			}
+		},
+		"tweetnacl": {
+			"version": "0.14.5",
+			"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+			"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+		},
+		"type-detect": {
+			"version": "4.0.8",
+			"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+			"integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+			"dev": true
+		},
+		"uglify-js": {
+			"version": "3.13.5",
+			"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz",
+			"integrity": "sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw==",
+			"optional": true
+		},
+		"unbzip2-stream": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.0.tgz",
+			"integrity": "sha512-kVx7CDAsdBSWVf404Mw7oI9i09w5/mTT/Ruk+RWa64PLYKvsAucLLFHvQtnvjeADM4ZizxrvG5SHnF4Te4T2Cg==",
+			"requires": {
+				"buffer": "^5.2.1",
+				"through": "^2.3.8"
+			}
+		},
+		"uniq": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+			"integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8="
+		},
+		"universalify": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+			"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+		},
+		"unyield": {
+			"version": "0.0.1",
+			"resolved": "https://registry.npmjs.org/unyield/-/unyield-0.0.1.tgz",
+			"integrity": "sha1-FQ5l2kK/d0JEW5WKZOubhdHSsYA=",
+			"requires": {
+				"co": "~3.1.0"
+			}
+		},
+		"unzip-response": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+			"integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c="
+		},
+		"update-notifier": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-1.0.3.tgz",
+			"integrity": "sha1-j5LFFUgr1oMbfJMBPnD4dVLHz1o=",
+			"requires": {
+				"boxen": "^0.6.0",
+				"chalk": "^1.0.0",
+				"configstore": "^2.0.0",
+				"is-npm": "^1.0.0",
+				"latest-version": "^2.0.0",
+				"lazy-req": "^1.1.0",
+				"semver-diff": "^2.0.0",
+				"xdg-basedir": "^2.0.0"
+			},
+			"dependencies": {
+				"ansi-regex": {
+					"version": "2.1.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+					"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+				},
+				"ansi-styles": {
+					"version": "2.2.1",
+					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+					"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+				},
+				"chalk": {
+					"version": "1.1.3",
+					"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+					"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+					"requires": {
+						"ansi-styles": "^2.2.1",
+						"escape-string-regexp": "^1.0.2",
+						"has-ansi": "^2.0.0",
+						"strip-ansi": "^3.0.0",
+						"supports-color": "^2.0.0"
+					}
+				},
+				"strip-ansi": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+					"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+					"requires": {
+						"ansi-regex": "^2.0.0"
+					}
+				},
+				"supports-color": {
+					"version": "2.0.0",
+					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+					"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+				}
+			}
+		},
+		"uri-js": {
+			"version": "4.2.2",
+			"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+			"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+			"requires": {
+				"punycode": "^2.1.0"
+			}
+		},
+		"urix": {
+			"version": "0.1.0",
+			"resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+			"integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+		},
+		"url-parse-lax": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+			"integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+			"requires": {
+				"prepend-http": "^1.0.1"
+			}
+		},
+		"url-to-options": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz",
+			"integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k="
+		},
+		"user-home": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
+			"integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=",
+			"requires": {
+				"os-homedir": "^1.0.0"
+			}
+		},
+		"util-deprecate": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+			"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+		},
+		"uuid": {
+			"version": "3.4.0",
+			"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+			"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+		},
+		"validate-npm-package-name": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
+			"integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=",
+			"requires": {
+				"builtins": "^1.0.3"
+			}
+		},
+		"verror": {
+			"version": "1.10.0",
+			"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+			"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+			"requires": {
+				"assert-plus": "^1.0.0",
+				"core-util-is": "1.0.2",
+				"extsprintf": "^1.2.0"
+			}
+		},
+		"vue-template-compiler": {
+			"version": "2.6.11",
+			"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.11.tgz",
+			"integrity": "sha512-KIq15bvQDrcCjpGjrAhx4mUlyyHfdmTaoNfeoATHLAiWB+MU3cx4lOzMwrnUh9cCxy0Lt1T11hAFY6TQgroUAA==",
+			"requires": {
+				"de-indent": "^1.0.2",
+				"he": "^1.1.0"
+			}
+		},
+		"vue-template-es2015-compiler": {
+			"version": "1.9.1",
+			"resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz",
+			"integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw=="
+		},
+		"ware": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz",
+			"integrity": "sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q=",
+			"requires": {
+				"wrap-fn": "^0.1.0"
+			}
+		},
+		"wcwidth": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+			"integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+			"requires": {
+				"defaults": "^1.0.3"
+			}
+		},
+		"webpack-sources": {
+			"version": "1.4.3",
+			"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
+			"integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+			"requires": {
+				"source-list-map": "^2.0.0",
+				"source-map": "~0.6.1"
+			}
+		},
+		"which-module": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+			"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+		},
+		"wide-align": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+			"integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+			"requires": {
+				"string-width": "^1.0.2 || 2"
+			}
+		},
+		"widest-line": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz",
+			"integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=",
+			"requires": {
+				"string-width": "^1.0.1"
+			},
+			"dependencies": {
+				"ansi-regex": {
+					"version": "2.1.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+					"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+				},
+				"is-fullwidth-code-point": {
+					"version": "1.0.0",
+					"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+					"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+					"requires": {
+						"number-is-nan": "^1.0.0"
+					}
+				},
+				"string-width": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+					"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+					"requires": {
+						"code-point-at": "^1.0.0",
+						"is-fullwidth-code-point": "^1.0.0",
+						"strip-ansi": "^3.0.0"
+					}
+				},
+				"strip-ansi": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+					"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+					"requires": {
+						"ansi-regex": "^2.0.0"
+					}
+				}
+			}
+		},
+		"win-fork": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/win-fork/-/win-fork-1.1.1.tgz",
+			"integrity": "sha1-j1jgZW/KAK3IyGoriePNLWotXl4="
+		},
+		"wordwrap": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+			"integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
+		},
+		"wrap-ansi": {
+			"version": "6.2.0",
+			"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+			"integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+			"requires": {
+				"ansi-styles": "^4.0.0",
+				"string-width": "^4.1.0",
+				"strip-ansi": "^6.0.0"
+			},
+			"dependencies": {
+				"ansi-regex": {
+					"version": "5.0.0",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+					"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+				},
+				"ansi-styles": {
+					"version": "4.2.1",
+					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+					"integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+					"requires": {
+						"@types/color-name": "^1.1.1",
+						"color-convert": "^2.0.1"
+					}
+				},
+				"color-convert": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+					"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+					"requires": {
+						"color-name": "~1.1.4"
+					}
+				},
+				"color-name": {
+					"version": "1.1.4",
+					"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+				},
+				"is-fullwidth-code-point": {
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+					"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+				},
+				"string-width": {
+					"version": "4.2.0",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+					"integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+					"requires": {
+						"emoji-regex": "^8.0.0",
+						"is-fullwidth-code-point": "^3.0.0",
+						"strip-ansi": "^6.0.0"
+					}
+				},
+				"strip-ansi": {
+					"version": "6.0.0",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+					"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+					"requires": {
+						"ansi-regex": "^5.0.0"
+					}
+				}
+			}
+		},
+		"wrap-fn": {
+			"version": "0.1.5",
+			"resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz",
+			"integrity": "sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU=",
+			"requires": {
+				"co": "3.1.0"
+			}
+		},
+		"wrappy": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+			"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+		},
+		"write-file-atomic": {
+			"version": "1.3.4",
+			"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz",
+			"integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=",
+			"requires": {
+				"graceful-fs": "^4.1.11",
+				"imurmurhash": "^0.1.4",
+				"slide": "^1.1.5"
+			}
+		},
+		"xdg-basedir": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz",
+			"integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=",
+			"requires": {
+				"os-homedir": "^1.0.0"
+			}
+		},
+		"xml": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
+			"integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU="
+		},
+		"xtend": {
+			"version": "4.0.2",
+			"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+			"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+		},
+		"y18n": {
+			"version": "4.0.3",
+			"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+			"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
+		},
+		"yaml-js": {
+			"version": "0.0.8",
+			"resolved": "https://registry.npmjs.org/yaml-js/-/yaml-js-0.0.8.tgz",
+			"integrity": "sha1-h8+lqWE/SOJgBUINao7g2m/o2uw="
+		},
+		"yargs": {
+			"version": "15.3.1",
+			"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
+			"integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
+			"requires": {
+				"cliui": "^6.0.0",
+				"decamelize": "^1.2.0",
+				"find-up": "^4.1.0",
+				"get-caller-file": "^2.0.1",
+				"require-directory": "^2.1.1",
+				"require-main-filename": "^2.0.0",
+				"set-blocking": "^2.0.0",
+				"string-width": "^4.2.0",
+				"which-module": "^2.0.0",
+				"y18n": "^4.0.0",
+				"yargs-parser": "^18.1.1"
+			},
+			"dependencies": {
+				"ansi-regex": {
+					"version": "5.0.0",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+					"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+				},
+				"is-fullwidth-code-point": {
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+					"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+				},
+				"string-width": {
+					"version": "4.2.0",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+					"integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+					"requires": {
+						"emoji-regex": "^8.0.0",
+						"is-fullwidth-code-point": "^3.0.0",
+						"strip-ansi": "^6.0.0"
+					}
+				},
+				"strip-ansi": {
+					"version": "6.0.0",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+					"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+					"requires": {
+						"ansi-regex": "^5.0.0"
+					}
+				}
+			}
+		},
+		"yargs-parser": {
+			"version": "18.1.2",
+			"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz",
+			"integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==",
+			"requires": {
+				"camelcase": "^5.0.0",
+				"decamelize": "^1.2.0"
+			}
+		},
+		"yauzl": {
+			"version": "2.10.0",
+			"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+			"integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
+			"requires": {
+				"buffer-crc32": "~0.2.3",
+				"fd-slicer": "~1.1.0"
+			}
+		}
+	}
+}
diff --git a/packages/cli/package.json b/packages/cli/package.json
new file mode 100644
index 000000000..80b8798e0
--- /dev/null
+++ b/packages/cli/package.json
@@ -0,0 +1,85 @@
+{
+  "name": "@wepy/cli",
+  "version": "2.1.0",
+  "main": "index.js",
+  "bin": {
+    "wepy": "bin/wepy.js"
+  },
+  "scripts": {
+    "test": "mocha ./test/core/**/*.test.js"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+ssh://git@github.com/wepyjs/wepy.git"
+  },
+  "author": {
+    "name": "Gcaufy"
+  },
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/wepyjs/wepy/issues"
+  },
+  "homepage": "https://github.com/wepyjs/wepy#readme",
+  "devDependencies": {
+    "babel": "^6.23.0",
+    "babel-preset-es2015": "^6.18.0",
+    "babel-preset-stage-1": "^6.16.0",
+    "chai": "^4.1.2"
+  },
+  "dependencies": {
+    "@babel/code-frame": "^7.0.0",
+    "acorn": "^5.7.4",
+    "acorn-dynamic-import": "^3.0.0",
+    "async": "^2.6.4",
+    "chalk": "^2.3.0",
+    "chokidar": "^3.0.1",
+    "colors": "^1.1.2",
+    "commander": "^2.9.0",
+    "compare-versions": "^3.0.0",
+    "consolidate": "^0.15.0",
+    "css": "^2.2.4",
+    "download": "^6.2.5",
+    "download-git-repo": "^1.0.2",
+    "enhanced-resolve": "^4.1.0",
+    "fs-extra": "^8.1.0",
+    "handlebars": "^4.7.7",
+    "hash-sum": "^1.0.2",
+    "htmlhint": "^0.11.0",
+    "htmlparser2": "^3.9.2",
+    "ignore": "^3.2.0",
+    "inquirer": "^5.0.1",
+    "js-base64": "^2.1.9",
+    "loader-utils": "^1.1.0",
+    "metalsmith": "^2.3.0",
+    "mkdirp": "^0.5.1",
+    "multimatch": "^2.1.0",
+    "ncp": "^2.0.0",
+    "npmlog": "^4.1.2",
+    "ora": "^1.4.0",
+    "postcss": "^5.2.16",
+    "postcss-selector-parser": "^2.2.3",
+    "read-metadata": "^1.0.0",
+    "request": "^2.67.0",
+    "slash": "^3.0.0",
+    "throttle-debounce": "^2.1.0",
+    "tildify": "^1.2.0",
+    "time-ago": "^0.2.1",
+    "tty-table": "^2.8.0",
+    "update-notifier": "^1.0.2",
+    "user-home": "^2.0.0",
+    "validate-npm-package-name": "^3.0.0",
+    "vue-template-compiler": "^2.5.16",
+    "vue-template-es2015-compiler": "^1.6.0",
+    "webpack-sources": "^1.1.0"
+  },
+  "engines": {
+    "node": ">=6"
+  },
+  "publishConfig": {
+    "access": "public"
+  },
+  "readme": "ERROR: No README data found!",
+  "_id": "@wepy/cli@2.0.0-alpha.28",
+  "_commitid": "e714739",
+  "gitHead": "5a25776457360bbbbc54a4d059f6bc7c032d5df3"
+}
diff --git a/packages/cli/test/config.js b/packages/cli/test/config.js
new file mode 100644
index 000000000..81b3f3fd1
--- /dev/null
+++ b/packages/cli/test/config.js
@@ -0,0 +1,11 @@
+const path = require('path');
+
+const resolve = dir => path.join(__dirname, '..', dir);
+
+exports.alias = {
+  core: resolve('core'),
+  ast: resolve('core/ast'),
+  init: resolve('core/init'),
+  plugins: resolve('core/plugins'),
+  util: resolve('core/util')
+};
diff --git a/packages/cli/test/core/fileDep.test.js b/packages/cli/test/core/fileDep.test.js
new file mode 100644
index 000000000..6a23e271e
--- /dev/null
+++ b/packages/cli/test/core/fileDep.test.js
@@ -0,0 +1,67 @@
+const expect = require('chai').expect;
+const FileDep = require('../../core/fileDep');
+
+describe('FileDep', function() {
+  it('should addDeps, getDeps and getSources', function() {
+    const fileDep = new FileDep();
+
+    fileDep.addDeps('a.wpy', ['b.js', 'c.js']);
+    expect(fileDep.getDeps('a.wpy')).to.eql(['b.js', 'c.js']);
+    expect(fileDep.getSources('b.js')).to.eql(['a.wpy']);
+    expect(fileDep.getSources('c.js')).to.eql(['a.wpy']);
+
+    fileDep.addDeps('b.wpy', ['c.js', 'd.js']);
+    expect(fileDep.getDeps('b.wpy')).to.eql(['c.js', 'd.js']);
+    expect(fileDep.getSources('c.js')).to.eql(['a.wpy', 'b.wpy']);
+  });
+
+  it('should cleanDeps', function() {
+    const fileDep = new FileDep();
+
+    fileDep.addDeps('a.wpy', ['b.js', 'c.js']);
+    fileDep.cleanDeps('a.wpy');
+    expect(fileDep.getDeps('a.wpy')).to.eql([]);
+    expect(fileDep.getSources('b.js')).to.eql([]);
+    expect(fileDep.getSources('c.js')).to.eql([]);
+
+    fileDep.addDeps('a.wpy', ['b.js', 'c.js']);
+    fileDep.addDeps('b.wpy', ['c.js', 'd.js']);
+    fileDep.cleanDeps('a.wpy');
+    expect(fileDep.getDeps('a.wpy')).to.eql([]);
+    expect(fileDep.getDeps('b.wpy')).to.eql(['c.js', 'd.js']);
+    expect(fileDep.getSources('b.js')).to.eql([]);
+    expect(fileDep.getSources('c.js')).to.eql(['b.wpy']);
+    expect(fileDep.getSources('d.js')).to.eql(['b.wpy']);
+  });
+
+  it('should not add duplicated deps', function() {
+    const fileDep = new FileDep();
+
+    fileDep.addDeps('a.wpy', ['a.js', 'b.js']);
+    expect(fileDep.getDeps('a.wpy')).to.eql(['a.js', 'b.js']);
+    expect(fileDep.getSources('a.js')).to.eql(['a.wpy']);
+    expect(fileDep.getSources('b.js')).to.eql(['a.wpy']);
+
+    fileDep.addDeps('a.wpy', ['b.js', 'c.js', 'd.js']);
+    expect(fileDep.getDeps('a.wpy')).to.eql(['a.js', 'b.js', 'c.js', 'd.js']);
+    expect(fileDep.getSources('a.js')).to.eql(['a.wpy']);
+    expect(fileDep.getSources('b.js')).to.eql(['a.wpy']);
+    expect(fileDep.getSources('c.js')).to.eql(['a.wpy']);
+    expect(fileDep.getSources('d.js')).to.eql(['a.wpy']);
+  });
+
+  it('should get isInvolved correctly', function() {
+    const fileDep = new FileDep();
+
+    fileDep.addDeps('a.wpy', ['b.js', 'c.js']);
+    expect(fileDep.isInvolved('a.wpy')).to.be.true;
+    expect(fileDep.isInvolved('b.js')).to.be.true;
+    expect(fileDep.isInvolved('c.js')).to.be.true;
+    expect(fileDep.isInvolved('d.js')).to.be.false;
+
+    fileDep.cleanDeps('a.wpy');
+    expect(fileDep.isInvolved('a.wpy')).to.be.false;
+    expect(fileDep.isInvolved('b.js')).to.be.false;
+    expect(fileDep.isInvolved('c.js')).to.be.false;
+  });
+});
diff --git a/packages/cli/test/core/fixtures/template/assert/attrWithoutValue.wxml b/packages/cli/test/core/fixtures/template/assert/attrWithoutValue.wxml
new file mode 100644
index 000000000..1b6eea305
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/attrWithoutValue.wxml
@@ -0,0 +1,2 @@
+<view hidden></view>
+<scroll-view scroll-x></scroll-view>
diff --git a/packages/cli/test/core/fixtures/template/assert/bindClass.wxml b/packages/cli/test/core/fixtures/template/assert/bindClass.wxml
new file mode 100644
index 000000000..6d377c52f
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/bindClass.wxml
@@ -0,0 +1,4 @@
+<view class="default {{ [ express - 1 === 0 ? 'test' : '',has ? 'has' : '' ] }}"></view>
+<view class=" {{ [ test ? 'test' : '',has ? 'has' : '',something ] }}"></view>
+<view class="default {{ [ item.selected ? 'selected' : '',has ? 'has' : '' ] }}"></view>
+<view class="default {{ [ (value >= 0 ? 'increase': 'decrease'); ] }}"></view>
diff --git a/packages/cli/test/core/fixtures/template/assert/bindStyle.wxml b/packages/cli/test/core/fixtures/template/assert/bindStyle.wxml
new file mode 100644
index 000000000..78f033f99
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/bindStyle.wxml
@@ -0,0 +1 @@
+<view style=" {{ 'background:' + (current === idx ? activeColor : normalColor) + ';' }}"></view>
diff --git a/packages/cli/test/core/fixtures/template/assert/joinStyle.wxml b/packages/cli/test/core/fixtures/template/assert/joinStyle.wxml
new file mode 100644
index 000000000..2fec871c4
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/joinStyle.wxml
@@ -0,0 +1,2 @@
+<view style="width: 100rpx; {{ 'background:' + (bgColor) + ';' }}"></view>
+<view style="height: 200rpx; {{ 'font-size:' + (titleFontSize) + ';' }}"></view>
diff --git a/packages/cli/test/core/fixtures/template/assert/ref.wxml b/packages/cli/test/core/fixtures/template/assert/ref.wxml
new file mode 100644
index 000000000..d9b351074
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/ref.wxml
@@ -0,0 +1,6 @@
+<view id="ref-0-0"></view>
+<view id="ref-0-1"></view>
+<view id="hello"></view>
+<view id="{{ hello }}"></view>
+<custom-component-01 bind_init="__initComponent" data-ref="myCom01"></custom-component-01>
+<custom-component-02 bind_init="__initComponent" data-ref="{{ myCom02 }}"></custom-component-02>
\ No newline at end of file
diff --git a/packages/cli/test/core/fixtures/template/assert/reference.wxml b/packages/cli/test/core/fixtures/template/assert/reference.wxml
new file mode 100644
index 000000000..d8b9f9d81
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/reference.wxml
@@ -0,0 +1,5 @@
+<import src="item.wxml" />
+<template is="item" data="{{text: 'foobar'}}" />
+<include src="header.wxml" />
+<view> body </view>
+<include src="footer.wxml" />
diff --git a/packages/cli/test/core/fixtures/template/assert/v-for.wxml b/packages/cli/test/core/fixtures/template/assert/v-for.wxml
new file mode 100644
index 000000000..6a065dc3f
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-for.wxml
@@ -0,0 +1,3 @@
+<view wx:for="{{ items }}" wx:for-index="index" wx:for-item="item" wx:key="index"></view>
+<view wx:for="{{ items }}" wx:for-index="index" wx:for-item="item" wx:key="index"></view>
+<view wx:for="{{ object }}" wx:for-index="key" wx:for-item="value" wx:key="index"></view>
diff --git a/packages/cli/test/core/fixtures/template/assert/v-if.wxml b/packages/cli/test/core/fixtures/template/assert/v-if.wxml
new file mode 100644
index 000000000..5dd895e6b
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-if.wxml
@@ -0,0 +1,4 @@
+<view wx:if="{{ case01 }}"></view>
+<view wx:elif="{{ case02 }}"></view>
+<view wx:else></view>
+<view wx:if="{{ a < 1 }}"></view>
diff --git a/packages/cli/test/core/fixtures/template/assert/v-on.wxml b/packages/cli/test/core/fixtures/template/assert/v-on.wxml
new file mode 100644
index 000000000..d2e8b6401
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-on.wxml
@@ -0,0 +1,23 @@
+<view data-wpy-evt="0-0" bind:tap="__dispatcher"></view>
+<view data-wpy-evt="0-1" catch:tap="__dispatcher"></view>
+<view data-wpy-evt="0-2" capture-bind:tap="__dispatcher"></view>
+<view data-wpy-evt="0-3" capture-catch:tap="__dispatcher"></view>
+<view data-wpy-evt="0-4" capture-catch:tap="__dispatcher"></view>
+
+<view data-wpy-evt="0-5" bind:tap="__dispatcher"></view>
+
+<view wx:for="{{ list }}" wx:for-index="index" wx:for-item="item" wx:key="index">
+  <button data-wpy-evt="0-6" bind:tap="__dispatcher" data-wpytap-a="{{ item }}"></button>
+</view>
+
+<view data-wpy-evt="0-7" capture-bind:tap="__dispatcher"></view>
+<view data-wpy-evt="0-8" capture-catch:tap="__dispatcher"></view>
+
+<view data-wpy-evt="0-9" bind:click-right="__dispatcher"></view>
+
+<view data-wpy-evt="0-10" bind:tap="__dispatcher"></view>
+<view data-wpy-evt="0-11" bind:tap="__dispatcher"></view>
+<view data-wpy-evt="0-12" bind:tap="__dispatcher"></view>
+<view data-wpy-evt="0-13" bind:tap="__dispatcher"></view>
+<view data-wpy-evt="0-14" bind:tap="__dispatcher"></view>
+<view data-wpy-evt="0-15" bind:tap="__dispatcher"></view>
diff --git a/packages/cli/test/core/fixtures/template/assert/v-on.wxs.wxml b/packages/cli/test/core/fixtures/template/assert/v-on.wxs.wxml
new file mode 100644
index 000000000..0523717ba
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-on.wxs.wxml
@@ -0,0 +1,2 @@
+<view bind:tap="{{ m.touchmove }}"></view>
+<view data-wpy-evt="0-0" bind:tap="__dispatcher"></view>
diff --git a/packages/cli/test/core/fixtures/template/assert/v-on/0-0.tap.js b/packages/cli/test/core/fixtures/template/assert/v-on/0-0.tap.js
new file mode 100644
index 000000000..452d25622
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-on/0-0.tap.js
@@ -0,0 +1,9 @@
+function proxy () {
+  var $wx = arguments[arguments.length - 1].$wx;
+  var $event = ($wx.detail && $wx.detail.arguments) ? $wx.detail.arguments[0] : arguments[arguments.length -1];
+  var $args = $wx.detail && $wx.detail.arguments;
+  var _vm=this;
+  return (function () {
+    _vm.myclick.apply(_vm, $args || [$event]);
+  })();
+}
diff --git a/packages/cli/test/core/fixtures/template/assert/v-on/0-1.tap.js b/packages/cli/test/core/fixtures/template/assert/v-on/0-1.tap.js
new file mode 100644
index 000000000..0a7a1bde5
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-on/0-1.tap.js
@@ -0,0 +1,9 @@
+function proxy () {
+  var $wx = arguments[arguments.length - 1].$wx;
+  var $event = ($wx.detail && $wx.detail.arguments) ? $wx.detail.arguments[0] : arguments[arguments.length -1];
+  var $args = $wx.detail && $wx.detail.arguments;
+  var _vm=this;
+  return (function () {
+    _vm.myclickStop.apply(_vm, $args || [$event]);
+  })();
+}
diff --git a/packages/cli/test/core/fixtures/template/assert/v-on/0-10.tap.js b/packages/cli/test/core/fixtures/template/assert/v-on/0-10.tap.js
new file mode 100644
index 000000000..71b195565
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-on/0-10.tap.js
@@ -0,0 +1,8 @@
+function proxy () {
+  var $wx = arguments[arguments.length - 1].$wx;
+  var $args = $wx.detail && $wx.detail.arguments;
+  var _vm = this;
+  return (function () {
+    _vm.myclick(1, $args);
+  })();
+}
diff --git a/packages/cli/test/core/fixtures/template/assert/v-on/0-11.tap.js b/packages/cli/test/core/fixtures/template/assert/v-on/0-11.tap.js
new file mode 100644
index 000000000..7cc4a8b11
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-on/0-11.tap.js
@@ -0,0 +1,8 @@
+function proxy () {
+  var $wx = arguments[arguments.length - 1].$wx;
+  var $event = ($wx.detail && $wx.detail.arguments) ? $wx.detail.arguments[0] : arguments[arguments.length - 1];
+  var _vm = this;
+  return (function () {
+    _vm.myclick(1, $event);
+  })();
+}
diff --git a/packages/cli/test/core/fixtures/template/assert/v-on/0-12.tap.js b/packages/cli/test/core/fixtures/template/assert/v-on/0-12.tap.js
new file mode 100644
index 000000000..628ad109f
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-on/0-12.tap.js
@@ -0,0 +1,7 @@
+function proxy () {
+  var $wx = arguments[arguments.length - 1].$wx;
+  var _vm = this;
+  return (function () {
+    _vm.myclick(1, $wx);
+  })();
+}
diff --git a/packages/cli/test/core/fixtures/template/assert/v-on/0-13.tap.js b/packages/cli/test/core/fixtures/template/assert/v-on/0-13.tap.js
new file mode 100644
index 000000000..bfe836ced
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-on/0-13.tap.js
@@ -0,0 +1,9 @@
+function proxy () {
+  var $wx = arguments[arguments.length - 1].$wx;
+  var $event = ($wx.detail && $wx.detail.arguments) ? $wx.detail.arguments[0] : arguments[arguments.length - 1];
+  var $args = $wx.detail && $wx.detail.arguments;
+  var _vm = this;
+  return (function () {
+    _vm.myclick(1, $wx, $event, $args);
+  })();
+}
diff --git a/packages/cli/test/core/fixtures/template/assert/v-on/0-14.tap.js b/packages/cli/test/core/fixtures/template/assert/v-on/0-14.tap.js
new file mode 100644
index 000000000..29aabaac0
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-on/0-14.tap.js
@@ -0,0 +1,6 @@
+function proxy () {
+  var _vm = this;
+  return (function () {
+    _vm.myclick();
+  })();
+}
diff --git a/packages/cli/test/core/fixtures/template/assert/v-on/0-15.tap.js b/packages/cli/test/core/fixtures/template/assert/v-on/0-15.tap.js
new file mode 100644
index 000000000..3feda9091
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-on/0-15.tap.js
@@ -0,0 +1,6 @@
+function proxy () {
+  var _vm = this;
+  return (function () {
+    _vm.myclick(1);
+  })();
+}
diff --git a/packages/cli/test/core/fixtures/template/assert/v-on/0-2.tap.js b/packages/cli/test/core/fixtures/template/assert/v-on/0-2.tap.js
new file mode 100644
index 000000000..dc65576b8
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-on/0-2.tap.js
@@ -0,0 +1,9 @@
+function proxy () {
+  var $wx = arguments[arguments.length - 1].$wx;
+  var $event = ($wx.detail && $wx.detail.arguments) ? $wx.detail.arguments[0] : arguments[arguments.length -1];
+  var $args = $wx.detail && $wx.detail.arguments;
+  var _vm=this;
+  return (function () {
+    _vm.myclickCapture.apply(_vm, $args || [$event]);
+  })();
+}
diff --git a/packages/cli/test/core/fixtures/template/assert/v-on/0-3.tap.js b/packages/cli/test/core/fixtures/template/assert/v-on/0-3.tap.js
new file mode 100644
index 000000000..4215c9256
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-on/0-3.tap.js
@@ -0,0 +1,9 @@
+function proxy () {
+  var $wx = arguments[arguments.length - 1].$wx;
+  var $event = ($wx.detail && $wx.detail.arguments) ? $wx.detail.arguments[0] : arguments[arguments.length -1];
+  var $args = $wx.detail && $wx.detail.arguments;
+  var _vm=this;
+  return (function () {
+    _vm.myclickCaptureStop.apply(_vm, $args || [$event]);
+  })();
+}
diff --git a/packages/cli/test/core/fixtures/template/assert/v-on/0-4.tap.js b/packages/cli/test/core/fixtures/template/assert/v-on/0-4.tap.js
new file mode 100644
index 000000000..2e3b8f84d
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-on/0-4.tap.js
@@ -0,0 +1,6 @@
+function proxy () {
+  var _vm = this;
+  return (function () {
+    _vm.myClickCaptureStopWithParams(1, { a: 1 }, [1, 2]);
+  })();
+}
diff --git a/packages/cli/test/core/fixtures/template/assert/v-on/0-5.tap.js b/packages/cli/test/core/fixtures/template/assert/v-on/0-5.tap.js
new file mode 100644
index 000000000..3a8ab71ba
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-on/0-5.tap.js
@@ -0,0 +1,8 @@
+function proxy () {
+  var $wx = arguments[arguments.length - 1].$wx;
+  var $event = ($wx.detail && $wx.detail.arguments) ? $wx.detail.arguments[0] : arguments[arguments.length - 1];
+  var _vm = this;
+  return (function () {
+    _vm.myclick($event);
+  })();
+}
diff --git a/packages/cli/test/core/fixtures/template/assert/v-on/0-6.tap.js b/packages/cli/test/core/fixtures/template/assert/v-on/0-6.tap.js
new file mode 100644
index 000000000..e3d6567f9
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-on/0-6.tap.js
@@ -0,0 +1,6 @@
+function proxy (item) {
+  var _vm = this;
+  return (function () {
+    _vm.myClickInFor(item);
+  })();
+}
diff --git a/packages/cli/test/core/fixtures/template/assert/v-on/0-7.tap.js b/packages/cli/test/core/fixtures/template/assert/v-on/0-7.tap.js
new file mode 100644
index 000000000..c2f65d1de
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-on/0-7.tap.js
@@ -0,0 +1,9 @@
+function proxy () {
+  var $wx = arguments[arguments.length - 1].$wx;
+  var $event = ($wx.detail && $wx.detail.arguments) ? $wx.detail.arguments[0] : arguments[arguments.length - 1];
+  var $args = $wx.detail && $wx.detail.arguments;
+  var _vm = this;
+  return (function () {
+    _vm.handleCaptureBindTap.apply(_vm, $args || [$event]);
+  })();
+}
diff --git a/packages/cli/test/core/fixtures/template/assert/v-on/0-8.tap.js b/packages/cli/test/core/fixtures/template/assert/v-on/0-8.tap.js
new file mode 100644
index 000000000..3d2e112b4
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-on/0-8.tap.js
@@ -0,0 +1,9 @@
+function proxy () {
+  var $wx = arguments[arguments.length - 1].$wx;
+  var $event = ($wx.detail && $wx.detail.arguments) ? $wx.detail.arguments[0] : arguments[arguments.length - 1];
+  var $args = $wx.detail && $wx.detail.arguments;
+  var _vm = this;
+  return (function () {
+    _vm.handleCaptureCatchTap.apply(_vm, $args || [$event]);
+  })();
+}
diff --git a/packages/cli/test/core/fixtures/template/assert/v-on/0-9.click-right.js b/packages/cli/test/core/fixtures/template/assert/v-on/0-9.click-right.js
new file mode 100644
index 000000000..9972a1476
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-on/0-9.click-right.js
@@ -0,0 +1,9 @@
+function proxy () {
+  var $wx = arguments[arguments.length - 1].$wx;
+  var $event = ($wx.detail && $wx.detail.arguments) ? $wx.detail.arguments[0] : arguments[arguments.length - 1];
+  var $args = $wx.detail && $wx.detail.arguments;
+  var _vm = this;
+  return (function () {
+    _vm.rightNavbar.apply(_vm, $args || [$event]);
+  })();
+}
diff --git a/packages/cli/test/core/fixtures/template/assert/v-show.wxml b/packages/cli/test/core/fixtures/template/assert/v-show.wxml
new file mode 100644
index 000000000..8a4b9d237
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/assert/v-show.wxml
@@ -0,0 +1,2 @@
+<view hidden="{{ !(show) }}"></view>
+<view hidden="{{ !(case01 && case02) }}"></view>
diff --git a/packages/cli/test/core/fixtures/template/original/attrWithoutValue.html b/packages/cli/test/core/fixtures/template/original/attrWithoutValue.html
new file mode 100644
index 000000000..e6ecf645e
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/original/attrWithoutValue.html
@@ -0,0 +1,2 @@
+<div hidden></div>
+<scroll-view scroll-x></scroll-view>
diff --git a/packages/cli/test/core/fixtures/template/original/bindClass.html b/packages/cli/test/core/fixtures/template/original/bindClass.html
new file mode 100644
index 000000000..271e77309
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/original/bindClass.html
@@ -0,0 +1,4 @@
+<div class="default" :class="{'test': express - 1 === 0, 'has': has}"></div>
+<div :class="[ something, { 'test': test, 'has': has } ]"></div>
+<div class="default" :class="{selected: item.selected, 'has': has}"></div>
+<div class="default" :class="value >= 0 ? 'increase': 'decrease'"></div>
diff --git a/packages/cli/test/core/fixtures/template/original/bindStyle.html b/packages/cli/test/core/fixtures/template/original/bindStyle.html
new file mode 100644
index 000000000..633078931
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/original/bindStyle.html
@@ -0,0 +1 @@
+<div :style="{ 'background': current === idx ? activeColor : normalColor }"></div>
diff --git a/packages/cli/test/core/fixtures/template/original/joinStyle.html b/packages/cli/test/core/fixtures/template/original/joinStyle.html
new file mode 100644
index 000000000..c499fcefa
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/original/joinStyle.html
@@ -0,0 +1,2 @@
+<div style="width: 100rpx" :style="{ 'background': bgColor }"></div>
+<div style="height: 200rpx;" :style="{ 'font-size': titleFontSize }"></div>
diff --git a/packages/cli/test/core/fixtures/template/original/ref.html b/packages/cli/test/core/fixtures/template/original/ref.html
new file mode 100644
index 000000000..ac20fe4e6
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/original/ref.html
@@ -0,0 +1,6 @@
+<div :ref="value01"></div>
+<div :ref="value02"></div>
+<div id="hello" :ref="value03"></div>
+<div :id="hello" :ref="value04"></div>
+<custom-component-01 ref="myCom01" ></custom-component-01>
+<custom-component-02 :ref="myCom02"></custom-component-02>
\ No newline at end of file
diff --git a/packages/cli/test/core/fixtures/template/original/reference.html b/packages/cli/test/core/fixtures/template/original/reference.html
new file mode 100644
index 000000000..d8b9f9d81
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/original/reference.html
@@ -0,0 +1,5 @@
+<import src="item.wxml" />
+<template is="item" data="{{text: 'foobar'}}" />
+<include src="header.wxml" />
+<view> body </view>
+<include src="footer.wxml" />
diff --git a/packages/cli/test/core/fixtures/template/original/v-for.html b/packages/cli/test/core/fixtures/template/original/v-for.html
new file mode 100644
index 000000000..28fa0a454
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/original/v-for.html
@@ -0,0 +1,3 @@
+<view v-for="items"></view>
+<view v-for="(item, index) in items"></view>
+<view v-for="(value, key, index) in object"></view>
diff --git a/packages/cli/test/core/fixtures/template/original/v-if.html b/packages/cli/test/core/fixtures/template/original/v-if.html
new file mode 100644
index 000000000..e171a65c1
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/original/v-if.html
@@ -0,0 +1,4 @@
+<view v-if="case01"></view>
+<view v-else-if="case02"></view>
+<view v-else></view>
+<view v-if="a &lt; 1"></view>
diff --git a/packages/cli/test/core/fixtures/template/original/v-on.html b/packages/cli/test/core/fixtures/template/original/v-on.html
new file mode 100644
index 000000000..50961731c
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/original/v-on.html
@@ -0,0 +1,23 @@
+<div @tap="myclick"></div>
+<div @tap.stop="myclickStop"></div>
+<div @tap.capture="myclickCapture"></div>
+<div @tap.stop.capture="myclickCaptureStop"></div>
+<div @tap.capture.stop="myClickCaptureStopWithParams(1, {a: 1}, [1, 2])"></div>
+
+<div @tap="myclick($event)"></div>
+
+<div v-for="(item, index) in list">
+  <button @tap="myClickInFor(item)"></button>
+</div>
+
+<div capture-bind:tap="handleCaptureBindTap"></div>
+<div capture-catch:tap="handleCaptureCatchTap"></div>
+
+<div @click-right="rightNavbar"></div>
+
+<div @tap="myclick(1, arguments)"></div>
+<div @tap="myclick(1, $event)"></div>
+<div @tap="myclick(1, $wx)"></div>
+<div @tap="myclick(1, $wx, $event, arguments)"></div>
+<div @tap="myclick()"></div>
+<div @tap="myclick(1)"></div>
diff --git a/packages/cli/test/core/fixtures/template/original/v-on.wxs.html b/packages/cli/test/core/fixtures/template/original/v-on.wxs.html
new file mode 100644
index 000000000..b56e86525
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/original/v-on.wxs.html
@@ -0,0 +1,2 @@
+<div @tap="m.touchmove"></div>
+<div @tap="m1.touchmove"></div>
diff --git a/packages/cli/test/core/fixtures/template/original/v-show.html b/packages/cli/test/core/fixtures/template/original/v-show.html
new file mode 100644
index 000000000..93cba64ef
--- /dev/null
+++ b/packages/cli/test/core/fixtures/template/original/v-show.html
@@ -0,0 +1,2 @@
+<view v-show="show"></view>
+<view v-show="case01 && case02"></view>
diff --git a/packages/cli/test/core/hook.test.js b/packages/cli/test/core/hook.test.js
new file mode 100644
index 000000000..c42aef9b3
--- /dev/null
+++ b/packages/cli/test/core/hook.test.js
@@ -0,0 +1,249 @@
+const expect = require('chai').expect;
+const Hook = require('../../core/hook');
+
+describe('Hook', function() {
+  it('should register', function() {
+    const hook = new Hook();
+    const handler = function() {};
+    hook.register('process-test', handler);
+
+    expect(hook._hooks).to.have.a.property('process-test');
+    expect(hook._hooks['process-test']).to.be.a('array');
+    expect(hook._hooks['process-test']).to.includes(handler);
+  });
+
+  it('should unregister', function() {
+    const hook = new Hook();
+    const handler1 = function() {};
+    const handler2 = function() {};
+
+    const unregisterHandler1 = hook.register('process-test', handler1);
+    hook.register('process-test', handler2);
+    expect(hook._hooks['process-test']).to.includes(handler1);
+    expect(hook._hooks['process-test']).to.includes(handler2);
+
+    unregisterHandler1();
+    expect(hook._hooks['process-test']).to.not.includes(handler1);
+    expect(hook._hooks['process-test']).to.includes(handler2);
+
+    hook.unregisterAll('process-test');
+    expect(hook._hooks['process-test']).to.be.an('undefined');
+  });
+
+  it('should has hook', function() {
+    const hook = new Hook();
+    const handler = function() {};
+    hook.register('process-test', handler);
+
+    expect(hook.hasHook('process-test')).to.be.true;
+    expect(hook.hasHook('process-another')).to.be.false;
+  });
+
+  it('should hook', function() {
+    const hook = new Hook();
+    hook.register('process-test', function() {
+      return 1;
+    });
+
+    expect(hook.hook('process-test')).to.eql([1]);
+
+    hook.register('process-test', function(a) {
+      return a;
+    });
+    expect(hook.hook('process-test', 6)).to.eql([1, 6]);
+
+    hook.register('process-test', function(a, b) {
+      return a + b;
+    });
+    expect(hook.hook('process-test', 6, 66)).to.eql([1, 6, 72]);
+  });
+
+  it('should hookSeq', function() {
+    const hook = new Hook();
+
+    expect(hook.hookSeq('unknown')).to.be.undefined;
+    expect(hook.hookSeq('unknown', 1)).to.equal(1);
+    expect(hook.hookSeq('unknown', 1, 2)).to.eql([1, 2]);
+
+    hook.register('process-test', function(a) {
+      return a + 1;
+    });
+    expect(hook.hookSeq('process-test', 6)).to.equal(7);
+
+    hook.register('process-test', function(b) {
+      return b * 2;
+    });
+    expect(hook.hookSeq('process-test', 6)).to.equal(14);
+  });
+
+  it('should hookUnique', function() {
+    const hook = new Hook();
+
+    expect(hook.hookUnique('unknown')).to.be.undefined;
+
+    hook.register('process-test', function(a) {
+      return a + 1;
+    });
+    expect(hook.hookUnique('process-test', 6)).to.equal(7);
+
+    hook.register('process-test', function(a) {
+      return a * 2;
+    });
+    expect(hook.hookUnique('process-test', 6)).to.equal(12);
+  });
+
+  it('should hookUniqueReturnArg', function() {
+    const hook = new Hook();
+
+    expect(hook.hookUniqueReturnArg('unknown')).to.be.undefined;
+    expect(hook.hookUniqueReturnArg('unknown', 666)).to.equal(666);
+
+    hook.register('process-test', function(a) {
+      return a + 1;
+    });
+    expect(hook.hookUniqueReturnArg('process-test', 6)).to.equal(7);
+
+    hook.register('process-test', function(a) {
+      return a * 2;
+    });
+    expect(hook.hookUniqueReturnArg('process-test', 6)).to.equal(12);
+  });
+
+  it('should hookReturnOrigin', function() {
+    const hook = new Hook();
+    let oneFnCalled = false;
+    let twoFnCalled = false;
+
+    expect(hook.hookReturnOrigin('unknown', 6)).to.equal(6);
+    expect(hook.hookReturnOrigin('unknown', 6, 66)).to.eql([6, 66]);
+
+    hook.register('process-test', function() {
+      oneFnCalled = true;
+    });
+
+    expect(hook.hookReturnOrigin('process-test', 66)).to.equal(66);
+    expect(oneFnCalled).to.be.true;
+
+    hook.register('process-test', function() {
+      twoFnCalled = true;
+    });
+    expect(hook.hookReturnOrigin('process-test', 666)).to.equal(666);
+    expect(twoFnCalled).to.be.true;
+
+    oneFnCalled = false;
+    twoFnCalled = false;
+    expect(hook.hookReturnOrigin('process-test', 66, 666)).to.eql([66, 666]);
+    expect(oneFnCalled).to.be.true;
+    expect(twoFnCalled).to.be.true;
+  });
+
+  it('hookAsyncSeq should call then correctly', function() {
+    const hook = new Hook();
+
+    return hook
+      .hookAsyncSeq('unknown', 6)
+      .then(rst => {
+        // should return args[0]
+        expect(rst).to.equal(6);
+
+        return hook.hookAsyncSeq('unknown', 6, 66);
+      })
+      .then(rst => {
+        // should return args
+        expect(rst).to.eql([6, 66]);
+
+        hook.register('process-test', function(obj) {
+          return { count: obj.count + 1 };
+        });
+        return hook.hookAsyncSeq('process-test', { count: 6 });
+      })
+      .then(rst => {
+        // should return lastRst for one hook fn
+        expect(rst).to.eql({ count: 7 });
+
+        hook.register('process-test', function(obj) {
+          return new Promise(function(resolve) {
+            resolve({ count: obj.count + 1 });
+          });
+        });
+        return hook.hookAsyncSeq('process-test', { count: 6 });
+      })
+      .then(rst => {
+        // should return lastRst for multiple hook fns
+        expect(rst).to.eql({ count: 8 });
+
+        hook.register('process-test', function(obj) {
+          return new Promise(function(resolve) {
+            resolve({ ...obj, text: 'hello, world!' });
+          });
+        });
+        return hook.hookAsyncSeq('process-test', { count: 66 });
+      })
+      .then(rst => {
+        // should return lastRst
+        expect(rst).to.eql({ count: 68, text: 'hello, world!' });
+
+        hook.register('process-test', function(obj) {
+          return new Promise(function(resolve) {
+            resolve([obj, { more: true }]);
+          });
+        });
+        hook.register('process-test', function(obj, extra) {
+          return new Promise(function(resolve) {
+            expect(extra).to.eql({ more: true });
+            resolve([obj, extra]);
+          });
+        });
+        return hook.hookAsyncSeq('process-test', { count: 666 });
+      })
+      .then(rst => {
+        // should return lastRst[0] if args.length === 1
+        expect(rst).to.eql({ count: 668, text: 'hello, world!' });
+
+        return hook.hookAsyncSeq('process-test', { count: 6666 }, { more: false });
+      })
+      .then(rst => {
+        // should return lastRst if args.length > 1
+        expect(rst).to.eql([{ count: 6668, text: 'hello, world!' }, { more: true }]);
+      });
+  });
+
+  it('hookAsyncSeq should call catch', function(done) {
+    const hook = new Hook();
+
+    hook.register('process-test', function() {
+      return new Promise(function(resolve, reject) {
+        reject({ text: 'hi, rejected!' });
+      });
+    });
+    hook.hookAsyncSeq('process-test', { n: 6 }).catch(err => {
+      expect(err).to.eql({ text: 'hi, rejected!' });
+      done();
+    });
+  });
+
+  it('hookAsyncSeq should not call then but catch', function(done) {
+    const hook = new Hook();
+
+    hook.register('process-test', function(obj) {
+      return { n: obj.n + 1 };
+    });
+    hook.register('process-test', function() {
+      return new Promise(function(resolve, reject) {
+        reject({ text: 'hi, rejected!' });
+      });
+    });
+    hook.register('process-test', function(obj) {
+      return { n: obj.n + 2 };
+    });
+    hook
+      .hookAsyncSeq('process-test', { n: 66 })
+      .then(() => {
+        throw new Error('it will not happen!');
+      })
+      .catch(err => {
+        expect(err).to.eql({ text: 'hi, rejected!' });
+        done();
+      });
+  });
+});
diff --git a/packages/cli/test/core/init/plugin.test.js b/packages/cli/test/core/init/plugin.test.js
new file mode 100644
index 000000000..90fc80586
--- /dev/null
+++ b/packages/cli/test/core/init/plugin.test.js
@@ -0,0 +1,65 @@
+const { alias } = require('../../config');
+const expect = require('chai').expect;
+const initPlugin = require(`${alias.init}/plugin`);
+const Hook = require(`${alias.core}/hook`);
+
+const specs = {
+  normal: {
+    called: false,
+    plugins: [
+      () => {
+        specs.normal.called = true;
+      }
+    ]
+  },
+  single: {
+    called: false,
+    plugins: () => {
+      specs.single.called = true;
+    }
+  },
+  validArr: {
+    type: 'error',
+    plugins: {},
+    error: 'EXIT'
+  },
+  validSingle: {
+    type: 'error',
+    plugins: {},
+    error: 'EXIT'
+  }
+};
+
+const createCompile = plugins => {
+  const compile = new Hook();
+
+  compile.options = { plugins };
+
+  compile.logger = {
+    error() {}
+  };
+
+  initPlugin(compile);
+};
+
+const compare = (name, done) => {
+  const spec = specs[name];
+
+  if (spec.type === 'error') {
+    expect(() => createCompile(spec.plugins)).to.throw(spec.error);
+    done();
+  } else {
+    createCompile(spec.plugins);
+
+    expect(spec.called).to.be.true;
+    done();
+  }
+};
+
+describe('init plugin', function() {
+  Object.keys(specs).forEach(key => {
+    it(`test ${key} plugin`, done => {
+      compare(key, done);
+    });
+  });
+});
diff --git a/packages/cli/test/core/parseOption.test.js b/packages/cli/test/core/parseOption.test.js
new file mode 100644
index 000000000..66179e163
--- /dev/null
+++ b/packages/cli/test/core/parseOption.test.js
@@ -0,0 +1,38 @@
+const expect = require('chai').expect;
+const po = require('../../core/parseOptions');
+
+describe('parseOptions', function() {
+  it('getValue', function() {
+    expect(po.getValue({}, 'a.b.c')).to.equal(undefined);
+
+    expect(po.getValue({ a: 1 }, 'a')).to.equal(1);
+
+    expect(po.getValue({ a: { b: { c: 2 } } }, 'a.b')).to.deep.equal({ c: 2 });
+  });
+
+  it('setValue', function() {
+    expect(po.setValue({}, 'a.b.c', 1)).to.deep.equal({ a: { b: { c: 1 } } });
+
+    expect(po.setValue({ a: {}, a2: 2 }, 'a.b.c', 1)).to.deep.equal({ a: { b: { c: 1 } }, a2: 2 });
+
+    expect(po.setValue({ a: { b: 3 }, a2: 2 }, 'a.b.c', 1)).to.deep.equal({ a: { b: { c: 1 } }, a2: 2 });
+
+    expect(po.setValue({ a: { b: { c: 2, d: 3 } }, a2: 2 }, 'a.b.c', 1)).to.deep.equal({
+      a: { b: { c: 1, d: 3 } },
+      a2: 2
+    });
+  });
+
+  it('parse', function() {
+    expect(po.parse().wpyExt).to.equal('.wpy');
+
+    expect(po.parse({ wpyExt: '.vue' }).wpyExt).to.equal('.vue');
+
+    expect(po.parse({ build: { web: { resolve: { a: 1 } } } }).build.web.resolve.a).to.equal(1);
+
+    expect(
+      po.parse({ watchOption: { awaitWriteFinish: { stabilityThreshold: 1000 } } }).watchOption.awaitWriteFinish
+        .stabilityThreshold
+    ).to.equal(1000);
+  });
+});
diff --git a/packages/cli/test/core/plugins/helper/sfcCustomBlock.test.js b/packages/cli/test/core/plugins/helper/sfcCustomBlock.test.js
new file mode 100644
index 000000000..e95d01d76
--- /dev/null
+++ b/packages/cli/test/core/plugins/helper/sfcCustomBlock.test.js
@@ -0,0 +1,54 @@
+const { alias } = require('../../../config');
+const sfcCompiler = require('vue-template-compiler');
+const Hook = require(`${alias.core}/hook`);
+const initPlugin = require(`${alias.core}/init/plugin`);
+
+const expect = require('chai').expect;
+
+function createCompile() {
+  const hook = new Hook();
+  hook.options = { plugins: [] };
+  initPlugin(hook);
+
+  return hook;
+}
+
+describe('sfcCustomBlock', function() {
+  const compiler = createCompile();
+
+  it('test default lang', function() {
+    const sfc = sfcCompiler.parseComponent(
+      `
+      <config></config>
+      <wxs></wxs>
+    `,
+      { pad: 'space' }
+    );
+
+    const parsedSfc = compiler.hookSeq('sfc-custom-block', sfc);
+
+    expect(parsedSfc).to.have.a.property('config');
+    expect(parsedSfc).to.have.a.property('wxs');
+    expect(parsedSfc.config.lang).to.equal('json');
+    expect(parsedSfc.wxs).to.be.an.instanceof(Array);
+  });
+
+  it('test custom lang', function() {
+    const sfc = sfcCompiler.parseComponent(
+      `
+      <config lang="customLang1"></config>
+      <wxs lang="customLang2"></wxs>
+      <wxs></wxs>
+    `,
+      { pad: 'space' }
+    );
+
+    const parsedSfc = compiler.hookSeq('sfc-custom-block', sfc);
+
+    expect(parsedSfc).to.have.a.property('config');
+    expect(parsedSfc).to.have.a.property('wxs');
+    expect(parsedSfc.config.lang).to.equal('customLang1');
+    expect(parsedSfc.wxs).to.have.lengthOf(2);
+    expect(parsedSfc.wxs.some(_ => _.lang === 'customLang2')).to.be.true;
+  });
+});
diff --git a/packages/cli/test/core/plugins/template/parse.test.js b/packages/cli/test/core/plugins/template/parse.test.js
new file mode 100644
index 000000000..27d3d2a3c
--- /dev/null
+++ b/packages/cli/test/core/plugins/template/parse.test.js
@@ -0,0 +1,157 @@
+const { alias } = require('../../../config');
+const expect = require('chai').expect;
+const path = require('path');
+const fs = require('fs-extra');
+const Hook = require(`${alias.core}/hook`);
+const tag = require(`${alias.core}/tag`);
+const initPlugin = require(`${alias.core}/init/plugin`);
+const moduleSet = require(`${alias.core}/moduleSet`);
+
+function cached(fn) {
+  var _cache = {};
+  return function(key) {
+    if (!_cache[key]) {
+      _cache[key] = fn(key);
+    }
+    return _cache[key];
+  };
+}
+
+const getRaw = cached(function(file) {
+  const original = path.join(__dirname, '..', '..', 'fixtures/template/original', file + '.html');
+  const assert = path.join(__dirname, '..', '..', 'fixtures/template/assert', file + '.wxml');
+
+  return {
+    originalRaw: fs.readFileSync(original, 'utf-8'),
+    assertRaw: fs.readFileSync(assert, 'utf-8')
+  };
+});
+
+const spec = {
+  attr: [
+    { file: 'v-if' },
+    { file: 'v-for' },
+    { file: 'v-show' },
+    { file: 'bindClass' },
+    { file: 'joinStyle' },
+    { file: 'attrWithoutValue' },
+    { file: 'reference' },
+    {
+      file: 'ref',
+      component: {
+        'custom-component-01': '~@/component/custom-component-01',
+        'custom-component-02': '~@/component/custom-component-02'
+      }
+    }
+  ],
+  event: [
+    {
+      file: 'v-on',
+      sfc: {
+        wxs: [],
+        template: { content: getRaw('v-on').originalRaw, code: getRaw('v-on').assertRaw }
+      }
+    },
+    {
+      file: 'v-on.wxs',
+      sfc: {
+        wxs: [{ attrs: { module: 'm' } }],
+        template: { content: getRaw('v-on.wxs').originalRaw, code: getRaw('v-on.wxs').assertRaw }
+      }
+    }
+  ],
+  directives: ['v-model']
+};
+
+function createLogger(type) {
+  return function(...args) {
+    // mute silly and info
+    if (type === 'silly' || type === 'info') {
+      return;
+    }
+    /* eslint-disable no-console */
+    console.log('==== This is ' + type + ' log===');
+    console.log(...args);
+    /* eslint-enable no-console */
+  };
+}
+
+function createCompiler(options = {}) {
+  const instance = new Hook();
+  const appConfig = options.appConfig || {};
+  const userDefinedTags = appConfig.tags || {};
+  instance.options = { plugins: [] };
+
+  instance.logger = {
+    info: createLogger('info'),
+    warn: createLogger('warn'),
+    error: createLogger('error'),
+    silly: createLogger('silly')
+  };
+  instance.tags = {
+    htmlTags: tag.combineTag(tag.HTML_TAGS, userDefinedTags.htmlTags),
+    wxmlTags: tag.combineTag(tag.WXML_TAGS, userDefinedTags.wxmlTags),
+    html2wxmlMap: tag.combineTagMap(tag.HTML2WXML_MAP, userDefinedTags.html2wxmlMap),
+    selfCloseTags: tag.SELF_CLOSE_TAGS
+  };
+  initPlugin(instance);
+
+  instance.assets = new moduleSet();
+  return instance;
+}
+
+function assetHanlder(handlers) {
+  for (let id in handlers) {
+    for (let type in handlers[id]) {
+      const func = handlers[id][type];
+      const funcfile = path.join(__dirname, '..', '..', 'fixtures/template/assert/v-on/', id + '.' + type + '.js');
+      const fixture = fs.readFileSync(funcfile, 'utf-8');
+
+      try {
+        expect(func.replace(/\s*/gi, '').replace(/\n*/gi, '')).to.equal(
+          fixture.replace(/\s*/gi, '').replace(/\n*/gi, '')
+        );
+      } catch (e) {
+        /* eslint-disable no-console */
+        console.log('Compiled Handler: ' + id + '.' + type + '.js');
+        console.log(func);
+        /* eslint-enable no-console */
+        throw e;
+      }
+    }
+  }
+}
+
+function assertCodegen(originalRaw, assertRaw, options = {}, ctx, done) {
+  const compiler = createCompiler(options);
+  compiler.assets.add(ctx.file);
+  compiler
+    .hookUnique('template-parse', originalRaw, options.component || {}, ctx)
+    .then(rst => {
+      expect(rst.code).to.equal(assertRaw);
+      if (ctx.file === 'v-on') {
+        assetHanlder(rst.rel.handlers);
+      }
+      done();
+    })
+    .catch(err => {
+      done(err);
+      // throw err;
+    });
+}
+
+describe('template-parse', function() {
+  spec.attr.forEach(ctx => {
+    it('test attr: ' + ctx.file, function(done) {
+      const { originalRaw, assertRaw } = getRaw(ctx.file);
+      assertCodegen(originalRaw, assertRaw, ctx, ctx, done);
+    });
+  });
+
+  spec.event.forEach(ctx => {
+    it('test attr: ' + ctx.file, function(done) {
+      const { originalRaw, assertRaw } = getRaw(ctx.file);
+      assertCodegen(originalRaw, assertRaw, ctx, ctx, done);
+    });
+  });
+});
diff --git a/packages/cli/test/core/tag.test.js b/packages/cli/test/core/tag.test.js
new file mode 100644
index 000000000..be7c8d525
--- /dev/null
+++ b/packages/cli/test/core/tag.test.js
@@ -0,0 +1,36 @@
+const expect = require('chai').expect;
+const tag = require('../../core/tag');
+
+describe('tag', function() {
+  it('should combineTagMap', function() {
+    const additional = {
+      'test-tag-1': 'to-test-tag-1',
+      'test-tag-2': 'to-test-tag-2'
+    };
+    const ret = tag.combineTagMap(tag.HTML2WXML_MAP, additional);
+
+    expect(ret).to.include(tag.HTML2WXML_MAP);
+    expect(ret).to.include(additional);
+  });
+
+  it('should combineTag', function() {
+    let additional = 'add-test-tag-1';
+    let ret = tag.combineTag(tag.HTML_TAGS, additional);
+    expect(ret).to.include.members(tag.HTML_TAGS);
+    expect(ret).to.include(additional);
+
+    additional = 'add-test-tag-1,add-test-tag-2';
+    ret = tag.combineTag(tag.HTML_TAGS, additional);
+    expect(ret).to.include.members(tag.HTML_TAGS);
+    expect(ret).to.include.members(additional.split(','));
+
+    additional = ['add-test-tag-1', 'add-test-tag-2'];
+    ret = tag.combineTag(tag.HTML_TAGS, additional);
+    expect(ret).to.include.members(tag.HTML_TAGS);
+    expect(ret).to.include.members(additional);
+
+    additional = 123;
+    ret = tag.combineTag(tag.HTML_TAGS, additional);
+    expect(ret).to.eql(tag.HTML_TAGS);
+  });
+});
diff --git a/packages/cli/util/logger.js b/packages/cli/util/logger.js
new file mode 100644
index 000000000..adbed3af6
--- /dev/null
+++ b/packages/cli/util/logger.js
@@ -0,0 +1,43 @@
+const log = require('npmlog');
+
+const mylog = {};
+
+const datetime = (date = new Date(), format = 'HH:mm:ss') => {
+  let fn = d => {
+    return ('0' + d).slice(-2);
+  };
+  if (date && typeof date === 'string') {
+    date = new Date(Date.parse(date));
+  }
+  const formats = {
+    YYYY: date.getFullYear(),
+    MM: fn(date.getMonth() + 1),
+    DD: fn(date.getDate()),
+    HH: fn(date.getHours()),
+    mm: fn(date.getMinutes()),
+    ss: fn(date.getSeconds())
+  };
+  return format.replace(/([a-z])\1+/gi, function(a) {
+    return formats[a] || a;
+  });
+};
+
+['info', 'silly', 'verbose', 'http', 'timing', 'notice', 'silent', 'warn', 'error'].forEach(v => {
+  mylog[v] = (...args) => {
+    log.heading = '[' + datetime() + ']';
+    if (args.length === 1) {
+      args = [''].concat(args);
+    }
+    if (log.level !== 'trace') {
+      args.forEach(
+        (arg, i) =>
+          typeof arg === 'object' && arg instanceof Error && arg.stack && arg.message && (args[i] = arg.message)
+      );
+    }
+    log.log.apply(log, [v].concat(args));
+  };
+});
+
+mylog.level = v => (v ? (log.level = v) : log.level);
+
+exports = module.exports = mylog;
diff --git a/packages/wepy-compiler-babel/.npmignore b/packages/compiler-babel/.npmignore
similarity index 100%
rename from packages/wepy-compiler-babel/.npmignore
rename to packages/compiler-babel/.npmignore
diff --git a/packages/compiler-babel/CHANGELOG.md b/packages/compiler-babel/CHANGELOG.md
new file mode 100644
index 000000000..ec9142d20
--- /dev/null
+++ b/packages/compiler-babel/CHANGELOG.md
@@ -0,0 +1,64 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# 2.1.0 (2020-07-04)
+
+**Note:** Version bump only for package @wepy/compiler-babel
+
+
+
+
+
+# 2.1.0-alpha.10 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-babel
+
+
+
+
+
+# 2.1.0-alpha.9 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-babel
+
+
+
+
+
+# 2.1.0-alpha.8 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-babel
+
+
+
+
+
+# 2.1.0-alpha.7 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-babel
+
+
+
+
+
+# 2.1.0-alpha.6 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-babel
+
+
+
+
+
+# 2.1.0-alpha.5 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-babel
+
+
+
+
+
+# [2.1.0-alpha.4](https://github.com/Tencent/wepy/compare/v2.1.0-alpha.2...v2.1.0-alpha.4) (2020-06-20)
+
+**Note:** Version bump only for package @wepy/compiler-babel
diff --git a/packages/wepy-compiler-babel/README.md b/packages/compiler-babel/README.md
similarity index 91%
rename from packages/wepy-compiler-babel/README.md
rename to packages/compiler-babel/README.md
index e90b6c245..54dbd2215 100644
--- a/packages/wepy-compiler-babel/README.md
+++ b/packages/compiler-babel/README.md
@@ -3,7 +3,7 @@
 ## 安装
 
 ```
-npm install wepy-compiler-babel --save-dev
+npm install @wepy/compiler-babel --save-dev
 ```
 
 ## 配置`wepy.config.js`
diff --git a/packages/compiler-babel/index.js b/packages/compiler-babel/index.js
new file mode 100644
index 000000000..fdcbf897e
--- /dev/null
+++ b/packages/compiler-babel/index.js
@@ -0,0 +1,86 @@
+/**
+ * Tencent is pleased to support the open source community by making WePY available.
+ * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
+ * http://opensource.org/licenses/MIT
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+
+const babel = require('@babel/core');
+const path = require('path');
+
+exports = module.exports = function(options) {
+  return function() {
+    this.register('wepy-compiler-babel', function(node, ctx) {
+      let p;
+      const file = typeof ctx === 'string' ? ctx : ctx.file;
+      const outputFileName = path.basename(file, path.extname(file)) + '.js';
+      const scriptFile = node.src ? path.resolve(path.basename(file), node.src) : file;
+      try {
+        let compiled = babel.transformSync(node.content, { filename: scriptFile, ...options });
+        node.compiled = compiled;
+        if (path.extname(scriptFile) === '.ts') {
+          compiled.outputFileName = outputFileName;
+        }
+        p = Promise.resolve(node);
+      } catch (e) {
+        this.hookUnique('error-handler', {
+          type: 'error',
+          title: 'babel',
+          file: scriptFile,
+          message: e.message,
+          snapshot: e.codeFrame
+        });
+        p = Promise.reject(e);
+      }
+      return p;
+    });
+
+    /*  There are two format for the bable compilation
+     *  1. var _core = _interopRequireDefault(require("@wepy/core"));
+     *
+     *  2. var core = require("@wepy/core");
+     *     var _core2 = _interopRequireDefault(core);
+     */
+
+    // eslint-disable-next-line
+    this.register('prewalk-VariableDeclarator', function(walker, declarator, name, decl) {
+      if (walker.lang !== 'babel') return;
+
+      if (declarator.init && declarator.init.type === 'CallExpression') {
+        if (declarator.init.callee.name === 'require') {
+          const arg = declarator.init.arguments[0];
+          if (arg && arg.type === 'Literal' && arg.value === '@wepy/core') {
+            walker.scope.instances.push(declarator.id.name);
+          }
+        } else if (declarator.init.callee.name === '_interopRequireDefault') {
+          const arg = declarator.init.arguments[0];
+          if (
+            arg &&
+            arg.type === 'CallExpression' &&
+            arg.callee.name === 'require' &&
+            arg.arguments[0].value === '@wepy/core'
+          ) {
+            // var _core = _interopRequireDefault(require('@wepy/core'));
+            walker.scope.instances.push(name);
+          } else if (arg && arg.type === 'Identifier' && walker.scope.instances.indexOf(arg.name) > -1) {
+            // var core2 = _interopRequireDefault(core);
+            walker.scope.instances.push(name);
+          }
+        }
+      }
+    });
+
+    this.register('walker-detect-entry', function(walker, expression, exprName) {
+      if (walker.lang !== 'babel') return;
+      if (walker.scope.instances && walker.scope.instances.length && exprName) {
+        if (exprName.callee === 'app' || exprName.callee === 'page' || exprName.callee === 'component') {
+          if (walker.scope.instances.some(item => item + '.default' === exprName.instance)) {
+            walker.entry = expression;
+          }
+        }
+      }
+    });
+  };
+};
diff --git a/packages/compiler-babel/package-lock.json b/packages/compiler-babel/package-lock.json
new file mode 100644
index 000000000..274914c00
--- /dev/null
+++ b/packages/compiler-babel/package-lock.json
@@ -0,0 +1,1110 @@
+{
+	"name": "@wepy/compiler-babel",
+	"version": "2.1.0",
+	"lockfileVersion": 1,
+	"requires": true,
+	"dependencies": {
+		"@babel/code-frame": {
+			"version": "7.8.3",
+			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
+			"integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+			"requires": {
+				"@babel/highlight": "^7.8.3"
+			}
+		},
+		"@babel/core": {
+			"version": "7.9.0",
+			"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz",
+			"integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==",
+			"requires": {
+				"@babel/code-frame": "^7.8.3",
+				"@babel/generator": "^7.9.0",
+				"@babel/helper-module-transforms": "^7.9.0",
+				"@babel/helpers": "^7.9.0",
+				"@babel/parser": "^7.9.0",
+				"@babel/template": "^7.8.6",
+				"@babel/traverse": "^7.9.0",
+				"@babel/types": "^7.9.0",
+				"convert-source-map": "^1.7.0",
+				"debug": "^4.1.0",
+				"gensync": "^1.0.0-beta.1",
+				"json5": "^2.1.2",
+				"lodash": "^4.17.13",
+				"resolve": "^1.3.2",
+				"semver": "^5.4.1",
+				"source-map": "^0.5.0"
+			}
+		},
+		"@babel/generator": {
+			"version": "7.9.5",
+			"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz",
+			"integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==",
+			"requires": {
+				"@babel/types": "^7.9.5",
+				"jsesc": "^2.5.1",
+				"lodash": "^4.17.13",
+				"source-map": "^0.5.0"
+			}
+		},
+		"@babel/helper-function-name": {
+			"version": "7.9.5",
+			"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz",
+			"integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==",
+			"requires": {
+				"@babel/helper-get-function-arity": "^7.8.3",
+				"@babel/template": "^7.8.3",
+				"@babel/types": "^7.9.5"
+			}
+		},
+		"@babel/helper-get-function-arity": {
+			"version": "7.8.3",
+			"resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
+			"integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+			"requires": {
+				"@babel/types": "^7.8.3"
+			}
+		},
+		"@babel/helper-member-expression-to-functions": {
+			"version": "7.8.3",
+			"resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz",
+			"integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==",
+			"requires": {
+				"@babel/types": "^7.8.3"
+			}
+		},
+		"@babel/helper-module-imports": {
+			"version": "7.8.3",
+			"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz",
+			"integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==",
+			"requires": {
+				"@babel/types": "^7.8.3"
+			}
+		},
+		"@babel/helper-module-transforms": {
+			"version": "7.9.0",
+			"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz",
+			"integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==",
+			"requires": {
+				"@babel/helper-module-imports": "^7.8.3",
+				"@babel/helper-replace-supers": "^7.8.6",
+				"@babel/helper-simple-access": "^7.8.3",
+				"@babel/helper-split-export-declaration": "^7.8.3",
+				"@babel/template": "^7.8.6",
+				"@babel/types": "^7.9.0",
+				"lodash": "^4.17.13"
+			}
+		},
+		"@babel/helper-optimise-call-expression": {
+			"version": "7.8.3",
+			"resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz",
+			"integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==",
+			"requires": {
+				"@babel/types": "^7.8.3"
+			}
+		},
+		"@babel/helper-replace-supers": {
+			"version": "7.8.6",
+			"resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz",
+			"integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==",
+			"requires": {
+				"@babel/helper-member-expression-to-functions": "^7.8.3",
+				"@babel/helper-optimise-call-expression": "^7.8.3",
+				"@babel/traverse": "^7.8.6",
+				"@babel/types": "^7.8.6"
+			}
+		},
+		"@babel/helper-simple-access": {
+			"version": "7.8.3",
+			"resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz",
+			"integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==",
+			"requires": {
+				"@babel/template": "^7.8.3",
+				"@babel/types": "^7.8.3"
+			}
+		},
+		"@babel/helper-split-export-declaration": {
+			"version": "7.8.3",
+			"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
+			"integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+			"requires": {
+				"@babel/types": "^7.8.3"
+			}
+		},
+		"@babel/helper-validator-identifier": {
+			"version": "7.9.5",
+			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz",
+			"integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g=="
+		},
+		"@babel/helpers": {
+			"version": "7.9.2",
+			"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz",
+			"integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==",
+			"requires": {
+				"@babel/template": "^7.8.3",
+				"@babel/traverse": "^7.9.0",
+				"@babel/types": "^7.9.0"
+			}
+		},
+		"@babel/highlight": {
+			"version": "7.9.0",
+			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
+			"integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
+			"requires": {
+				"@babel/helper-validator-identifier": "^7.9.0",
+				"chalk": "^2.0.0",
+				"js-tokens": "^4.0.0"
+			}
+		},
+		"@babel/parser": {
+			"version": "7.9.4",
+			"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
+			"integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA=="
+		},
+		"@babel/template": {
+			"version": "7.8.6",
+			"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
+			"integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+			"requires": {
+				"@babel/code-frame": "^7.8.3",
+				"@babel/parser": "^7.8.6",
+				"@babel/types": "^7.8.6"
+			}
+		},
+		"@babel/traverse": {
+			"version": "7.9.5",
+			"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz",
+			"integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==",
+			"requires": {
+				"@babel/code-frame": "^7.8.3",
+				"@babel/generator": "^7.9.5",
+				"@babel/helper-function-name": "^7.9.5",
+				"@babel/helper-split-export-declaration": "^7.8.3",
+				"@babel/parser": "^7.9.0",
+				"@babel/types": "^7.9.5",
+				"debug": "^4.1.0",
+				"globals": "^11.1.0",
+				"lodash": "^4.17.13"
+			}
+		},
+		"@babel/types": {
+			"version": "7.9.5",
+			"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
+			"integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
+			"requires": {
+				"@babel/helper-validator-identifier": "^7.9.5",
+				"lodash": "^4.17.13",
+				"to-fast-properties": "^2.0.0"
+			}
+		},
+		"acorn": {
+			"version": "5.7.4",
+			"resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
+			"integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
+			"dev": true
+		},
+		"acorn-dynamic-import": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz",
+			"integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==",
+			"dev": true,
+			"requires": {
+				"acorn": "^5.0.0"
+			}
+		},
+		"acorn-walk": {
+			"version": "7.1.1",
+			"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz",
+			"integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==",
+			"dev": true
+		},
+		"ansi-regex": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+			"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+			"dev": true
+		},
+		"ansi-styles": {
+			"version": "3.2.1",
+			"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+			"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+			"requires": {
+				"color-convert": "^1.9.0"
+			}
+		},
+		"babel-code-frame": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+			"integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+			"dev": true,
+			"requires": {
+				"chalk": "^1.1.3",
+				"esutils": "^2.0.2",
+				"js-tokens": "^3.0.2"
+			},
+			"dependencies": {
+				"ansi-styles": {
+					"version": "2.2.1",
+					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+					"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+					"dev": true
+				},
+				"chalk": {
+					"version": "1.1.3",
+					"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+					"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+					"dev": true,
+					"requires": {
+						"ansi-styles": "^2.2.1",
+						"escape-string-regexp": "^1.0.2",
+						"has-ansi": "^2.0.0",
+						"strip-ansi": "^3.0.0",
+						"supports-color": "^2.0.0"
+					}
+				},
+				"js-tokens": {
+					"version": "3.0.2",
+					"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+					"integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+					"dev": true
+				},
+				"supports-color": {
+					"version": "2.0.0",
+					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+					"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+					"dev": true
+				}
+			}
+		},
+		"babel-helper-builder-binary-assignment-operator-visitor": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
+			"integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+			"dev": true,
+			"requires": {
+				"babel-helper-explode-assignable-expression": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-call-delegate": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+			"integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+			"dev": true,
+			"requires": {
+				"babel-helper-hoist-variables": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-define-map": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+			"integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+			"dev": true,
+			"requires": {
+				"babel-helper-function-name": "^6.24.1",
+				"babel-runtime": "^6.26.0",
+				"babel-types": "^6.26.0",
+				"lodash": "^4.17.4"
+			}
+		},
+		"babel-helper-explode-assignable-expression": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
+			"integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-function-name": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+			"integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+			"dev": true,
+			"requires": {
+				"babel-helper-get-function-arity": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-get-function-arity": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+			"integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-hoist-variables": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+			"integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-optimise-call-expression": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+			"integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-regex": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+			"integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.26.0",
+				"babel-types": "^6.26.0",
+				"lodash": "^4.17.4"
+			}
+		},
+		"babel-helper-remap-async-to-generator": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
+			"integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
+			"dev": true,
+			"requires": {
+				"babel-helper-function-name": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-helper-replace-supers": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+			"integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+			"dev": true,
+			"requires": {
+				"babel-helper-optimise-call-expression": "^6.24.1",
+				"babel-messages": "^6.23.0",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-messages": {
+			"version": "6.23.0",
+			"resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+			"integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-check-es2015-constants": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+			"integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-syntax-async-functions": {
+			"version": "6.13.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+			"integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
+			"dev": true
+		},
+		"babel-plugin-syntax-exponentiation-operator": {
+			"version": "6.13.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+			"integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
+			"dev": true
+		},
+		"babel-plugin-syntax-trailing-function-commas": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
+			"integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
+			"dev": true
+		},
+		"babel-plugin-transform-async-to-generator": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
+			"integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
+			"dev": true,
+			"requires": {
+				"babel-helper-remap-async-to-generator": "^6.24.1",
+				"babel-plugin-syntax-async-functions": "^6.8.0",
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-arrow-functions": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+			"integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-block-scoped-functions": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+			"integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-block-scoping": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+			"integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.26.0",
+				"babel-template": "^6.26.0",
+				"babel-traverse": "^6.26.0",
+				"babel-types": "^6.26.0",
+				"lodash": "^4.17.4"
+			}
+		},
+		"babel-plugin-transform-es2015-classes": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+			"integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+			"dev": true,
+			"requires": {
+				"babel-helper-define-map": "^6.24.1",
+				"babel-helper-function-name": "^6.24.1",
+				"babel-helper-optimise-call-expression": "^6.24.1",
+				"babel-helper-replace-supers": "^6.24.1",
+				"babel-messages": "^6.23.0",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-computed-properties": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+			"integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-destructuring": {
+			"version": "6.23.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+			"integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-duplicate-keys": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+			"integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-for-of": {
+			"version": "6.23.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+			"integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-function-name": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+			"integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+			"dev": true,
+			"requires": {
+				"babel-helper-function-name": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-literals": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+			"integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-modules-amd": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+			"integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+			"dev": true,
+			"requires": {
+				"babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-modules-commonjs": {
+			"version": "6.26.2",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
+			"integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
+			"dev": true,
+			"requires": {
+				"babel-plugin-transform-strict-mode": "^6.24.1",
+				"babel-runtime": "^6.26.0",
+				"babel-template": "^6.26.0",
+				"babel-types": "^6.26.0"
+			}
+		},
+		"babel-plugin-transform-es2015-modules-systemjs": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+			"integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+			"dev": true,
+			"requires": {
+				"babel-helper-hoist-variables": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-modules-umd": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+			"integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+			"dev": true,
+			"requires": {
+				"babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-object-super": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+			"integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+			"dev": true,
+			"requires": {
+				"babel-helper-replace-supers": "^6.24.1",
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-parameters": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+			"integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+			"dev": true,
+			"requires": {
+				"babel-helper-call-delegate": "^6.24.1",
+				"babel-helper-get-function-arity": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-template": "^6.24.1",
+				"babel-traverse": "^6.24.1",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-shorthand-properties": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+			"integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-spread": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+			"integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-sticky-regex": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+			"integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+			"dev": true,
+			"requires": {
+				"babel-helper-regex": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-plugin-transform-es2015-template-literals": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+			"integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-typeof-symbol": {
+			"version": "6.23.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+			"integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-es2015-unicode-regex": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+			"integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+			"dev": true,
+			"requires": {
+				"babel-helper-regex": "^6.24.1",
+				"babel-runtime": "^6.22.0",
+				"regexpu-core": "^2.0.0"
+			}
+		},
+		"babel-plugin-transform-exponentiation-operator": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
+			"integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+			"dev": true,
+			"requires": {
+				"babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
+				"babel-plugin-syntax-exponentiation-operator": "^6.8.0",
+				"babel-runtime": "^6.22.0"
+			}
+		},
+		"babel-plugin-transform-regenerator": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+			"integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+			"dev": true,
+			"requires": {
+				"regenerator-transform": "^0.10.0"
+			}
+		},
+		"babel-plugin-transform-strict-mode": {
+			"version": "6.24.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+			"integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.22.0",
+				"babel-types": "^6.24.1"
+			}
+		},
+		"babel-preset-env": {
+			"version": "1.7.0",
+			"resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz",
+			"integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==",
+			"dev": true,
+			"requires": {
+				"babel-plugin-check-es2015-constants": "^6.22.0",
+				"babel-plugin-syntax-trailing-function-commas": "^6.22.0",
+				"babel-plugin-transform-async-to-generator": "^6.22.0",
+				"babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
+				"babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
+				"babel-plugin-transform-es2015-block-scoping": "^6.23.0",
+				"babel-plugin-transform-es2015-classes": "^6.23.0",
+				"babel-plugin-transform-es2015-computed-properties": "^6.22.0",
+				"babel-plugin-transform-es2015-destructuring": "^6.23.0",
+				"babel-plugin-transform-es2015-duplicate-keys": "^6.22.0",
+				"babel-plugin-transform-es2015-for-of": "^6.23.0",
+				"babel-plugin-transform-es2015-function-name": "^6.22.0",
+				"babel-plugin-transform-es2015-literals": "^6.22.0",
+				"babel-plugin-transform-es2015-modules-amd": "^6.22.0",
+				"babel-plugin-transform-es2015-modules-commonjs": "^6.23.0",
+				"babel-plugin-transform-es2015-modules-systemjs": "^6.23.0",
+				"babel-plugin-transform-es2015-modules-umd": "^6.23.0",
+				"babel-plugin-transform-es2015-object-super": "^6.22.0",
+				"babel-plugin-transform-es2015-parameters": "^6.23.0",
+				"babel-plugin-transform-es2015-shorthand-properties": "^6.22.0",
+				"babel-plugin-transform-es2015-spread": "^6.22.0",
+				"babel-plugin-transform-es2015-sticky-regex": "^6.22.0",
+				"babel-plugin-transform-es2015-template-literals": "^6.22.0",
+				"babel-plugin-transform-es2015-typeof-symbol": "^6.23.0",
+				"babel-plugin-transform-es2015-unicode-regex": "^6.22.0",
+				"babel-plugin-transform-exponentiation-operator": "^6.22.0",
+				"babel-plugin-transform-regenerator": "^6.22.0",
+				"browserslist": "^3.2.6",
+				"invariant": "^2.2.2",
+				"semver": "^5.3.0"
+			}
+		},
+		"babel-runtime": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+			"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+			"dev": true,
+			"requires": {
+				"core-js": "^2.4.0",
+				"regenerator-runtime": "^0.11.0"
+			}
+		},
+		"babel-template": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+			"integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.26.0",
+				"babel-traverse": "^6.26.0",
+				"babel-types": "^6.26.0",
+				"babylon": "^6.18.0",
+				"lodash": "^4.17.4"
+			}
+		},
+		"babel-traverse": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+			"integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+			"dev": true,
+			"requires": {
+				"babel-code-frame": "^6.26.0",
+				"babel-messages": "^6.23.0",
+				"babel-runtime": "^6.26.0",
+				"babel-types": "^6.26.0",
+				"babylon": "^6.18.0",
+				"debug": "^2.6.8",
+				"globals": "^9.18.0",
+				"invariant": "^2.2.2",
+				"lodash": "^4.17.4"
+			},
+			"dependencies": {
+				"debug": {
+					"version": "2.6.9",
+					"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+					"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+					"dev": true,
+					"requires": {
+						"ms": "2.0.0"
+					}
+				},
+				"globals": {
+					"version": "9.18.0",
+					"resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+					"integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+					"dev": true
+				},
+				"ms": {
+					"version": "2.0.0",
+					"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+					"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+					"dev": true
+				}
+			}
+		},
+		"babel-types": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+			"integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.26.0",
+				"esutils": "^2.0.2",
+				"lodash": "^4.17.4",
+				"to-fast-properties": "^1.0.3"
+			},
+			"dependencies": {
+				"to-fast-properties": {
+					"version": "1.0.3",
+					"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+					"integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+					"dev": true
+				}
+			}
+		},
+		"babylon": {
+			"version": "6.18.0",
+			"resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+			"integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+			"dev": true
+		},
+		"browserslist": {
+			"version": "3.2.8",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
+			"integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
+			"dev": true,
+			"requires": {
+				"caniuse-lite": "^1.0.30000844",
+				"electron-to-chromium": "^1.3.47"
+			}
+		},
+		"caniuse-lite": {
+			"version": "1.0.30001039",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz",
+			"integrity": "sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q==",
+			"dev": true
+		},
+		"chalk": {
+			"version": "2.4.2",
+			"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+			"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+			"requires": {
+				"ansi-styles": "^3.2.1",
+				"escape-string-regexp": "^1.0.5",
+				"supports-color": "^5.3.0"
+			}
+		},
+		"color-convert": {
+			"version": "1.9.3",
+			"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+			"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+			"requires": {
+				"color-name": "1.1.3"
+			}
+		},
+		"color-name": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+			"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+		},
+		"convert-source-map": {
+			"version": "1.7.0",
+			"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+			"integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+			"requires": {
+				"safe-buffer": "~5.1.1"
+			}
+		},
+		"core-js": {
+			"version": "2.6.11",
+			"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
+			"integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
+			"dev": true
+		},
+		"debug": {
+			"version": "4.1.1",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+			"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+			"requires": {
+				"ms": "^2.1.1"
+			}
+		},
+		"electron-to-chromium": {
+			"version": "1.3.398",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.398.tgz",
+			"integrity": "sha512-BJjxuWLKFbM5axH3vES7HKMQgAknq9PZHBkMK/rEXUQG9i1Iw5R+6hGkm6GtsQSANjSUrh/a6m32nzCNDNo/+w==",
+			"dev": true
+		},
+		"escape-string-regexp": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+			"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+		},
+		"esutils": {
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+			"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+			"dev": true
+		},
+		"gensync": {
+			"version": "1.0.0-beta.1",
+			"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
+			"integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg=="
+		},
+		"globals": {
+			"version": "11.12.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+			"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
+		},
+		"has-ansi": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+			"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+			"dev": true,
+			"requires": {
+				"ansi-regex": "^2.0.0"
+			}
+		},
+		"has-flag": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+			"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+		},
+		"invariant": {
+			"version": "2.2.4",
+			"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+			"integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+			"dev": true,
+			"requires": {
+				"loose-envify": "^1.0.0"
+			}
+		},
+		"js-tokens": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+			"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+		},
+		"jsesc": {
+			"version": "2.5.2",
+			"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+			"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
+		},
+		"json5": {
+			"version": "2.1.3",
+			"resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+			"integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+			"requires": {
+				"minimist": "^1.2.5"
+			}
+		},
+		"lodash": {
+			"version": "4.17.21",
+			"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+			"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+		},
+		"loose-envify": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+			"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+			"dev": true,
+			"requires": {
+				"js-tokens": "^3.0.0 || ^4.0.0"
+			}
+		},
+		"minimist": {
+			"version": "1.2.6",
+			"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+			"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
+		},
+		"ms": {
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+			"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+		},
+		"path-parse": {
+			"version": "1.0.7",
+			"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+			"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+		},
+		"private": {
+			"version": "0.1.8",
+			"resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+			"integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+			"dev": true
+		},
+		"regenerate": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
+			"integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
+			"dev": true
+		},
+		"regenerator-runtime": {
+			"version": "0.11.1",
+			"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+			"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+			"dev": true
+		},
+		"regenerator-transform": {
+			"version": "0.10.1",
+			"resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+			"integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.18.0",
+				"babel-types": "^6.19.0",
+				"private": "^0.1.6"
+			}
+		},
+		"regexpu-core": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+			"integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+			"dev": true,
+			"requires": {
+				"regenerate": "^1.2.1",
+				"regjsgen": "^0.2.0",
+				"regjsparser": "^0.1.4"
+			}
+		},
+		"regjsgen": {
+			"version": "0.2.0",
+			"resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+			"integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+			"dev": true
+		},
+		"regjsparser": {
+			"version": "0.1.5",
+			"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+			"integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+			"dev": true,
+			"requires": {
+				"jsesc": "~0.5.0"
+			},
+			"dependencies": {
+				"jsesc": {
+					"version": "0.5.0",
+					"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+					"integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+					"dev": true
+				}
+			}
+		},
+		"resolve": {
+			"version": "1.15.1",
+			"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+			"integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+			"requires": {
+				"path-parse": "^1.0.6"
+			}
+		},
+		"safe-buffer": {
+			"version": "5.1.2",
+			"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+			"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+		},
+		"semver": {
+			"version": "5.7.1",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+			"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+		},
+		"source-map": {
+			"version": "0.5.7",
+			"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+			"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+		},
+		"strip-ansi": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+			"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+			"dev": true,
+			"requires": {
+				"ansi-regex": "^2.0.0"
+			}
+		},
+		"supports-color": {
+			"version": "5.5.0",
+			"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+			"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+			"requires": {
+				"has-flag": "^3.0.0"
+			}
+		},
+		"to-fast-properties": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+			"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+		}
+	}
+}
diff --git a/packages/compiler-babel/package.json b/packages/compiler-babel/package.json
new file mode 100644
index 000000000..55f09621e
--- /dev/null
+++ b/packages/compiler-babel/package.json
@@ -0,0 +1,29 @@
+{
+  "name": "@wepy/compiler-babel",
+  "version": "2.1.0",
+  "description": "wepy compile babel",
+  "main": "index.js",
+  "scripts": {
+    "test": "mocha ./test/*.test.js"
+  },
+  "keywords": [
+    "babel"
+  ],
+  "author": {
+    "name": "Gcaufy"
+  },
+  "license": "MIT",
+  "dependencies": {
+    "@babel/core": "^7.1.0"
+  },
+  "readme": "ERROR: No README data found!",
+  "_id": "@wepy/compiler-babel@2.0.5",
+  "_commitid": "e4c7adb",
+  "devDependencies": {
+    "acorn": "^5.4.1",
+    "acorn-dynamic-import": "^3.0.0",
+    "acorn-walk": "^7.1.1",
+    "babel-preset-env": "^1.7.0"
+  },
+  "gitHead": "5a25776457360bbbbc54a4d059f6bc7c032d5df3"
+}
diff --git a/packages/compiler-babel/test/fixtures/app.js b/packages/compiler-babel/test/fixtures/app.js
new file mode 100644
index 000000000..4499df35b
--- /dev/null
+++ b/packages/compiler-babel/test/fixtures/app.js
@@ -0,0 +1,8 @@
+import wepy from '@wepy/core'
+
+wepy.app({
+  onLaunch() {
+    console.log('on launch')
+  }
+});
+
diff --git a/packages/compiler-babel/test/helper/ast.js b/packages/compiler-babel/test/helper/ast.js
new file mode 100644
index 000000000..f42a79edc
--- /dev/null
+++ b/packages/compiler-babel/test/helper/ast.js
@@ -0,0 +1,58 @@
+const acorn = require('acorn-dynamic-import').default;
+
+const ECMA_VERSION = 2017;
+
+const POSSIBLE_AST_OPTIONS = [
+  {
+    ranges: true,
+    locations: true,
+    ecmaVersion: ECMA_VERSION,
+    sourceType: 'module',
+    plugins: {
+      dynamicImport: true
+    }
+  },
+  {
+    ranges: true,
+    locations: true,
+    ecmaVersion: ECMA_VERSION,
+    sourceType: 'script',
+    plugins: {
+      dynamicImport: true
+    }
+  }
+];
+
+exports = module.exports = function ast(source) {
+  let ast;
+  const comments = [];
+  for (let i = 0, len = POSSIBLE_AST_OPTIONS.length; i < len; i++) {
+    if (!ast) {
+      try {
+        comments.length = 0;
+        POSSIBLE_AST_OPTIONS[i].onComment = comments;
+        ast = acorn.parse(source, POSSIBLE_AST_OPTIONS[i]);
+      } catch (e) {
+        // ignore the error
+      }
+    }
+  }
+
+  if (!ast) {
+    ast = acorn.parse(source, {
+      ranges: true,
+      locations: true,
+      ecmaVersion: ECMA_VERSION,
+      sourceType: 'module',
+      plugins: {
+        dynamicImport: true
+      },
+      onComment: comments
+    });
+  }
+
+  if (!ast || typeof ast !== 'object') {
+    throw new Error(`Source could't be parsed`);
+  }
+  return ast;
+};
diff --git a/packages/compiler-babel/test/helper/index.js b/packages/compiler-babel/test/helper/index.js
new file mode 100644
index 000000000..f57a3d675
--- /dev/null
+++ b/packages/compiler-babel/test/helper/index.js
@@ -0,0 +1,34 @@
+exports = module.exports = {
+  getNameForExpression(expression) {
+    let expr = expression;
+    const exprName = [];
+    while (expr.type === 'MemberExpression' && expr.property.type === (expr.computed ? 'Literal' : 'Identifier')) {
+      exprName.push(expr.computed ? expr.property.value : expr.property.name);
+      expr = expr.object;
+    }
+    let free;
+    if (expr.type === 'Identifier') {
+      free = this.scope.definitions.indexOf(expr.name) === -1;
+      exprName.push(this.scope.renames['$' + expr.name] || expr.name);
+    } else if (expr.type === 'ThisExpression' && this.scope.renames.$this) {
+      free = true;
+      exprName.push(this.scope.renames.$this);
+    } else if (expr.type === 'ThisExpression') {
+      free = false;
+      exprName.push('this');
+    } else {
+      return null;
+    }
+    let prefix = '';
+    for (let i = exprName.length - 1; i >= 1; i--) prefix += exprName[i] + '.';
+    const name = prefix + exprName[0];
+    const nameGeneral = prefix + '*';
+    return {
+      name,
+      nameGeneral,
+      instance: prefix.substring(0, prefix.length - 1),
+      callee: exprName[0],
+      free
+    };
+  }
+};
diff --git a/packages/compiler-babel/test/index.test.js b/packages/compiler-babel/test/index.test.js
new file mode 100644
index 000000000..c2b8aa12e
--- /dev/null
+++ b/packages/compiler-babel/test/index.test.js
@@ -0,0 +1,114 @@
+const fs = require('fs');
+const path = require('path');
+const expect = require('chai').expect;
+const compileBabel = require('../index');
+const helper = require('./helper/index');
+const ast = require('./helper/ast');
+const walk = require('acorn-walk');
+
+class Hook {
+  constructor() {
+    this._hooks = {};
+  }
+
+  register(key, fn) {
+    if (!this._hooks[key]) {
+      this._hooks[key] = [];
+    }
+    this._hooks[key].push(fn);
+  }
+  hook(key, ...args) {
+    return this._hooks[key].apply(this, args);
+  }
+  hookUnique(key, ...args) {
+    let fns = this._hooks[key] || [];
+    let lastFn = fns[fns.length - 1];
+
+    if (typeof lastFn === 'function') {
+      return lastFn.apply(this, args);
+    }
+  }
+  clear() {
+    this._hooks = {};
+  }
+}
+
+function createWalker() {
+  return {
+    lang: 'babel',
+    scope: {
+      instances: [],
+      definitions: [],
+      renames: {}
+    }
+  };
+}
+
+function createCompile(opt) {
+  let instance = new Hook();
+  compileBabel(opt || {}).call(instance);
+
+  instance.logger = {
+    error(e) {
+      /* eslint-disable no-console */
+      console.log('======= ERROR OUTPUT ======');
+      console.log(e);
+      /* eslint-enable no-console */
+    }
+  };
+  instance.register('error-handler', function(err) {
+    /* eslint-disable no-console */
+    console.error(err);
+    /* eslint-enable no-console */
+  });
+  return instance;
+}
+
+function testFixture(file) {
+  const compiler = createCompile({
+    presets: ['env']
+  });
+
+  const walker = createWalker();
+
+  const code = fs.readFileSync(path.join(__dirname, './fixtures/', file));
+
+  return compiler
+    .hookUnique(
+      'wepy-compiler-babel',
+      {
+        src: './src',
+        content: code
+      },
+      { file: file }
+    )
+    .then(rst => {
+      const data = ast(rst.compiled.code);
+
+      walk.simple(data, {
+        VariableDeclarator(node) {
+          compiler.hookUnique('prewalk-' + node.type, walker, node, node.id.name, node.id);
+        },
+        ExpressionStatement(node) {
+          const expression = node.expression;
+          if (expression.callee && expression.callee.type === 'MemberExpression') {
+            const exprName = helper.getNameForExpression.call(walker, expression.callee);
+            compiler.hookUnique('walker-detect-entry', walker, expression, exprName);
+          }
+        }
+      });
+      return walker;
+    });
+}
+
+describe('@wepy/compiler-babel', function() {
+  it('Find entry', function() {
+    return testFixture('app.js')
+      .then(walker => {
+        return !!walker.entry;
+      })
+      .then(res => {
+        expect(res).to.equal(true);
+      });
+  });
+});
diff --git a/packages/compiler-less/.npmignore b/packages/compiler-less/.npmignore
new file mode 100644
index 000000000..3c3629e64
--- /dev/null
+++ b/packages/compiler-less/.npmignore
@@ -0,0 +1 @@
+node_modules
diff --git a/packages/compiler-less/CHANGELOG.md b/packages/compiler-less/CHANGELOG.md
new file mode 100644
index 000000000..355fbb729
--- /dev/null
+++ b/packages/compiler-less/CHANGELOG.md
@@ -0,0 +1,64 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# 2.1.0 (2020-07-04)
+
+**Note:** Version bump only for package @wepy/compiler-less
+
+
+
+
+
+# 2.1.0-alpha.10 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-less
+
+
+
+
+
+# 2.1.0-alpha.9 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-less
+
+
+
+
+
+# 2.1.0-alpha.8 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-less
+
+
+
+
+
+# 2.1.0-alpha.7 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-less
+
+
+
+
+
+# 2.1.0-alpha.6 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-less
+
+
+
+
+
+# 2.1.0-alpha.5 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-less
+
+
+
+
+
+# [2.1.0-alpha.4](https://github.com/Tencent/wepy/compare/v2.1.0-alpha.2...v2.1.0-alpha.4) (2020-06-20)
+
+**Note:** Version bump only for package @wepy/compiler-less
diff --git a/packages/wepy-compiler-less/README.md b/packages/compiler-less/README.md
similarity index 69%
rename from packages/wepy-compiler-less/README.md
rename to packages/compiler-less/README.md
index 364ce6a5b..744dd3b10 100644
--- a/packages/wepy-compiler-less/README.md
+++ b/packages/compiler-less/README.md
@@ -3,7 +3,7 @@
 ## 安装
 
 ```
-npm install wepy-compiler-less --save-dev
+npm install @wepy/compiler-less less --save-dev
 ```
 
 
@@ -21,4 +21,4 @@ module.exports = {
 
 ## 参数说明
 
-[Less](https://github.com/less/less.js)
\ No newline at end of file
+[Less](https://github.com/less/less.js)
diff --git a/packages/compiler-less/createPlugin.js b/packages/compiler-less/createPlugin.js
new file mode 100644
index 000000000..11e24a1a2
--- /dev/null
+++ b/packages/compiler-less/createPlugin.js
@@ -0,0 +1,54 @@
+const fs = require('fs');
+const less = require('less');
+const loaderUtils = require('loader-utils');
+
+const matchMalformedModuleFilename = /(~[^/\\]+)\.less$/;
+const isModuleName = /^~[^/\\]+$/;
+const trailingSlash = /[/\\]$/;
+
+function createPlugin(compliation) {
+  class aliasManager extends less.FileManager {
+    supportsSync() {
+      if (less.version[0] >= 3) {
+        return true;
+      }
+      return false;
+    }
+    loadFileSync(filename, currentDirectory, options, environment) {
+      options.syncImport = true;
+      return super.loadFile(filename, currentDirectory, options, environment);
+    }
+    supports() {
+      return true;
+    }
+    loadFile(filename, dir, options) {
+      let url;
+      if (less.version[0] >= 3) {
+        if (options.ext && !isModuleName.test(filename)) {
+          url = this.tryAppendExtension(filename, options.ext);
+        } else {
+          url = filename;
+        }
+      } else {
+        url = filename.replace(matchMalformedModuleFilename, '$1');
+      }
+      const moduleRequest = loaderUtils.urlToRequest(url, url.charAt(0) === '/' ? '' : null);
+
+      return compliation.resolvers.normal.resolve({}, dir.replace(trailingSlash, ''), moduleRequest, {}).then(rst => {
+        return {
+          contents: fs.readFileSync(rst.path, 'utf-8'),
+          filename: rst.path
+        };
+      });
+    }
+  }
+
+  return {
+    install(instance, pluginManager) {
+      pluginManager.addFileManager(new aliasManager());
+    },
+    minVersion: [2, 1, 1]
+  };
+}
+
+exports = module.exports = createPlugin;
diff --git a/packages/compiler-less/index.js b/packages/compiler-less/index.js
new file mode 100644
index 000000000..08a1956f2
--- /dev/null
+++ b/packages/compiler-less/index.js
@@ -0,0 +1,45 @@
+/**
+ * Tencent is pleased to support the open source community by making WePY available.
+ * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
+ * http://opensource.org/licenses/MIT
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+
+const less = require('less');
+const createPlugin = require('./createPlugin');
+
+exports = module.exports = function(options) {
+  return function() {
+    this.register('wepy-compiler-less', function(node, ctx) {
+      let config = Object.assign(
+        {
+          relativeUrls: true,
+          plugins: []
+        },
+        options
+      );
+      let file = typeof ctx === 'string' ? ctx : ctx.file;
+      config.filename = file;
+      config.plugins.push(createPlugin(this));
+
+      return less.render(node.content || '', config).then(rst => {
+        node.compiled = {
+          code: rst.css,
+          dep: rst.imports
+        };
+        this.fileDep.addDeps(file, node.compiled.dep);
+        return node;
+      });
+    });
+
+    this.register('wepy-watch-file-changed-less', function(buildTask) {
+      buildTask.files = this.fileDep.getSources(buildTask.changed);
+      if (buildTask.files.includes(this.options.entry)) {
+        buildTask.partial = false;
+      }
+      return buildTask;
+    });
+  };
+};
diff --git a/packages/compiler-less/package-lock.json b/packages/compiler-less/package-lock.json
new file mode 100644
index 000000000..a2f27ebee
--- /dev/null
+++ b/packages/compiler-less/package-lock.json
@@ -0,0 +1,688 @@
+{
+	"name": "@wepy/compiler-less",
+	"version": "2.1.0",
+	"lockfileVersion": 1,
+	"requires": true,
+	"dependencies": {
+		"ajv": {
+			"version": "6.12.6",
+			"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+			"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"fast-deep-equal": "^3.1.1",
+				"fast-json-stable-stringify": "^2.0.0",
+				"json-schema-traverse": "^0.4.1",
+				"uri-js": "^4.2.2"
+			}
+		},
+		"asap": {
+			"version": "2.0.6",
+			"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+			"integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+			"dev": true,
+			"optional": true
+		},
+		"asn1": {
+			"version": "0.2.4",
+			"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+			"integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"safer-buffer": "~2.1.0"
+			}
+		},
+		"assert-plus": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+			"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+			"dev": true,
+			"optional": true
+		},
+		"asynckit": {
+			"version": "0.4.0",
+			"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+			"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+			"dev": true,
+			"optional": true
+		},
+		"aws-sign2": {
+			"version": "0.7.0",
+			"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+			"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+			"dev": true,
+			"optional": true
+		},
+		"aws4": {
+			"version": "1.10.0",
+			"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
+			"integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==",
+			"dev": true,
+			"optional": true
+		},
+		"bcrypt-pbkdf": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+			"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"tweetnacl": "^0.14.3"
+			}
+		},
+		"big.js": {
+			"version": "5.2.2",
+			"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+			"integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
+		},
+		"caseless": {
+			"version": "0.12.0",
+			"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+			"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+			"dev": true,
+			"optional": true
+		},
+		"clone": {
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+			"integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+			"dev": true
+		},
+		"combined-stream": {
+			"version": "1.0.8",
+			"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+			"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"delayed-stream": "~1.0.0"
+			}
+		},
+		"core-util-is": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+			"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+			"dev": true
+		},
+		"dashdash": {
+			"version": "1.14.1",
+			"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+			"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"assert-plus": "^1.0.0"
+			}
+		},
+		"delayed-stream": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+			"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+			"dev": true,
+			"optional": true
+		},
+		"ecc-jsbn": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+			"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"jsbn": "~0.1.0",
+				"safer-buffer": "^2.1.0"
+			}
+		},
+		"emojis-list": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+			"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
+		},
+		"enhanced-resolve": {
+			"version": "4.1.1",
+			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz",
+			"integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==",
+			"dev": true,
+			"requires": {
+				"graceful-fs": "^4.1.2",
+				"memory-fs": "^0.5.0",
+				"tapable": "^1.0.0"
+			}
+		},
+		"errno": {
+			"version": "0.1.7",
+			"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+			"integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+			"dev": true,
+			"requires": {
+				"prr": "~1.0.1"
+			}
+		},
+		"extend": {
+			"version": "3.0.2",
+			"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+			"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+			"dev": true,
+			"optional": true
+		},
+		"extsprintf": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+			"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+			"dev": true,
+			"optional": true
+		},
+		"fast-deep-equal": {
+			"version": "3.1.3",
+			"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+			"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+			"dev": true,
+			"optional": true
+		},
+		"fast-json-stable-stringify": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+			"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+			"dev": true,
+			"optional": true
+		},
+		"forever-agent": {
+			"version": "0.6.1",
+			"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+			"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+			"dev": true,
+			"optional": true
+		},
+		"form-data": {
+			"version": "2.3.3",
+			"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+			"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"asynckit": "^0.4.0",
+				"combined-stream": "^1.0.6",
+				"mime-types": "^2.1.12"
+			}
+		},
+		"fs-extra": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz",
+			"integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==",
+			"dev": true,
+			"requires": {
+				"graceful-fs": "^4.1.2",
+				"jsonfile": "^4.0.0",
+				"universalify": "^0.1.0"
+			}
+		},
+		"getpass": {
+			"version": "0.1.7",
+			"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+			"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"assert-plus": "^1.0.0"
+			}
+		},
+		"graceful-fs": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
+			"integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
+			"dev": true
+		},
+		"har-schema": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+			"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+			"dev": true,
+			"optional": true
+		},
+		"har-validator": {
+			"version": "5.1.3",
+			"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+			"integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"ajv": "^6.5.5",
+				"har-schema": "^2.0.0"
+			}
+		},
+		"http-signature": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+			"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"assert-plus": "^1.0.0",
+				"jsprim": "^1.2.2",
+				"sshpk": "^1.7.0"
+			}
+		},
+		"image-size": {
+			"version": "0.5.5",
+			"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+			"integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
+			"dev": true,
+			"optional": true
+		},
+		"inherits": {
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+			"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+			"dev": true
+		},
+		"is-typedarray": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+			"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+			"dev": true,
+			"optional": true
+		},
+		"isarray": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+			"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+			"dev": true
+		},
+		"isstream": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+			"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+			"dev": true,
+			"optional": true
+		},
+		"jsbn": {
+			"version": "0.1.1",
+			"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+			"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+			"dev": true,
+			"optional": true
+		},
+		"json-schema": {
+			"version": "0.2.3",
+			"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+			"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+			"dev": true,
+			"optional": true
+		},
+		"json-schema-traverse": {
+			"version": "0.4.1",
+			"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+			"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+			"dev": true,
+			"optional": true
+		},
+		"json-stringify-safe": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+			"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+			"dev": true,
+			"optional": true
+		},
+		"json5": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+			"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+			"requires": {
+				"minimist": "^1.2.0"
+			}
+		},
+		"jsonfile": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+			"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+			"dev": true,
+			"requires": {
+				"graceful-fs": "^4.1.6"
+			}
+		},
+		"jsprim": {
+			"version": "1.4.1",
+			"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+			"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"assert-plus": "1.0.0",
+				"extsprintf": "1.3.0",
+				"json-schema": "0.2.3",
+				"verror": "1.10.0"
+			}
+		},
+		"less": {
+			"version": "3.11.3",
+			"resolved": "https://registry.npmjs.org/less/-/less-3.11.3.tgz",
+			"integrity": "sha512-VkZiTDdtNEzXA3LgjQiC3D7/ejleBPFVvq+aRI9mIj+Zhmif5TvFPM244bT4rzkvOCvJ9q4zAztok1M7Nygagw==",
+			"dev": true,
+			"requires": {
+				"clone": "^2.1.2",
+				"errno": "^0.1.1",
+				"graceful-fs": "^4.1.2",
+				"image-size": "~0.5.0",
+				"make-dir": "^2.1.0",
+				"mime": "^1.4.1",
+				"promise": "^7.1.1",
+				"request": "^2.83.0",
+				"source-map": "~0.6.0",
+				"tslib": "^1.10.0"
+			}
+		},
+		"lessc": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/lessc/-/lessc-1.0.2.tgz",
+			"integrity": "sha512-cv7EXQRiD3Cu2Vsy3S9C89G01kOv0TrLQMoWHxscCgkMYdhEvknhaINeQkZbPmUlJ87AEzjPm0y/14Cg9j7/ug==",
+			"dev": true,
+			"requires": {
+				"less": "^3.9.0"
+			}
+		},
+		"loader-utils": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+			"integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+			"requires": {
+				"big.js": "^5.2.2",
+				"emojis-list": "^3.0.0",
+				"json5": "^1.0.1"
+			}
+		},
+		"make-dir": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+			"integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"pify": "^4.0.1",
+				"semver": "^5.6.0"
+			}
+		},
+		"memory-fs": {
+			"version": "0.5.0",
+			"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+			"integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+			"dev": true,
+			"requires": {
+				"errno": "^0.1.3",
+				"readable-stream": "^2.0.1"
+			}
+		},
+		"mime": {
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+			"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+			"dev": true,
+			"optional": true
+		},
+		"mime-db": {
+			"version": "1.44.0",
+			"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+			"integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
+			"dev": true,
+			"optional": true
+		},
+		"mime-types": {
+			"version": "2.1.27",
+			"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+			"integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"mime-db": "1.44.0"
+			}
+		},
+		"minimist": {
+			"version": "1.2.6",
+			"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+			"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
+		},
+		"oauth-sign": {
+			"version": "0.9.0",
+			"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+			"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+			"dev": true,
+			"optional": true
+		},
+		"performance-now": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+			"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+			"dev": true,
+			"optional": true
+		},
+		"pify": {
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+			"integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+			"dev": true,
+			"optional": true
+		},
+		"process-nextick-args": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+			"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+			"dev": true
+		},
+		"promise": {
+			"version": "7.3.1",
+			"resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+			"integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"asap": "~2.0.3"
+			}
+		},
+		"prr": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+			"integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+			"dev": true
+		},
+		"psl": {
+			"version": "1.8.0",
+			"resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+			"integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
+			"dev": true,
+			"optional": true
+		},
+		"punycode": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+			"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+			"dev": true,
+			"optional": true
+		},
+		"qs": {
+			"version": "6.5.2",
+			"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+			"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+			"dev": true,
+			"optional": true
+		},
+		"readable-stream": {
+			"version": "2.3.7",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+			"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+			"dev": true,
+			"requires": {
+				"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"
+			}
+		},
+		"request": {
+			"version": "2.88.2",
+			"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+			"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"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.3",
+				"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.5.0",
+				"tunnel-agent": "^0.6.0",
+				"uuid": "^3.3.2"
+			}
+		},
+		"safe-buffer": {
+			"version": "5.1.2",
+			"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+			"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+			"dev": true
+		},
+		"safer-buffer": {
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+			"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+			"dev": true,
+			"optional": true
+		},
+		"semver": {
+			"version": "5.7.1",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+			"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+			"dev": true,
+			"optional": true
+		},
+		"source-map": {
+			"version": "0.6.1",
+			"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+			"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+			"dev": true,
+			"optional": true
+		},
+		"sshpk": {
+			"version": "1.16.1",
+			"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+			"integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"asn1": "~0.2.3",
+				"assert-plus": "^1.0.0",
+				"bcrypt-pbkdf": "^1.0.0",
+				"dashdash": "^1.12.0",
+				"ecc-jsbn": "~0.1.1",
+				"getpass": "^0.1.1",
+				"jsbn": "~0.1.0",
+				"safer-buffer": "^2.0.2",
+				"tweetnacl": "~0.14.0"
+			}
+		},
+		"string_decoder": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+			"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+			"dev": true,
+			"requires": {
+				"safe-buffer": "~5.1.0"
+			}
+		},
+		"tapable": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+			"integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+			"dev": true
+		},
+		"tough-cookie": {
+			"version": "2.5.0",
+			"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+			"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"psl": "^1.1.28",
+				"punycode": "^2.1.1"
+			}
+		},
+		"tslib": {
+			"version": "1.13.0",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+			"integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+			"dev": true
+		},
+		"tunnel-agent": {
+			"version": "0.6.0",
+			"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+			"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"safe-buffer": "^5.0.1"
+			}
+		},
+		"tweetnacl": {
+			"version": "0.14.5",
+			"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+			"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+			"dev": true,
+			"optional": true
+		},
+		"universalify": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+			"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+			"dev": true
+		},
+		"uri-js": {
+			"version": "4.2.2",
+			"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+			"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"punycode": "^2.1.0"
+			}
+		},
+		"util-deprecate": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+			"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+			"dev": true
+		},
+		"uuid": {
+			"version": "3.4.0",
+			"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+			"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+			"dev": true,
+			"optional": true
+		},
+		"verror": {
+			"version": "1.10.0",
+			"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+			"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"assert-plus": "^1.0.0",
+				"core-util-is": "1.0.2",
+				"extsprintf": "^1.2.0"
+			}
+		}
+	}
+}
diff --git a/packages/compiler-less/package.json b/packages/compiler-less/package.json
new file mode 100644
index 000000000..36d834d18
--- /dev/null
+++ b/packages/compiler-less/package.json
@@ -0,0 +1,32 @@
+{
+  "name": "@wepy/compiler-less",
+  "version": "2.1.0",
+  "description": "wepy compile less",
+  "main": "index.js",
+  "scripts": {
+    "test": "node ./test/helpers/lessc.js && mocha ./test/*.test.js"
+  },
+  "keywords": [
+    "less"
+  ],
+  "dependencies": {
+    "loader-utils": "^1.1.0"
+  },
+  "peerDependencies": {
+    "less": "^2.7.1 || ^3.5.0"
+  },
+  "author": {
+    "name": "Gcaufy"
+  },
+  "license": "MIT",
+  "devDependencies": {
+    "enhanced-resolve": "^4.0.0",
+    "fs-extra": "^6.0.1",
+    "less": "^3.11.3",
+    "lessc": "^1.0.2"
+  },
+  "readme": "ERROR: No README data found!",
+  "_id": "@wepy/compiler-less@2.0.7",
+  "_commitid": "174b2e1",
+  "gitHead": "5a25776457360bbbbc54a4d059f6bc7c032d5df3"
+}
diff --git a/packages/compiler-less/test/fixtures/css/alias.css b/packages/compiler-less/test/fixtures/css/alias.css
new file mode 100644
index 000000000..e80245220
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/css/alias.css
@@ -0,0 +1,3 @@
+body {
+  color: #ff0101;
+}
diff --git a/packages/compiler-less/test/fixtures/css/basic.css b/packages/compiler-less/test/fixtures/css/basic.css
new file mode 100644
index 000000000..48951ed0d
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/css/basic.css
@@ -0,0 +1,5 @@
+.no-math {
+  width: calc(50% + (25vh - 20px));
+  foo: 3 calc(3 + 4) 11;
+  bar: calc(1 + 20%);
+}
diff --git a/packages/compiler-less/test/fixtures/css/extend.css b/packages/compiler-less/test/fixtures/css/extend.css
new file mode 100644
index 000000000..3f0230ae6
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/css/extend.css
@@ -0,0 +1,17 @@
+.some-module,
+#it-works,
+#it-works-all {
+  color: red;
+  transform: scale(2);
+}
+.some-module .sub-module,
+#it-works-all .sub-module {
+  color: green;
+}
+#it-works {
+  margin: 0;
+  transform: rotate(15deg);
+}
+#it-works-all {
+  margin: 0;
+}
diff --git a/packages/compiler-less/test/fixtures/css/function.css b/packages/compiler-less/test/fixtures/css/function.css
new file mode 100644
index 000000000..4c242b7f2
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/css/function.css
@@ -0,0 +1,9 @@
+.image-width {
+  width: 1px;
+}
+.image-height {
+  height: 1px;
+}
+.image-size {
+  width: 1px 1px;
+}
diff --git a/packages/compiler-less/test/fixtures/css/guards.css b/packages/compiler-less/test/fixtures/css/guards.css
new file mode 100644
index 000000000..03679e608
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/css/guards.css
@@ -0,0 +1,3 @@
+button {
+  foo: 1;
+}
diff --git a/packages/compiler-less/test/fixtures/css/import.css b/packages/compiler-less/test/fixtures/css/import.css
new file mode 100644
index 000000000..e80245220
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/css/import.css
@@ -0,0 +1,3 @@
+body {
+  color: #ff0101;
+}
diff --git a/packages/compiler-less/test/fixtures/css/lazy.css b/packages/compiler-less/test/fixtures/css/lazy.css
new file mode 100644
index 000000000..cd6a40c97
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/css/lazy.css
@@ -0,0 +1,3 @@
+.lazy-eval {
+  width: 9%;
+}
diff --git a/packages/compiler-less/test/fixtures/css/list-each.css b/packages/compiler-less/test/fixtures/css/list-each.css
new file mode 100644
index 000000000..442fa7094
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/css/list-each.css
@@ -0,0 +1,9 @@
+.sel-blue {
+  a: b;
+}
+.sel-green {
+  a: b;
+}
+.sel-red {
+  a: b;
+}
diff --git a/packages/compiler-less/test/fixtures/css/list.css b/packages/compiler-less/test/fixtures/css/list.css
new file mode 100644
index 000000000..4c242b7f2
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/css/list.css
@@ -0,0 +1,9 @@
+.image-width {
+  width: 1px;
+}
+.image-height {
+  height: 1px;
+}
+.image-size {
+  width: 1px 1px;
+}
diff --git a/packages/compiler-less/test/fixtures/css/selector.css b/packages/compiler-less/test/fixtures/css/selector.css
new file mode 100644
index 000000000..3eb3c4e14
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/css/selector.css
@@ -0,0 +1,25 @@
+.button-ok {
+  foo: 1;
+}
+.button-cancel {
+  foo: 1;
+}
+.button-custom {
+  foo: 1;
+}
+.grand .parent > .grand .parent {
+  foo: 1;
+}
+.grand .parent + .grand .parent {
+  foo: 1;
+}
+.grand .parent .grand .parent {
+  foo: 1;
+}
+.grand .parent.grand .parent {
+  foo: 1;
+}
+.grand .parent,
+.grand .parentish {
+  foo: 1;
+}
diff --git a/packages/compiler-less/test/fixtures/css/uri.css b/packages/compiler-less/test/fixtures/css/uri.css
new file mode 100644
index 000000000..f1c0cfcea
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/css/uri.css
@@ -0,0 +1,10 @@
+.img {
+  background: url("imgs/vacant.gif");
+  background: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.img1 {
+  background: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.img2 {
+  background-image: "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
+}
diff --git a/packages/compiler-less/test/fixtures/less/alias.less b/packages/compiler-less/test/fixtures/less/alias.less
new file mode 100644
index 000000000..9a83f6093
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/less/alias.less
@@ -0,0 +1,5 @@
+@import '~@/colors.less';
+
+body {
+  color: @red;
+}
diff --git a/packages/compiler-less/test/fixtures/less/basic.less b/packages/compiler-less/test/fixtures/less/basic.less
new file mode 100644
index 000000000..76b153214
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/less/basic.less
@@ -0,0 +1,7 @@
+.no-math {
+  @var: 50vh/2;
+  width: calc(50% + (@var - 20px));
+  foo: 1 + 2 calc(3 + 4) 5 + 6;
+  @floor: floor(1 + .1);
+  bar: calc(@floor + 20%);
+}
diff --git a/packages/compiler-less/test/fixtures/less/extend.less b/packages/compiler-less/test/fixtures/less/extend.less
new file mode 100644
index 000000000..b053405a6
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/less/extend.less
@@ -0,0 +1,10 @@
+@import "~@/modules";
+
+#it-works:extend(.some-module) {
+  margin: 0;
+  transform+_: rotate(15deg);
+}
+
+#it-works-all:extend(.some-module all) {
+  margin: 0;
+}
diff --git a/packages/compiler-less/test/fixtures/less/fail-missing-file.less b/packages/compiler-less/test/fixtures/less/fail-missing-file.less
new file mode 100644
index 000000000..a9da12c92
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/less/fail-missing-file.less
@@ -0,0 +1,3 @@
+@import 'missingfile.less';
+
+body {color: red;}
diff --git a/packages/compiler-less/test/fixtures/less/fail-uri-alias.less b/packages/compiler-less/test/fixtures/less/fail-uri-alias.less
new file mode 100644
index 000000000..7b73e9812
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/less/fail-uri-alias.less
@@ -0,0 +1,4 @@
+.img-alias {
+  background: url("~@/vacant.gif");
+  background: data-uri("~@/vacant.gif");
+}
diff --git a/packages/compiler-less/test/fixtures/less/guards.less b/packages/compiler-less/test/fixtures/less/guards.less
new file mode 100644
index 000000000..51cf35ed2
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/less/guards.less
@@ -0,0 +1,5 @@
+@my-option: true;
+
+button when (@my-option = true) {
+  foo: 1;
+}
diff --git a/packages/compiler-less/test/fixtures/less/imgs/vacant.gif b/packages/compiler-less/test/fixtures/less/imgs/vacant.gif
new file mode 100644
index 000000000..f191b280c
Binary files /dev/null and b/packages/compiler-less/test/fixtures/less/imgs/vacant.gif differ
diff --git a/packages/compiler-less/test/fixtures/less/import.less b/packages/compiler-less/test/fixtures/less/import.less
new file mode 100644
index 000000000..1f79afb1c
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/less/import.less
@@ -0,0 +1,4 @@
+@import './vars/colors.less';
+body {
+  color: @red;
+}
diff --git a/packages/compiler-less/test/fixtures/less/lazy.less b/packages/compiler-less/test/fixtures/less/lazy.less
new file mode 100644
index 000000000..805b5ea48
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/less/lazy.less
@@ -0,0 +1,7 @@
+.lazy-eval {
+  width: @var;
+  @a: 9%;
+}
+
+@var: @a;
+@a: 100%;
diff --git a/packages/compiler-less/test/fixtures/less/list-each.less b/packages/compiler-less/test/fixtures/less/list-each.less
new file mode 100644
index 000000000..746a1eb75
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/less/list-each.less
@@ -0,0 +1,7 @@
+@selectors: blue, green, red;
+
+each(@selectors, {
+  .sel-@{value} {
+    a: b;
+  }
+});
diff --git a/packages/compiler-less/test/fixtures/less/list.less b/packages/compiler-less/test/fixtures/less/list.less
new file mode 100644
index 000000000..0ad04ba5c
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/less/list.less
@@ -0,0 +1,12 @@
+@imagePath: 'imgs/vacant.gif';
+.image-width {
+  width: image-width(@imagePath);
+}
+
+.image-height {
+  height: image-height(@imagePath);
+}
+
+.image-size {
+  width: image-size(@imagePath);
+}
diff --git a/packages/compiler-less/test/fixtures/less/selector.less b/packages/compiler-less/test/fixtures/less/selector.less
new file mode 100644
index 000000000..b92e89f64
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/less/selector.less
@@ -0,0 +1,36 @@
+.button {
+  &-ok {
+    foo: 1;
+  }
+  &-cancel {
+    foo: 1;
+  }
+
+  &-custom {
+    foo: 1;
+  }
+}
+
+.grand {
+  .parent {
+    & > & {
+      foo: 1;
+    }
+
+    & + & {
+      foo: 1;
+    }
+
+    & & {
+      foo: 1;
+    }
+
+    && {
+      foo: 1;
+    }
+
+    &, &ish {
+      foo: 1;
+    }
+  }
+}
diff --git a/packages/compiler-less/test/fixtures/less/uri.less b/packages/compiler-less/test/fixtures/less/uri.less
new file mode 100644
index 000000000..e2d954bd1
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/less/uri.less
@@ -0,0 +1,14 @@
+@base64: "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
+
+.img {
+  background: url("imgs/vacant.gif");
+  background: data-uri("imgs/vacant.gif");
+}
+
+.img1 {
+  background: data-uri("imgs/vacant.gif");
+}
+
+.img2 {
+  background-image: @base64;
+}
diff --git a/packages/compiler-less/test/fixtures/less/vars/colors.less b/packages/compiler-less/test/fixtures/less/vars/colors.less
new file mode 100644
index 000000000..2f7a69380
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/less/vars/colors.less
@@ -0,0 +1 @@
+@red: #ff0101;
diff --git a/packages/compiler-less/test/fixtures/less/vars/modules.less b/packages/compiler-less/test/fixtures/less/vars/modules.less
new file mode 100644
index 000000000..190c4f201
--- /dev/null
+++ b/packages/compiler-less/test/fixtures/less/vars/modules.less
@@ -0,0 +1,7 @@
+.some-module {
+  color: red;
+  transform+_: scale(2);
+  .sub-module {
+    color: green;
+  }
+}
\ No newline at end of file
diff --git a/packages/compiler-less/test/helpers/lessc.js b/packages/compiler-less/test/helpers/lessc.js
new file mode 100644
index 000000000..1901ca2ba
--- /dev/null
+++ b/packages/compiler-less/test/helpers/lessc.js
@@ -0,0 +1,48 @@
+const { exec } = require('child_process');
+const path = require('path');
+const fs = require('fs-extra');
+const less = require('less');
+const specs = require('./specs');
+
+const projectPath = path.resolve(__dirname, '..', '..');
+const fixturesPath = path.resolve(projectPath, 'test', 'fixtures');
+const lessPath = path.resolve(fixturesPath, 'less');
+const cssPath = path.resolve(fixturesPath, 'css');
+
+// Ignore the fail test cases;
+let ids = specs.getIds().filter(v => !/^fail-/.test(v));
+
+ids.forEach(id => {
+  const lessFile = path.join(lessPath, `${id}.less`);
+  const css = path.join(cssPath, `${id}.css`);
+  const tmpless = path.join(lessPath, `${id}.tmp.less`);
+
+  let replaces = specs.getReplacements(id);
+
+  let content = fs.readFileSync(lessFile, 'utf-8');
+
+  replaces.forEach(r => {
+    content = content.replace(r[0], r[1]);
+  });
+  fs.outputFileSync(tmpless, content);
+
+  let options = specs.getLesscOpt(id);
+
+  let relativeUrls = '--relative-urls';
+  if (less.version[0] >= 3 && less.version[1] >= 8) {
+    // https://github.com/less/less.js/blob/59e919b3fc968a403405e39cf15237936b1a6b46/bin/lessc#L479-L484
+    relativeUrls = '--rewrite-urls=all';
+  }
+  let cmd = `npx lessc ${relativeUrls} ${options} ${tmpless} ${css}`;
+
+  // eslint-disable-next-line
+  console.log(`Generate spec: ${id}`);
+
+  exec(cmd, { cwd: projectPath }, (err, stdout, stderr) => {
+    if (err || stdout || stderr) {
+      err = err || new Error(stdout || stderr);
+      throw err;
+    }
+    fs.removeSync(tmpless);
+  });
+});
diff --git a/packages/compiler-less/test/helpers/specs.js b/packages/compiler-less/test/helpers/specs.js
new file mode 100644
index 000000000..19eaa3fe9
--- /dev/null
+++ b/packages/compiler-less/test/helpers/specs.js
@@ -0,0 +1,99 @@
+const fs = require('fs');
+const path = require('path');
+const less = require('less');
+
+const lessDir = path.resolve(__dirname, '../fixtures/less/');
+
+let tests = null;
+
+const options = {
+  basic: {
+    json: {},
+    string: [],
+    resolve: {}
+  },
+  alias: {
+    replace: [[/~@/g, '../less/vars']],
+    resolve: {
+      alias: {
+        '@': path.resolve(__dirname, '../fixtures/less/vars')
+      }
+    }
+  },
+  'fail-missing-file': {
+    error: `Can't resolve` // Error message.
+  },
+  'fail-uri-alias': {
+    then: true, // Consider as a success test case.
+    resolve: {
+      alias: {
+        '@': path.resolve(__dirname, '../fixtures/less/imgs')
+      }
+    }
+  },
+  extend: {
+    replace: [[/~@/g, '../less/vars']],
+    resolve: {
+      alias: {
+        '@': path.resolve(__dirname, '../fixtures/less/vars')
+      }
+    }
+  }
+};
+
+function compareArrayGe(arr1, arr2) {
+  return arr1.every((currentValue, index) => {
+    return currentValue >= arr2[index];
+  });
+}
+
+function versionFilter(name) {
+  const list = [
+    {
+      ge: [3, 7, 0],
+      whiteList: ['list-each.less']
+    }
+  ];
+  const lessVersion = less.version;
+
+  const allWhiteList = list.reduce((accumulator, currentValue) => {
+    return accumulator.concat(currentValue.whiteList);
+  }, []);
+  if (allWhiteList.indexOf(name) < 0) {
+    return true;
+  }
+
+  return list.some(element => {
+    if (compareArrayGe(lessVersion, element.ge) && element.whiteList.indexOf(name) >= 0) {
+      return true;
+    }
+  });
+}
+
+exports = module.exports = {
+  getIds() {
+    if (tests) {
+      return tests;
+    }
+    tests = fs
+      .readdirSync(lessDir)
+      .filter(name => path.extname(name) === '.less' && name.indexOf('.tmp') === -1 && versionFilter(name))
+      .map(name => path.basename(name, '.less'));
+    return tests;
+  },
+  getId(id) {
+    return options[id] || {};
+  },
+  getOpt(id) {
+    return this.getId(id).json || {};
+  },
+  getResolveOpt(id) {
+    return this.getId(id).resolve || {};
+  },
+  getLesscOpt(id) {
+    return (this.getId(id).string || []).join(' ');
+  },
+  getReplacements(id) {
+    return this.getId(id).replace || [];
+  }
+};
diff --git a/packages/compiler-less/test/index.test.js b/packages/compiler-less/test/index.test.js
new file mode 100644
index 000000000..f78aff042
--- /dev/null
+++ b/packages/compiler-less/test/index.test.js
@@ -0,0 +1,140 @@
+const path = require('path');
+const fs = require('fs-extra');
+const expect = require('chai').expect;
+const lessPlugin = require('../index');
+const specs = require('./helpers/specs');
+const ResolverFactory = require('enhanced-resolve').ResolverFactory;
+const NodeJsInputFileSystem = require('enhanced-resolve/lib/NodeJsInputFileSystem');
+const CachedInputFileSystem = require('enhanced-resolve/lib/CachedInputFileSystem');
+
+class Hook {
+  constructor() {
+    // file will be involved for watch
+    this.fileDep = { addDeps() {} };
+  }
+
+  register(key, fn) {
+    if (!this._fns) this._fns = {};
+    this._fns[key] = fn;
+  }
+  hook(key, ...args) {
+    return this._fns[key].apply(this, args);
+  }
+  clear() {
+    this._fns = {};
+  }
+}
+
+function createCompile(lessOpt, resolveOpt) {
+  let instance = new Hook();
+  lessPlugin(lessOpt).call(instance);
+
+  instance.resolvers = {
+    normal: ResolverFactory.createResolver(
+      Object.assign(
+        {
+          fileSystem: new CachedInputFileSystem(new NodeJsInputFileSystem(), 60000)
+        },
+        resolveOpt
+      )
+    )
+  };
+
+  instance.logger = {
+    error(e) {
+      /* eslint-disable no-console */
+      console.log('======= ERROR OUTPUT ======');
+      console.log(e);
+      /* eslint-enable no-console */
+    }
+  };
+
+  let fnNormalBak = instance.resolvers.normal.resolve;
+  instance.resolvers.normal.resolve = function(...args) {
+    return new Promise((resolve, reject) => {
+      args.push(function(err, filepath, meta) {
+        if (err) {
+          reject(err);
+        } else {
+          resolve({ path: filepath, meta: meta });
+        }
+      });
+      fnNormalBak.apply(instance.resolvers.normal, args);
+    });
+  };
+  return instance;
+}
+
+function readSpec(id, isFailSpec) {
+  let lessfile = path.join(__dirname, 'fixtures', 'less', id + '.less');
+  let expectfile = isFailSpec ? '' : path.join(__dirname, 'fixtures', 'css', id + '.css');
+
+  return {
+    node: {
+      content: fs.readFileSync(lessfile, 'utf-8')
+    },
+    file: lessfile,
+    expect: isFailSpec ? '' : fs.readFileSync(expectfile, 'utf-8')
+  };
+}
+
+function compare(id, done) {
+  let compile = createCompile(specs.getOpt(id), specs.getResolveOpt(id));
+
+  let spec = readSpec(id);
+  return compile
+    .hook('wepy-compiler-less', spec.node, spec.file)
+    .then(node => {
+      let css = node.compiled.code;
+      expect(css).to.equal(spec.expect);
+      done();
+    })
+    .catch(e => {
+      done(e);
+    });
+}
+
+function compileFail(id, done) {
+  let compile = createCompile(specs.getOpt(id), specs.getResolveOpt(id));
+
+  let spec = readSpec(id, true);
+
+  let setting = specs.getId(id);
+
+  return compile
+    .hook('wepy-compiler-less', spec.node, spec.file)
+    .then(() => {
+      // e.g. uri-alias, alias is not awared in uri, so treat as compile successfully.
+      if (setting.then) {
+        done();
+      }
+    })
+    .catch(e => {
+      if (setting.error) {
+        expect(e.line).to.be.gt(0);
+        expect(e.message).to.have.string(setting.error);
+      } else {
+        expect(e).to.be.an('error');
+      }
+      done();
+    });
+}
+
+describe('wepy-compiler-less', function() {
+  let ids = specs.getIds();
+
+  let shouldPassIds = ids.filter(id => !/^fail-/.test(id));
+
+  let shouldFailIds = ids.filter(id => /^fail-/.test(id));
+
+  shouldPassIds.forEach(id => {
+    it('Pass test cases: ' + id, function(done) {
+      compare(id, done);
+    });
+  });
+  shouldFailIds.forEach(id => {
+    it('Fail test cases: ' + id, function(done) {
+      compileFail(id, done);
+    });
+  });
+});
diff --git a/packages/compiler-postcss/CHANGELOG.md b/packages/compiler-postcss/CHANGELOG.md
new file mode 100644
index 000000000..04a774e45
--- /dev/null
+++ b/packages/compiler-postcss/CHANGELOG.md
@@ -0,0 +1,64 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# 2.1.0 (2020-07-04)
+
+**Note:** Version bump only for package @wepy/compiler-postcss
+
+
+
+
+
+# 2.1.0-alpha.10 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-postcss
+
+
+
+
+
+# 2.1.0-alpha.9 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-postcss
+
+
+
+
+
+# 2.1.0-alpha.8 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-postcss
+
+
+
+
+
+# 2.1.0-alpha.7 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-postcss
+
+
+
+
+
+# 2.1.0-alpha.6 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-postcss
+
+
+
+
+
+# 2.1.0-alpha.5 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-postcss
+
+
+
+
+
+# [2.1.0-alpha.4](https://github.com/Tencent/wepy/compare/v2.1.0-alpha.2...v2.1.0-alpha.4) (2020-06-20)
+
+**Note:** Version bump only for package @wepy/compiler-postcss
diff --git a/packages/compiler-postcss/README.md b/packages/compiler-postcss/README.md
new file mode 100644
index 000000000..09f3071aa
--- /dev/null
+++ b/packages/compiler-postcss/README.md
@@ -0,0 +1,42 @@
+# wepy postcss 编译器
+
+## 安装
+
+```
+npm install @wepy/compiler-postcss --save
+```
+
+
+## 配置 `wepy.config.js` ,以使用 `cssnext` 为例
+
+```
+const cssnext = require('cssnext');
+
+module.exports = {
+    "compilers": {
+        postcss: {
+            plugins: [
+                cssnext({
+                    browsers:['iOS 9', 'Android 4.4']
+                })
+            ],
+            map: {
+                inline: true
+            }
+        },
+    }
+};
+```
+
+## 参数说明
+配置参数为[processOptions](http://api.postcss.org/global.html#processOptions)及[plugins](http://api.postcss.org/global.html#Plugin)
+
+
+## 已知Bug
+
+使用`cssnano`插件压缩css时，由于其依赖`macaddress`存在全局变量泄露问题，将导致无法完成编译过程。
+问题相关：[Github](https://github.com/webpack-contrib/css-loader/pull/472)
+
+## Contributor
+
+[fsy0718](mailto:fsy0718@gmail.com)
diff --git a/packages/compiler-postcss/index.js b/packages/compiler-postcss/index.js
new file mode 100644
index 000000000..7802d7997
--- /dev/null
+++ b/packages/compiler-postcss/index.js
@@ -0,0 +1,22 @@
+const postcss = require('postcss');
+
+exports = module.exports = function(options = {}) {
+  const { plugins = [], ...other } = options;
+  return function() {
+    this.register('wepy-compiler-postcss', function(node, ctx) {
+      let file = typeof ctx === 'string' ? ctx : ctx.file;
+
+      return postcss(plugins)
+        .process(node.content || '', {
+          from: file,
+          ...other
+        })
+        .then(res => {
+          node.compiled = {
+            code: res.css
+          };
+          return node;
+        });
+    });
+  };
+};
diff --git a/packages/compiler-postcss/package-lock.json b/packages/compiler-postcss/package-lock.json
new file mode 100644
index 000000000..244ea9a4d
--- /dev/null
+++ b/packages/compiler-postcss/package-lock.json
@@ -0,0 +1,981 @@
+{
+	"name": "@wepy/compiler-postcss",
+	"version": "2.1.0",
+	"lockfileVersion": 1,
+	"requires": true,
+	"dependencies": {
+		"ansi-styles": {
+			"version": "3.2.1",
+			"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+			"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+			"requires": {
+				"color-convert": "^1.9.0"
+			}
+		},
+		"autoprefixer": {
+			"version": "7.2.6",
+			"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz",
+			"integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==",
+			"requires": {
+				"browserslist": "^2.11.3",
+				"caniuse-lite": "^1.0.30000805",
+				"normalize-range": "^0.1.2",
+				"num2fraction": "^1.2.2",
+				"postcss": "^6.0.17",
+				"postcss-value-parser": "^3.2.3"
+			}
+		},
+		"babel-runtime": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+			"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+			"requires": {
+				"core-js": "^2.4.0",
+				"regenerator-runtime": "^0.11.0"
+			}
+		},
+		"balanced-match": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+			"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+		},
+		"brace-expansion": {
+			"version": "1.1.11",
+			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+			"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+			"requires": {
+				"balanced-match": "^1.0.0",
+				"concat-map": "0.0.1"
+			}
+		},
+		"browser-stdout": {
+			"version": "1.3.1",
+			"resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+			"integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw=="
+		},
+		"browserslist": {
+			"version": "2.11.3",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz",
+			"integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==",
+			"requires": {
+				"caniuse-lite": "^1.0.30000792",
+				"electron-to-chromium": "^1.3.30"
+			}
+		},
+		"caniuse-api": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-2.0.0.tgz",
+			"integrity": "sha1-sd21pZZrFvSNxJmERNS7xsfZ2DQ=",
+			"requires": {
+				"browserslist": "^2.0.0",
+				"caniuse-lite": "^1.0.0",
+				"lodash.memoize": "^4.1.2",
+				"lodash.uniq": "^4.5.0"
+			}
+		},
+		"caniuse-lite": {
+			"version": "1.0.30001039",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz",
+			"integrity": "sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q=="
+		},
+		"chalk": {
+			"version": "2.4.2",
+			"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+			"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+			"requires": {
+				"ansi-styles": "^3.2.1",
+				"escape-string-regexp": "^1.0.5",
+				"supports-color": "^5.3.0"
+			}
+		},
+		"clone": {
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+			"integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
+		},
+		"color": {
+			"version": "0.11.4",
+			"resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz",
+			"integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=",
+			"requires": {
+				"clone": "^1.0.2",
+				"color-convert": "^1.3.0",
+				"color-string": "^0.3.0"
+			}
+		},
+		"color-convert": {
+			"version": "1.9.3",
+			"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+			"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+			"requires": {
+				"color-name": "1.1.3"
+			}
+		},
+		"color-name": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+			"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+		},
+		"color-string": {
+			"version": "0.3.0",
+			"resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz",
+			"integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=",
+			"requires": {
+				"color-name": "^1.0.0"
+			}
+		},
+		"commander": {
+			"version": "2.15.1",
+			"resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+			"integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="
+		},
+		"concat-map": {
+			"version": "0.0.1",
+			"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+			"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+		},
+		"core-js": {
+			"version": "2.6.11",
+			"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
+			"integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
+		},
+		"core-util-is": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+			"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+		},
+		"css-color-function": {
+			"version": "1.3.3",
+			"resolved": "https://registry.npmjs.org/css-color-function/-/css-color-function-1.3.3.tgz",
+			"integrity": "sha1-jtJMLAIFBzM5+voAS8jBQfzLKC4=",
+			"requires": {
+				"balanced-match": "0.1.0",
+				"color": "^0.11.0",
+				"debug": "^3.1.0",
+				"rgb": "~0.1.0"
+			},
+			"dependencies": {
+				"balanced-match": {
+					"version": "0.1.0",
+					"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.1.0.tgz",
+					"integrity": "sha1-tQS9BYabOSWd0MXvw12EMXbczEo="
+				}
+			}
+		},
+		"css-unit-converter": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz",
+			"integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY="
+		},
+		"debug": {
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+			"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+			"requires": {
+				"ms": "2.0.0"
+			}
+		},
+		"diff": {
+			"version": "3.5.0",
+			"resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+			"integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
+		},
+		"electron-to-chromium": {
+			"version": "1.3.398",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.398.tgz",
+			"integrity": "sha512-BJjxuWLKFbM5axH3vES7HKMQgAknq9PZHBkMK/rEXUQG9i1Iw5R+6hGkm6GtsQSANjSUrh/a6m32nzCNDNo/+w=="
+		},
+		"enhanced-resolve": {
+			"version": "4.1.1",
+			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz",
+			"integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==",
+			"requires": {
+				"graceful-fs": "^4.1.2",
+				"memory-fs": "^0.5.0",
+				"tapable": "^1.0.0"
+			}
+		},
+		"errno": {
+			"version": "0.1.7",
+			"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+			"integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+			"requires": {
+				"prr": "~1.0.1"
+			}
+		},
+		"escape-string-regexp": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+			"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+		},
+		"flatten": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz",
+			"integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg=="
+		},
+		"fs.realpath": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+			"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+		},
+		"glob": {
+			"version": "7.1.2",
+			"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+			"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+			"requires": {
+				"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"
+			}
+		},
+		"graceful-fs": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
+			"integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
+		},
+		"growl": {
+			"version": "1.10.5",
+			"resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
+			"integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA=="
+		},
+		"has-flag": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+			"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+		},
+		"he": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+			"integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0="
+		},
+		"indexes-of": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+			"integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
+		},
+		"inflight": {
+			"version": "1.0.6",
+			"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+			"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+			"requires": {
+				"once": "^1.3.0",
+				"wrappy": "1"
+			}
+		},
+		"inherits": {
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+			"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+		},
+		"is-arrayish": {
+			"version": "0.3.2",
+			"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+			"integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+		},
+		"isarray": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+			"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+		},
+		"isnumeric": {
+			"version": "0.2.0",
+			"resolved": "https://registry.npmjs.org/isnumeric/-/isnumeric-0.2.0.tgz",
+			"integrity": "sha1-ojR7o2DeGeM9D/1ZD933dVy/LmQ="
+		},
+		"lodash._reinterpolate": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+			"integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
+		},
+		"lodash.memoize": {
+			"version": "4.1.2",
+			"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+			"integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4="
+		},
+		"lodash.template": {
+			"version": "4.5.0",
+			"resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
+			"integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
+			"requires": {
+				"lodash._reinterpolate": "^3.0.0",
+				"lodash.templatesettings": "^4.0.0"
+			}
+		},
+		"lodash.templatesettings": {
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
+			"integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
+			"requires": {
+				"lodash._reinterpolate": "^3.0.0"
+			}
+		},
+		"lodash.uniq": {
+			"version": "4.5.0",
+			"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+			"integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
+		},
+		"math-expression-evaluator": {
+			"version": "1.2.22",
+			"resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.22.tgz",
+			"integrity": "sha512-L0j0tFVZBQQLeEjmWOvDLoRciIY8gQGWahvkztXUal8jH8R5Rlqo9GCvgqvXcy9LQhEWdQCVvzqAbxgYNt4blQ=="
+		},
+		"memory-fs": {
+			"version": "0.5.0",
+			"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+			"integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+			"requires": {
+				"errno": "^0.1.3",
+				"readable-stream": "^2.0.1"
+			}
+		},
+		"minimatch": {
+			"version": "3.0.4",
+			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+			"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+			"requires": {
+				"brace-expansion": "^1.1.7"
+			}
+		},
+		"minimist": {
+			"version": "0.0.8",
+			"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+			"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+		},
+		"mkdirp": {
+			"version": "0.5.1",
+			"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+			"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+			"requires": {
+				"minimist": "0.0.8"
+			}
+		},
+		"mocha": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz",
+			"integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==",
+			"requires": {
+				"browser-stdout": "1.3.1",
+				"commander": "2.15.1",
+				"debug": "3.1.0",
+				"diff": "3.5.0",
+				"escape-string-regexp": "1.0.5",
+				"glob": "7.1.2",
+				"growl": "1.10.5",
+				"he": "1.1.1",
+				"minimatch": "3.0.4",
+				"mkdirp": "0.5.1",
+				"supports-color": "5.4.0"
+			}
+		},
+		"ms": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+			"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+		},
+		"normalize-range": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+			"integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
+		},
+		"num2fraction": {
+			"version": "1.2.2",
+			"resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+			"integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4="
+		},
+		"once": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+			"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+			"requires": {
+				"wrappy": "1"
+			}
+		},
+		"onecolor": {
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/onecolor/-/onecolor-3.1.0.tgz",
+			"integrity": "sha512-YZSypViXzu3ul5LMu/m6XjJ9ol8qAy9S2VjHl5E6UlhUH1KGKWabyEJifn0Jjpw23bYDzC2ucKMPGiH5kfwSGQ=="
+		},
+		"path-is-absolute": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+			"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+		},
+		"pixrem": {
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/pixrem/-/pixrem-4.0.1.tgz",
+			"integrity": "sha1-LaSh3m7EQjxfw3lOkwuB1EkOxoY=",
+			"requires": {
+				"browserslist": "^2.0.0",
+				"postcss": "^6.0.0",
+				"reduce-css-calc": "^1.2.7"
+			}
+		},
+		"pleeease-filters": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/pleeease-filters/-/pleeease-filters-4.0.0.tgz",
+			"integrity": "sha1-ZjKy+wVkjSdY2GU4T7zteeHMrsc=",
+			"requires": {
+				"onecolor": "^3.0.4",
+				"postcss": "^6.0.1"
+			}
+		},
+		"postcss": {
+			"version": "6.0.23",
+			"resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+			"integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+			"requires": {
+				"chalk": "^2.4.1",
+				"source-map": "^0.6.1",
+				"supports-color": "^5.4.0"
+			}
+		},
+		"postcss-apply": {
+			"version": "0.8.0",
+			"resolved": "https://registry.npmjs.org/postcss-apply/-/postcss-apply-0.8.0.tgz",
+			"integrity": "sha1-FOVEu7XLbxweBIhXll15rgZrE0M=",
+			"requires": {
+				"babel-runtime": "^6.23.0",
+				"balanced-match": "^0.4.2",
+				"postcss": "^6.0.0"
+			},
+			"dependencies": {
+				"balanced-match": {
+					"version": "0.4.2",
+					"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+					"integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg="
+				}
+			}
+		},
+		"postcss-attribute-case-insensitive": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-2.0.0.tgz",
+			"integrity": "sha1-lNxCLI+QmX8WvTOjZUu77AhJY7Q=",
+			"requires": {
+				"postcss": "^6.0.0",
+				"postcss-selector-parser": "^2.2.3"
+			}
+		},
+		"postcss-calc": {
+			"version": "6.0.2",
+			"resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-6.0.2.tgz",
+			"integrity": "sha512-fiznXjEN5T42Qm7qqMCVJXS3roaj9r4xsSi+meaBVe7CJBl8t/QLOXu02Z2E6oWAMWIvCuF6JrvzFekmVEbOKA==",
+			"requires": {
+				"css-unit-converter": "^1.1.1",
+				"postcss": "^7.0.2",
+				"postcss-selector-parser": "^2.2.2",
+				"reduce-css-calc": "^2.0.0"
+			},
+			"dependencies": {
+				"postcss": {
+					"version": "7.0.27",
+					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz",
+					"integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==",
+					"requires": {
+						"chalk": "^2.4.2",
+						"source-map": "^0.6.1",
+						"supports-color": "^6.1.0"
+					}
+				},
+				"reduce-css-calc": {
+					"version": "2.1.7",
+					"resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz",
+					"integrity": "sha512-fDnlZ+AybAS3C7Q9xDq5y8A2z+lT63zLbynew/lur/IR24OQF5x98tfNwf79mzEdfywZ0a2wpM860FhFfMxZlA==",
+					"requires": {
+						"css-unit-converter": "^1.1.1",
+						"postcss-value-parser": "^3.3.0"
+					}
+				},
+				"supports-color": {
+					"version": "6.1.0",
+					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+					"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+					"requires": {
+						"has-flag": "^3.0.0"
+					}
+				}
+			}
+		},
+		"postcss-color-function": {
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/postcss-color-function/-/postcss-color-function-4.1.0.tgz",
+			"integrity": "sha512-2/fuv6mP5Lt03XbRpVfMdGC8lRP1sykme+H1bR4ARyOmSMB8LPSjcL6EAI1iX6dqUF+jNEvKIVVXhan1w/oFDQ==",
+			"requires": {
+				"css-color-function": "~1.3.3",
+				"postcss": "^6.0.23",
+				"postcss-message-helpers": "^2.0.0",
+				"postcss-value-parser": "^3.3.1"
+			}
+		},
+		"postcss-color-gray": {
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-4.1.0.tgz",
+			"integrity": "sha512-L4iLKQLdqChz6ZOgGb6dRxkBNw78JFYcJmBz1orHpZoeLtuhDDGegRtX9gSyfoCIM7rWZ3VNOyiqqvk83BEN+w==",
+			"requires": {
+				"color": "^2.0.1",
+				"postcss": "^6.0.14",
+				"postcss-message-helpers": "^2.0.0",
+				"reduce-function-call": "^1.0.2"
+			},
+			"dependencies": {
+				"color": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/color/-/color-2.0.1.tgz",
+					"integrity": "sha512-ubUCVVKfT7r2w2D3qtHakj8mbmKms+tThR8gI8zEYCbUBl8/voqFGt3kgBqGwXAopgXybnkuOq+qMYCRrp4cXw==",
+					"requires": {
+						"color-convert": "^1.9.1",
+						"color-string": "^1.5.2"
+					}
+				},
+				"color-string": {
+					"version": "1.5.3",
+					"resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz",
+					"integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==",
+					"requires": {
+						"color-name": "^1.0.0",
+						"simple-swizzle": "^0.2.2"
+					}
+				}
+			}
+		},
+		"postcss-color-hex-alpha": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-3.0.0.tgz",
+			"integrity": "sha1-HlPmyKyyN5Vej9CLfs2xuLgwn5U=",
+			"requires": {
+				"color": "^1.0.3",
+				"postcss": "^6.0.1",
+				"postcss-message-helpers": "^2.0.0"
+			},
+			"dependencies": {
+				"color": {
+					"version": "1.0.3",
+					"resolved": "https://registry.npmjs.org/color/-/color-1.0.3.tgz",
+					"integrity": "sha1-5I6DLYXxTvaU+0aIEcLVz+cptV0=",
+					"requires": {
+						"color-convert": "^1.8.2",
+						"color-string": "^1.4.0"
+					}
+				},
+				"color-string": {
+					"version": "1.5.3",
+					"resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz",
+					"integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==",
+					"requires": {
+						"color-name": "^1.0.0",
+						"simple-swizzle": "^0.2.2"
+					}
+				}
+			}
+		},
+		"postcss-color-hsl": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-color-hsl/-/postcss-color-hsl-2.0.0.tgz",
+			"integrity": "sha1-EnA2ZvoxBDDj8wpFTawThjF9WEQ=",
+			"requires": {
+				"postcss": "^6.0.1",
+				"postcss-value-parser": "^3.3.0",
+				"units-css": "^0.4.0"
+			}
+		},
+		"postcss-color-hwb": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-color-hwb/-/postcss-color-hwb-3.0.0.tgz",
+			"integrity": "sha1-NAKxnvTYSXVAwftQcr6YY8qVVx4=",
+			"requires": {
+				"color": "^1.0.3",
+				"postcss": "^6.0.1",
+				"postcss-message-helpers": "^2.0.0",
+				"reduce-function-call": "^1.0.2"
+			},
+			"dependencies": {
+				"color": {
+					"version": "1.0.3",
+					"resolved": "https://registry.npmjs.org/color/-/color-1.0.3.tgz",
+					"integrity": "sha1-5I6DLYXxTvaU+0aIEcLVz+cptV0=",
+					"requires": {
+						"color-convert": "^1.8.2",
+						"color-string": "^1.4.0"
+					}
+				},
+				"color-string": {
+					"version": "1.5.3",
+					"resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz",
+					"integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==",
+					"requires": {
+						"color-name": "^1.0.0",
+						"simple-swizzle": "^0.2.2"
+					}
+				}
+			}
+		},
+		"postcss-color-rebeccapurple": {
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-3.1.0.tgz",
+			"integrity": "sha512-212hJUk9uSsbwO5ECqVjmh/iLsmiVL1xy9ce9TVf+X3cK/ZlUIlaMdoxje/YpsL9cmUH3I7io+/G2LyWx5rg1g==",
+			"requires": {
+				"postcss": "^6.0.22",
+				"postcss-values-parser": "^1.5.0"
+			}
+		},
+		"postcss-color-rgb": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-color-rgb/-/postcss-color-rgb-2.0.0.tgz",
+			"integrity": "sha1-FFOcinExSUtILg3RzCZf9lFLUmM=",
+			"requires": {
+				"postcss": "^6.0.1",
+				"postcss-value-parser": "^3.3.0"
+			}
+		},
+		"postcss-color-rgba-fallback": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-color-rgba-fallback/-/postcss-color-rgba-fallback-3.0.0.tgz",
+			"integrity": "sha1-N9XJNToHoJJwkSqCYGu0Kg1wLAQ=",
+			"requires": {
+				"postcss": "^6.0.6",
+				"postcss-value-parser": "^3.3.0",
+				"rgb-hex": "^2.1.0"
+			}
+		},
+		"postcss-cssnext": {
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/postcss-cssnext/-/postcss-cssnext-3.1.0.tgz",
+			"integrity": "sha512-awPDhI4OKetcHCr560iVCoDuP6e/vn0r6EAqdWPpAavJMvkBSZ6kDpSN4b3mB3Ti57hQMunHHM8Wvx9PeuYXtA==",
+			"requires": {
+				"autoprefixer": "^7.1.1",
+				"caniuse-api": "^2.0.0",
+				"chalk": "^2.0.1",
+				"pixrem": "^4.0.0",
+				"pleeease-filters": "^4.0.0",
+				"postcss": "^6.0.5",
+				"postcss-apply": "^0.8.0",
+				"postcss-attribute-case-insensitive": "^2.0.0",
+				"postcss-calc": "^6.0.0",
+				"postcss-color-function": "^4.0.0",
+				"postcss-color-gray": "^4.0.0",
+				"postcss-color-hex-alpha": "^3.0.0",
+				"postcss-color-hsl": "^2.0.0",
+				"postcss-color-hwb": "^3.0.0",
+				"postcss-color-rebeccapurple": "^3.0.0",
+				"postcss-color-rgb": "^2.0.0",
+				"postcss-color-rgba-fallback": "^3.0.0",
+				"postcss-custom-media": "^6.0.0",
+				"postcss-custom-properties": "^6.1.0",
+				"postcss-custom-selectors": "^4.0.1",
+				"postcss-font-family-system-ui": "^3.0.0",
+				"postcss-font-variant": "^3.0.0",
+				"postcss-image-set-polyfill": "^0.3.5",
+				"postcss-initial": "^2.0.0",
+				"postcss-media-minmax": "^3.0.0",
+				"postcss-nesting": "^4.0.1",
+				"postcss-pseudo-class-any-link": "^4.0.0",
+				"postcss-pseudoelements": "^5.0.0",
+				"postcss-replace-overflow-wrap": "^2.0.0",
+				"postcss-selector-matches": "^3.0.1",
+				"postcss-selector-not": "^3.0.1"
+			}
+		},
+		"postcss-custom-media": {
+			"version": "6.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-6.0.0.tgz",
+			"integrity": "sha1-vlMnhBEOyylQRPtTlaGABushpzc=",
+			"requires": {
+				"postcss": "^6.0.1"
+			}
+		},
+		"postcss-custom-properties": {
+			"version": "6.3.1",
+			"resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-6.3.1.tgz",
+			"integrity": "sha512-zoiwn4sCiUFbr4KcgcNZLFkR6gVQom647L+z1p/KBVHZ1OYwT87apnS42atJtx6XlX2yI7N5fjXbFixShQO2QQ==",
+			"requires": {
+				"balanced-match": "^1.0.0",
+				"postcss": "^6.0.18"
+			}
+		},
+		"postcss-custom-selectors": {
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-4.0.1.tgz",
+			"integrity": "sha1-eBOC+UxS5yfvXKR3bqKt9JphE4I=",
+			"requires": {
+				"postcss": "^6.0.1",
+				"postcss-selector-matches": "^3.0.0"
+			}
+		},
+		"postcss-font-family-system-ui": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-font-family-system-ui/-/postcss-font-family-system-ui-3.0.0.tgz",
+			"integrity": "sha512-58G/hTxMSSKlIRpcPUjlyo6hV2MEzvcVO2m4L/T7Bb2fJTG4DYYfQjQeRvuimKQh1V1sOzCIz99g+H2aFNtlQw==",
+			"requires": {
+				"postcss": "^6.0"
+			}
+		},
+		"postcss-font-variant": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-3.0.0.tgz",
+			"integrity": "sha1-CMzIj2BQuoLtjvLMdsDGprQfGD4=",
+			"requires": {
+				"postcss": "^6.0.1"
+			}
+		},
+		"postcss-image-set-polyfill": {
+			"version": "0.3.5",
+			"resolved": "https://registry.npmjs.org/postcss-image-set-polyfill/-/postcss-image-set-polyfill-0.3.5.tgz",
+			"integrity": "sha1-Dxk0E3AM8fgr05Bm7wFtZaShgYE=",
+			"requires": {
+				"postcss": "^6.0.1",
+				"postcss-media-query-parser": "^0.2.3"
+			}
+		},
+		"postcss-initial": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-2.0.0.tgz",
+			"integrity": "sha1-cnFfczbgu3k1HZnuZcSiU6hEG6Q=",
+			"requires": {
+				"lodash.template": "^4.2.4",
+				"postcss": "^6.0.1"
+			}
+		},
+		"postcss-media-minmax": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-3.0.0.tgz",
+			"integrity": "sha1-Z1JWA3pD70C8Twdgv9BtTcadSNI=",
+			"requires": {
+				"postcss": "^6.0.1"
+			}
+		},
+		"postcss-media-query-parser": {
+			"version": "0.2.3",
+			"resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
+			"integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ="
+		},
+		"postcss-message-helpers": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz",
+			"integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4="
+		},
+		"postcss-nesting": {
+			"version": "4.2.1",
+			"resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-4.2.1.tgz",
+			"integrity": "sha512-IkyWXICwagCnlaviRexi7qOdwPw3+xVVjgFfGsxmztvRVaNxAlrypOIKqDE5mxY+BVxnId1rnUKBRQoNE2VDaA==",
+			"requires": {
+				"postcss": "^6.0.11"
+			}
+		},
+		"postcss-pseudo-class-any-link": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-4.0.0.tgz",
+			"integrity": "sha1-kVKgYT00UHIFE+iJKFS65C0O5o4=",
+			"requires": {
+				"postcss": "^6.0.1",
+				"postcss-selector-parser": "^2.2.3"
+			}
+		},
+		"postcss-pseudoelements": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-pseudoelements/-/postcss-pseudoelements-5.0.0.tgz",
+			"integrity": "sha1-7vGU6NUkZFylIKlJ6V5RjoEkAss=",
+			"requires": {
+				"postcss": "^6.0.0"
+			}
+		},
+		"postcss-replace-overflow-wrap": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-2.0.0.tgz",
+			"integrity": "sha1-eU22+qVPjbEAhUOSqTr0V2i04ls=",
+			"requires": {
+				"postcss": "^6.0.1"
+			}
+		},
+		"postcss-selector-matches": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-3.0.1.tgz",
+			"integrity": "sha1-5WNAEeE5UIgYYbvdWMLQER/8lqs=",
+			"requires": {
+				"balanced-match": "^0.4.2",
+				"postcss": "^6.0.1"
+			},
+			"dependencies": {
+				"balanced-match": {
+					"version": "0.4.2",
+					"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+					"integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg="
+				}
+			}
+		},
+		"postcss-selector-not": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-3.0.1.tgz",
+			"integrity": "sha1-Lk2y8JZTNsAefOx9tsYN/3ZzNdk=",
+			"requires": {
+				"balanced-match": "^0.4.2",
+				"postcss": "^6.0.1"
+			},
+			"dependencies": {
+				"balanced-match": {
+					"version": "0.4.2",
+					"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+					"integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg="
+				}
+			}
+		},
+		"postcss-selector-parser": {
+			"version": "2.2.3",
+			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz",
+			"integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=",
+			"requires": {
+				"flatten": "^1.0.2",
+				"indexes-of": "^1.0.1",
+				"uniq": "^1.0.1"
+			}
+		},
+		"postcss-value-parser": {
+			"version": "3.3.1",
+			"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+			"integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+		},
+		"postcss-values-parser": {
+			"version": "1.5.0",
+			"resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-1.5.0.tgz",
+			"integrity": "sha512-3M3p+2gMp0AH3da530TlX8kiO1nxdTnc3C6vr8dMxRLIlh8UYkz0/wcwptSXjhtx2Fr0TySI7a+BHDQ8NL7LaQ==",
+			"requires": {
+				"flatten": "^1.0.2",
+				"indexes-of": "^1.0.1",
+				"uniq": "^1.0.1"
+			}
+		},
+		"process-nextick-args": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+			"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+		},
+		"prr": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+			"integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
+		},
+		"readable-stream": {
+			"version": "2.3.7",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+			"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+			"requires": {
+				"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"
+			}
+		},
+		"reduce-css-calc": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz",
+			"integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=",
+			"requires": {
+				"balanced-match": "^0.4.2",
+				"math-expression-evaluator": "^1.2.14",
+				"reduce-function-call": "^1.0.1"
+			},
+			"dependencies": {
+				"balanced-match": {
+					"version": "0.4.2",
+					"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+					"integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg="
+				}
+			}
+		},
+		"reduce-function-call": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.3.tgz",
+			"integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==",
+			"requires": {
+				"balanced-match": "^1.0.0"
+			}
+		},
+		"regenerator-runtime": {
+			"version": "0.11.1",
+			"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+			"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+		},
+		"rgb": {
+			"version": "0.1.0",
+			"resolved": "https://registry.npmjs.org/rgb/-/rgb-0.1.0.tgz",
+			"integrity": "sha1-vieykej+/+rBvZlylyG/pA/AN7U="
+		},
+		"rgb-hex": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/rgb-hex/-/rgb-hex-2.1.0.tgz",
+			"integrity": "sha1-x3PF/iJoolV42SU5qCp6XOU77aY="
+		},
+		"safe-buffer": {
+			"version": "5.1.2",
+			"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+			"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+		},
+		"simple-swizzle": {
+			"version": "0.2.2",
+			"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+			"integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
+			"requires": {
+				"is-arrayish": "^0.3.1"
+			}
+		},
+		"source-map": {
+			"version": "0.6.1",
+			"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+			"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+		},
+		"string_decoder": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+			"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+			"requires": {
+				"safe-buffer": "~5.1.0"
+			}
+		},
+		"supports-color": {
+			"version": "5.4.0",
+			"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+			"integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+			"requires": {
+				"has-flag": "^3.0.0"
+			}
+		},
+		"tapable": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+			"integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="
+		},
+		"uniq": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+			"integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8="
+		},
+		"units-css": {
+			"version": "0.4.0",
+			"resolved": "https://registry.npmjs.org/units-css/-/units-css-0.4.0.tgz",
+			"integrity": "sha1-1iKGU6UZg9fBb/KPi53Dsf/tOgc=",
+			"requires": {
+				"isnumeric": "^0.2.0",
+				"viewport-dimensions": "^0.2.0"
+			}
+		},
+		"util-deprecate": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+			"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+		},
+		"viewport-dimensions": {
+			"version": "0.2.0",
+			"resolved": "https://registry.npmjs.org/viewport-dimensions/-/viewport-dimensions-0.2.0.tgz",
+			"integrity": "sha1-3nQHR9tTh/0XJfUXXpG6x2r982w="
+		},
+		"wrappy": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+			"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+		}
+	}
+}
diff --git a/packages/compiler-postcss/package.json b/packages/compiler-postcss/package.json
new file mode 100644
index 000000000..c129e7615
--- /dev/null
+++ b/packages/compiler-postcss/package.json
@@ -0,0 +1,26 @@
+{
+  "name": "@wepy/compiler-postcss",
+  "version": "2.1.0",
+  "description": "wepy compile postcss",
+  "keywords": [
+    "postcss"
+  ],
+  "author": "fsy0718 <fsy0718@gmail.com>",
+  "license": "MIT",
+  "main": "index.js",
+  "directories": {
+    "test": "test"
+  },
+  "scripts": {
+    "test": "node ./test/helpers/postcssc.js && mocha ./test/*.test.js"
+  },
+  "peerDependencies": {
+    "postcss": "^7.0.4"
+  },
+  "dependencies": {
+    "enhanced-resolve": "^4.1.0",
+    "mocha": "^5.2.0",
+    "postcss-cssnext": "^3.1.0"
+  },
+  "gitHead": "5a25776457360bbbbc54a4d059f6bc7c032d5df3"
+}
diff --git a/packages/compiler-postcss/test/fixtures/css/basic.css b/packages/compiler-postcss/test/fixtures/css/basic.css
new file mode 100644
index 000000000..f374b20e1
--- /dev/null
+++ b/packages/compiler-postcss/test/fixtures/css/basic.css
@@ -0,0 +1,33 @@
+a {
+  color: red
+}
+b {
+  color: white;
+  background-color: red;
+}
+
+a {
+  /* direct nesting (& MUST be the first part of selector)*/
+}
+
+a span {
+  color: white;
+}
+
+a {
+  /* @nest rule (for complex nesting)*/
+}
+
+span a {
+  color: blue;
+}
+
+a {
+  /* media query automatic nesting*/
+}
+
+@media (min-width: 30em) {
+  a {
+    color: yellow
+  }
+}
\ No newline at end of file
diff --git a/packages/compiler-postcss/test/fixtures/css/map.css b/packages/compiler-postcss/test/fixtures/css/map.css
new file mode 100644
index 000000000..e6ed3f324
--- /dev/null
+++ b/packages/compiler-postcss/test/fixtures/css/map.css
@@ -0,0 +1,4 @@
+a {
+  color: red
+}
+/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvZml4dHVyZXMvcG9zdGNzcy9tYXAucG9zdGNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQTtFQUNFLFVBQXVCO0NBQ3hCIiwiZmlsZSI6InRlc3QvZml4dHVyZXMvcG9zdGNzcy9tYXAucG9zdGNzcyIsInNvdXJjZXNDb250ZW50IjpbIjpyb290IHtcbiAgLS1tYWluQ29sb3I6IHJlZFxufVxuXG5hIHtcbiAgY29sb3I6IHZhcigtLW1haW5Db2xvcilcbn0iXX0= */
\ No newline at end of file
diff --git a/packages/compiler-postcss/test/fixtures/postcss/basic.postcss b/packages/compiler-postcss/test/fixtures/postcss/basic.postcss
new file mode 100644
index 000000000..87d215544
--- /dev/null
+++ b/packages/compiler-postcss/test/fixtures/postcss/basic.postcss
@@ -0,0 +1,31 @@
+:root {
+  --mainColor: red;
+    --danger-theme: {
+    color: white;
+    background-color: red;
+  }
+}
+
+a {
+  color: var(--mainColor)
+}
+b {
+    @apply --danger-theme;
+}
+
+a {
+  /* direct nesting (& MUST be the first part of selector)*/
+  & span {
+    color: white;
+  }
+
+  /* @nest rule (for complex nesting) */
+  @nest span & {
+    color: blue;
+  }
+
+  /* media query automatic nesting */
+  @media (min-width: 30em) {
+    color: yellow;
+  }
+}
\ No newline at end of file
diff --git a/packages/compiler-postcss/test/fixtures/postcss/map.postcss b/packages/compiler-postcss/test/fixtures/postcss/map.postcss
new file mode 100644
index 000000000..1946058fe
--- /dev/null
+++ b/packages/compiler-postcss/test/fixtures/postcss/map.postcss
@@ -0,0 +1,7 @@
+:root {
+  --mainColor: red
+}
+
+a {
+  color: var(--mainColor)
+}
\ No newline at end of file
diff --git a/packages/compiler-postcss/test/helpers/postcssc.js b/packages/compiler-postcss/test/helpers/postcssc.js
new file mode 100644
index 000000000..e8ede4b3b
--- /dev/null
+++ b/packages/compiler-postcss/test/helpers/postcssc.js
@@ -0,0 +1,36 @@
+const path = require('path');
+const postcss = require('postcss');
+const fs = require('fs-extra');
+const specs = require('./specs');
+
+const projectPath = path.resolve(__dirname, '..', '..');
+const fixturesPath = path.resolve(projectPath, 'test', 'fixtures');
+const postcssPath = path.resolve(fixturesPath, 'postcss');
+const cssPath = path.resolve(fixturesPath, 'css');
+
+let ids = specs.getIds();
+
+ids.forEach(id => {
+  const postcssfile = path.join(postcssPath, `${id}.postcss`);
+  const css = path.join(cssPath, `${id}.css`);
+  let content = fs.readFileSync(postcssfile, 'utf-8');
+
+  let options = specs.getOpt(id);
+
+  // eslint-disable-next-line
+  console.log(`Generate spec: ${id}`);
+  const { plugins = [], ...other } = options;
+  postcss(plugins)
+    .process(content, {
+      from: postcssfile,
+      ...other
+    })
+    .then(function(result) {
+      fs.outputFileSync(css, result.css.toString(), 'utf-8');
+    })
+    .catch(function(err) {
+      // eslint-disable-next-line
+      console.log(err);
+      return;
+    });
+});
diff --git a/packages/compiler-postcss/test/helpers/specs.js b/packages/compiler-postcss/test/helpers/specs.js
new file mode 100644
index 000000000..fb27e622c
--- /dev/null
+++ b/packages/compiler-postcss/test/helpers/specs.js
@@ -0,0 +1,50 @@
+const fs = require('fs');
+const path = require('path');
+const cssNext = require('postcss-cssnext');
+
+const postcssDir = path.resolve(__dirname, '../fixtures/postcss/');
+
+let tests = null;
+
+const options = {
+  basic: {
+    json: {
+      plugins: [cssNext()]
+    },
+    string: [],
+    resolve: {}
+  },
+  map: {
+    json: {
+      plugins: [cssNext()],
+      map: {
+        inline: true
+      }
+    }
+  }
+};
+
+exports = module.exports = {
+  getIds() {
+    if (tests) {
+      return tests;
+    }
+    tests = fs
+      .readdirSync(postcssDir)
+      .filter(name => path.extname(name) === '.postcss' && name.indexOf('.tmp') === -1)
+      .map(name => path.basename(name, '.postcss'));
+    return tests;
+  },
+  getId(id) {
+    return options[id] || {};
+  },
+  getOpt(id) {
+    return this.getId(id).json || {};
+  },
+  getResolveOpt(id) {
+    return this.getId(id).resolve || {};
+  },
+  getReplacements(id) {
+    return this.getId(id).replace || [];
+  }
+};
diff --git a/packages/compiler-postcss/test/index.test.js b/packages/compiler-postcss/test/index.test.js
new file mode 100644
index 000000000..383b9215d
--- /dev/null
+++ b/packages/compiler-postcss/test/index.test.js
@@ -0,0 +1,95 @@
+const path = require('path');
+const fs = require('fs-extra');
+const expect = require('chai').expect;
+const postcssPlugin = require('../index');
+const specs = require('./helpers/specs');
+const ResolverFactory = require('enhanced-resolve').ResolverFactory;
+const NodeJsInputFileSystem = require('enhanced-resolve/lib/NodeJsInputFileSystem');
+const CachedInputFileSystem = require('enhanced-resolve/lib/CachedInputFileSystem');
+
+class Hook {
+  register(key, fn) {
+    if (!this._fns) this._fns = {};
+    this._fns[key] = fn;
+  }
+  hook(key, ...args) {
+    return this._fns[key].apply(this, args);
+  }
+  clear() {
+    this._fns = {};
+  }
+}
+
+function createCompile(postcssOpt, resolveOpt) {
+  let instance = new Hook();
+  postcssPlugin(postcssOpt).call(instance);
+
+  instance.resolvers = {
+    normal: ResolverFactory.createResolver(
+      Object.assign(
+        {
+          fileSystem: new CachedInputFileSystem(new NodeJsInputFileSystem(), 60000)
+        },
+        resolveOpt
+      )
+    )
+  };
+
+  let fnNormalBak = instance.resolvers.normal.resolve;
+  instance.resolvers.normal.resolve = function(...args) {
+    return new Promise((resolve, reject) => {
+      args.push(function(err, filepath, meta) {
+        if (err) {
+          reject(err);
+        } else {
+          resolve({ path: filepath, meta: meta });
+        }
+      });
+      fnNormalBak.apply(instance.resolvers.normal, args);
+    });
+  };
+  return instance;
+}
+
+function readSpec(id) {
+  let postcssfile = path.join(__dirname, 'fixtures', 'postcss', id + '.postcss');
+  let expectfile = path.join(__dirname, 'fixtures', 'css', id + '.css');
+
+  return {
+    node: {
+      content: fs.readFileSync(postcssfile, 'utf-8')
+    },
+    file: postcssfile,
+    expect: fs.readFileSync(expectfile, 'utf-8')
+  };
+}
+
+function compare(id, done) {
+  let compile = createCompile(specs.getOpt(id), specs.getResolveOpt(id));
+
+  let spec = readSpec(id);
+  let ext = path.extname(spec.file);
+  let type = ext.substring(1, ext.length);
+
+  return compile
+    .hook('wepy-compiler-' + type, spec.node, spec.file)
+    .then(node => {
+      let css = node.compiled.code;
+      expect(css).to.equal(spec.expect);
+      done();
+    })
+    .catch(e => {
+      done();
+      throw e;
+    });
+}
+
+describe('wepy-compiler-postcss', function() {
+  let ids = specs.getIds();
+
+  ids.forEach(id => {
+    it('testing ' + id, function(done) {
+      compare(id, done);
+    });
+  });
+});
diff --git a/packages/wepy-compiler-less/.npmignore b/packages/compiler-sass/.npmignore
similarity index 100%
rename from packages/wepy-compiler-less/.npmignore
rename to packages/compiler-sass/.npmignore
diff --git a/packages/compiler-sass/CHANGELOG.md b/packages/compiler-sass/CHANGELOG.md
new file mode 100644
index 000000000..992985150
--- /dev/null
+++ b/packages/compiler-sass/CHANGELOG.md
@@ -0,0 +1,64 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# 2.1.0 (2020-07-04)
+
+**Note:** Version bump only for package @wepy/compiler-sass
+
+
+
+
+
+# 2.1.0-alpha.10 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-sass
+
+
+
+
+
+# 2.1.0-alpha.9 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-sass
+
+
+
+
+
+# 2.1.0-alpha.8 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-sass
+
+
+
+
+
+# 2.1.0-alpha.7 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-sass
+
+
+
+
+
+# 2.1.0-alpha.6 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-sass
+
+
+
+
+
+# 2.1.0-alpha.5 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-sass
+
+
+
+
+
+# [2.1.0-alpha.4](https://github.com/Tencent/wepy/compare/v2.1.0-alpha.2...v2.1.0-alpha.4) (2020-06-20)
+
+**Note:** Version bump only for package @wepy/compiler-sass
diff --git a/packages/wepy-compiler-sass/README.md b/packages/compiler-sass/README.md
similarity index 70%
rename from packages/wepy-compiler-sass/README.md
rename to packages/compiler-sass/README.md
index 0aa016fa2..fcb36c88b 100644
--- a/packages/wepy-compiler-sass/README.md
+++ b/packages/compiler-sass/README.md
@@ -3,7 +3,7 @@
 ## 安装
 
 ```
-npm install wepy-compiler-sass --save-dev
+npm install @wepy/compiler-sass --save-dev
 ```
 
 ## 配置`wepy.config.js`
@@ -21,4 +21,4 @@ module.exports = {
 
 ## 参数说明
 
-[node-sass](https://github.com/sass/node-sass)
\ No newline at end of file
+[sass](https://github.com/sass/dart-sass)
diff --git a/packages/compiler-sass/importsToResolve.js b/packages/compiler-sass/importsToResolve.js
new file mode 100644
index 000000000..8b062a684
--- /dev/null
+++ b/packages/compiler-sass/importsToResolve.js
@@ -0,0 +1,60 @@
+const path = require('path');
+const utils = require('loader-utils');
+
+// eslint-disable-next-line
+const matchModuleImport = /^~([^\/]+|@[^\/]+[\/][^\/]+)$/;
+
+/**
+ * When libsass tries to resolve an import, it uses a special algorithm.
+ * Since the sass-loader uses webpack to resolve the modules, we need to simulate that algorithm. This function
+ * returns an array of import paths to try. The last entry in the array is always the original url
+ * to enable straight-forward webpack.config aliases.
+ *
+ * @param {string} url
+ * @returns {Array<string>}
+ */
+function importsToResolve(url) {
+  const request = utils.urlToRequest(url);
+  // Keep in mind: ext can also be something like '.datepicker' when the true extension is omitted and the filename contains a dot.
+  // @see https://github.com/webpack-contrib/sass-loader/issues/167
+  const ext = path.extname(request);
+
+  if (matchModuleImport.test(url)) {
+    return [request, url];
+  }
+
+  // libsass' import algorithm works like this:
+
+  // In case there is a file extension...
+  //   - If the file is a CSS-file, do not include it all, but just link it via @import url().
+  //   - The exact file name must match (no auto-resolving of '_'-modules).
+  if (ext === '.css') {
+    return [];
+  }
+  if (ext === '.scss' || ext === '.sass') {
+    return [request, url];
+  }
+
+  // In case there is no file extension...
+  //   - Prefer modules starting with '_'.
+  //   - File extension precedence: .scss, .sass, .css.
+  const basename = path.basename(request);
+
+  if (basename.charAt(0) === '_') {
+    return [`${request}.scss`, `${request}.sass`, `${request}.css`, url];
+  }
+
+  const dirname = path.dirname(request);
+
+  return [
+    `${dirname}/_${basename}.scss`,
+    `${dirname}/_${basename}.sass`,
+    `${dirname}/_${basename}.css`,
+    `${request}.scss`,
+    `${request}.sass`,
+    `${request}.css`,
+    url
+  ];
+}
+
+module.exports = importsToResolve;
diff --git a/packages/compiler-sass/index.js b/packages/compiler-sass/index.js
new file mode 100644
index 000000000..8146671e6
--- /dev/null
+++ b/packages/compiler-sass/index.js
@@ -0,0 +1,60 @@
+/**
+ * Tencent is pleased to support the open source community by making WePY available.
+ * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
+ * http://opensource.org/licenses/MIT
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+
+const os = require('os');
+const path = require('path');
+const sass = require('sass');
+const resolveImporter = require('./resolveImporter');
+
+function createSassPlugin(compilation, type, options) {
+  return function(node, ctx) {
+    let file = typeof ctx === 'string' ? ctx : ctx.file;
+    let config = Object.assign(
+      {
+        file: file
+      },
+      options
+    );
+
+    config.data = config.data ? config.data + os.EOL + node.content : node.content;
+
+    config.importer = config.importer || [];
+    config.importer.push(resolveImporter(compilation, file));
+
+    config.includePaths = config.includePaths || [];
+    config.includePaths.push(path.dirname(file));
+
+    if (type === 'sass' && 'indentedSyntax' in config === false) {
+      config.indentedSyntax = true;
+    } else {
+      config.indentedSyntax = Boolean(config.indentedSyntax);
+    }
+
+    return new Promise((resolve, reject) => {
+      sass.render(config, (err, res) => {
+        if (err) {
+          reject(err);
+        } else {
+          node.compiled = {
+            code: res.css.toString()
+          };
+          resolve(node);
+        }
+      });
+    });
+  };
+}
+
+exports = module.exports = function(options) {
+  return function() {
+    ['sass', 'scss'].forEach(type => {
+      this.register(`wepy-compiler-${type}`, createSassPlugin(this, type, options));
+    });
+  };
+};
diff --git a/packages/compiler-sass/package-lock.json b/packages/compiler-sass/package-lock.json
new file mode 100644
index 000000000..bc07311e8
--- /dev/null
+++ b/packages/compiler-sass/package-lock.json
@@ -0,0 +1,268 @@
+{
+	"name": "@wepy/compiler-sass",
+	"version": "2.1.0",
+	"lockfileVersion": 1,
+	"requires": true,
+	"dependencies": {
+		"anymatch": {
+			"version": "3.1.1",
+			"resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz",
+			"integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=",
+			"requires": {
+				"normalize-path": "^3.0.0",
+				"picomatch": "^2.0.4"
+			}
+		},
+		"big.js": {
+			"version": "5.2.2",
+			"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+			"integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
+		},
+		"binary-extensions": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.1.0.tgz?cache=0&sync_timestamp=1593261419324&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-2.1.0.tgz",
+			"integrity": "sha1-MPpAyef+B9vIlWeM0ocCTeokHdk="
+		},
+		"braces": {
+			"version": "3.0.2",
+			"resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz",
+			"integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=",
+			"requires": {
+				"fill-range": "^7.0.1"
+			}
+		},
+		"chokidar": {
+			"version": "3.4.0",
+			"resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.0.tgz?cache=0&sync_timestamp=1587911196018&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.4.0.tgz",
+			"integrity": "sha1-swYRQjzjdjV8dlubj5BLn7o8C+g=",
+			"requires": {
+				"anymatch": "~3.1.1",
+				"braces": "~3.0.2",
+				"fsevents": "~2.1.2",
+				"glob-parent": "~5.1.0",
+				"is-binary-path": "~2.1.0",
+				"is-glob": "~4.0.1",
+				"normalize-path": "~3.0.0",
+				"readdirp": "~3.4.0"
+			}
+		},
+		"core-util-is": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+			"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+			"dev": true
+		},
+		"emojis-list": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+			"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
+		},
+		"enhanced-resolve": {
+			"version": "4.1.1",
+			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz",
+			"integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==",
+			"dev": true,
+			"requires": {
+				"graceful-fs": "^4.1.2",
+				"memory-fs": "^0.5.0",
+				"tapable": "^1.0.0"
+			}
+		},
+		"errno": {
+			"version": "0.1.7",
+			"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+			"integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+			"dev": true,
+			"requires": {
+				"prr": "~1.0.1"
+			}
+		},
+		"fill-range": {
+			"version": "7.0.1",
+			"resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz",
+			"integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=",
+			"requires": {
+				"to-regex-range": "^5.0.1"
+			}
+		},
+		"fsevents": {
+			"version": "2.1.3",
+			"resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.1.3.tgz",
+			"integrity": "sha1-+3OHA66NL5/pAMM4Nt3r7ouX8j4=",
+			"optional": true
+		},
+		"glob-parent": {
+			"version": "5.1.2",
+			"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+			"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+			"requires": {
+				"is-glob": "^4.0.1"
+			}
+		},
+		"graceful-fs": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
+			"integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
+			"dev": true
+		},
+		"inherits": {
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+			"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+			"dev": true
+		},
+		"is-binary-path": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz",
+			"integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=",
+			"requires": {
+				"binary-extensions": "^2.0.0"
+			}
+		},
+		"is-extglob": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz",
+			"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+		},
+		"is-glob": {
+			"version": "4.0.1",
+			"resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz",
+			"integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=",
+			"requires": {
+				"is-extglob": "^2.1.1"
+			}
+		},
+		"is-number": {
+			"version": "7.0.0",
+			"resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz",
+			"integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss="
+		},
+		"isarray": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+			"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+			"dev": true
+		},
+		"json5": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+			"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+			"requires": {
+				"minimist": "^1.2.0"
+			}
+		},
+		"loader-utils": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+			"integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+			"requires": {
+				"big.js": "^5.2.2",
+				"emojis-list": "^3.0.0",
+				"json5": "^1.0.1"
+			}
+		},
+		"memory-fs": {
+			"version": "0.5.0",
+			"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+			"integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+			"dev": true,
+			"requires": {
+				"errno": "^0.1.3",
+				"readable-stream": "^2.0.1"
+			}
+		},
+		"minimist": {
+			"version": "1.2.6",
+			"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+			"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
+		},
+		"normalize-path": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz",
+			"integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU="
+		},
+		"picomatch": {
+			"version": "2.2.2",
+			"resolved": "https://registry.npm.taobao.org/picomatch/download/picomatch-2.2.2.tgz",
+			"integrity": "sha1-IfMz6ba46v8CRo9RRupAbTRfTa0="
+		},
+		"process-nextick-args": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+			"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+			"dev": true
+		},
+		"prr": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+			"integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+			"dev": true
+		},
+		"readable-stream": {
+			"version": "2.3.7",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+			"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+			"dev": true,
+			"requires": {
+				"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"
+			}
+		},
+		"readdirp": {
+			"version": "3.4.0",
+			"resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.4.0.tgz",
+			"integrity": "sha1-n9zN+ekVWAVEkiGsZF6DA6tbmto=",
+			"requires": {
+				"picomatch": "^2.2.1"
+			}
+		},
+		"safe-buffer": {
+			"version": "5.1.2",
+			"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+			"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+			"dev": true
+		},
+		"sass": {
+			"version": "1.26.9",
+			"resolved": "https://registry.npm.taobao.org/sass/download/sass-1.26.9.tgz",
+			"integrity": "sha1-c8EMu4jBKyKp4BB3Jb/WIpb0l48=",
+			"requires": {
+				"chokidar": ">=2.0.0 <4.0.0"
+			}
+		},
+		"string_decoder": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+			"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+			"dev": true,
+			"requires": {
+				"safe-buffer": "~5.1.0"
+			}
+		},
+		"tapable": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+			"integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+			"dev": true
+		},
+		"to-regex-range": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz",
+			"integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=",
+			"requires": {
+				"is-number": "^7.0.0"
+			}
+		},
+		"util-deprecate": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+			"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+			"dev": true
+		}
+	}
+}
diff --git a/packages/compiler-sass/package.json b/packages/compiler-sass/package.json
new file mode 100644
index 000000000..62fb1aa6a
--- /dev/null
+++ b/packages/compiler-sass/package.json
@@ -0,0 +1,27 @@
+{
+  "name": "@wepy/compiler-sass",
+  "version": "2.1.0",
+  "description": "wepy compile sass",
+  "main": "index.js",
+  "scripts": {
+    "test": "node ./test/helpers/generate.js && mocha ./test/*.test.js"
+  },
+  "keywords": [
+    "sass"
+  ],
+  "author": {
+    "name": "Gcaufy"
+  },
+  "license": "MIT",
+  "dependencies": {
+    "loader-utils": "^1.1.0",
+    "sass": "^1.26.9"
+  },
+  "devDependencies": {
+    "enhanced-resolve": "^4.0.0"
+  },
+  "readme": "ERROR: No README data found!",
+  "_id": "@wepy/compiler-sass@2.0.3",
+  "_commitid": "cf96591",
+  "gitHead": "5a25776457360bbbbc54a4d059f6bc7c032d5df3"
+}
diff --git a/packages/compiler-sass/resolveImporter.js b/packages/compiler-sass/resolveImporter.js
new file mode 100644
index 000000000..e336fc434
--- /dev/null
+++ b/packages/compiler-sass/resolveImporter.js
@@ -0,0 +1,24 @@
+const path = require('path');
+const importsToResolve = require('./importsToResolve');
+
+//const matchMalformedModuleFilename = /(~[^/\\]+)\.less$/;
+
+function resolveImporter(compilation, file) {
+  function doResolve(dir, imports) {
+    if (imports.length === 0) {
+      return Promise.reject();
+    }
+    return compilation.resolvers.normal.resolve({}, dir, imports[0], {}).then(resolved => {
+      return { file: resolved.path };
+    });
+  }
+  return function(url, prev, done) {
+    let dir = path.dirname(prev === 'stdin' ? file : prev);
+
+    doResolve(dir, importsToResolve(url))
+      .then(done)
+      .catch(() => ({ file: url }));
+  };
+}
+
+exports = module.exports = resolveImporter;
diff --git a/packages/wepy-redux/src/store.js b/packages/compiler-sass/src/index.js
similarity index 68%
rename from packages/wepy-redux/src/store.js
rename to packages/compiler-sass/src/index.js
index 6099edc40..0645f0dbc 100644
--- a/packages/wepy-redux/src/store.js
+++ b/packages/compiler-sass/src/index.js
@@ -1,19 +1,24 @@
 /**
  * Tencent is pleased to support the open source community by making WePY available.
  * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
+ *
  * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
  * http://opensource.org/licenses/MIT
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
  */
 
+import sass from 'sass';
 
-let store = null
-
-export function getStore () {
-    return store;
-}
-
-export function setStore (s) {
-    store = s;
+export default function(content, config, file) {
+  return new Promise((resolve, reject) => {
+    config.data = content;
+    config.file = file;
+    sass.render(config, (err, res) => {
+      if (err) {
+        reject(err);
+      } else {
+        resolve(res.css);
+      }
+    });
+  });
 }
diff --git a/packages/compiler-sass/test/fixtures/css/alias.scss.css b/packages/compiler-sass/test/fixtures/css/alias.scss.css
new file mode 100644
index 000000000..e9a1efc74
--- /dev/null
+++ b/packages/compiler-sass/test/fixtures/css/alias.scss.css
@@ -0,0 +1,3 @@
+body {
+  color: #ff0101;
+}
\ No newline at end of file
diff --git a/packages/compiler-sass/test/fixtures/css/basic.sass.css b/packages/compiler-sass/test/fixtures/css/basic.sass.css
new file mode 100644
index 000000000..03066615a
--- /dev/null
+++ b/packages/compiler-sass/test/fixtures/css/basic.sass.css
@@ -0,0 +1,18 @@
+body {
+  font: 100% Helvetica, sans-serif;
+  color: #333;
+}
+
+nav ul {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+nav li {
+  display: inline-block;
+}
+nav a {
+  display: block;
+  padding: 6px 12px;
+  text-decoration: none;
+}
\ No newline at end of file
diff --git a/packages/compiler-sass/test/fixtures/css/basic.scss.css b/packages/compiler-sass/test/fixtures/css/basic.scss.css
new file mode 100644
index 000000000..03066615a
--- /dev/null
+++ b/packages/compiler-sass/test/fixtures/css/basic.scss.css
@@ -0,0 +1,18 @@
+body {
+  font: 100% Helvetica, sans-serif;
+  color: #333;
+}
+
+nav ul {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+nav li {
+  display: inline-block;
+}
+nav a {
+  display: block;
+  padding: 6px 12px;
+  text-decoration: none;
+}
\ No newline at end of file
diff --git a/packages/compiler-sass/test/fixtures/css/import.sass.css b/packages/compiler-sass/test/fixtures/css/import.sass.css
new file mode 100644
index 000000000..e9a1efc74
--- /dev/null
+++ b/packages/compiler-sass/test/fixtures/css/import.sass.css
@@ -0,0 +1,3 @@
+body {
+  color: #ff0101;
+}
\ No newline at end of file
diff --git a/packages/compiler-sass/test/fixtures/css/import.scss.css b/packages/compiler-sass/test/fixtures/css/import.scss.css
new file mode 100644
index 000000000..e9a1efc74
--- /dev/null
+++ b/packages/compiler-sass/test/fixtures/css/import.scss.css
@@ -0,0 +1,3 @@
+body {
+  color: #ff0101;
+}
\ No newline at end of file
diff --git a/packages/compiler-sass/test/fixtures/sass/alias.scss b/packages/compiler-sass/test/fixtures/sass/alias.scss
new file mode 100644
index 000000000..b8a92d63d
--- /dev/null
+++ b/packages/compiler-sass/test/fixtures/sass/alias.scss
@@ -0,0 +1,4 @@
+@import '~@/colors.scss';
+body {
+  color: $red;
+}
diff --git a/packages/compiler-sass/test/fixtures/sass/basic.sass b/packages/compiler-sass/test/fixtures/sass/basic.sass
new file mode 100644
index 000000000..cc1820f5e
--- /dev/null
+++ b/packages/compiler-sass/test/fixtures/sass/basic.sass
@@ -0,0 +1,21 @@
+$font-stack:    Helvetica, sans-serif
+$primary-color: #333
+$pi:            '\e0C6'
+
+body
+  font: 100% $font-stack
+  color: $primary-color
+
+nav
+  ul
+    margin: 0
+    padding: 0
+    list-style: none
+
+  li
+    display: inline-block
+
+  a
+    display: block
+    padding: 6px 12px
+    text-decoration: none
diff --git a/packages/compiler-sass/test/fixtures/sass/basic.scss b/packages/compiler-sass/test/fixtures/sass/basic.scss
new file mode 100644
index 000000000..fbd3617d3
--- /dev/null
+++ b/packages/compiler-sass/test/fixtures/sass/basic.scss
@@ -0,0 +1,25 @@
+$font-stack:    Helvetica, sans-serif;
+$primary-color: #333;
+$pi:            '\e0C6';
+
+body {
+  font: 100% $font-stack;
+  color: $primary-color;
+}
+
+nav {
+  ul {
+    margin: 0;
+    padding: 0;
+    list-style: none;
+  }
+
+  li { display: inline-block; }
+
+  a {
+    display: block;
+    padding: 6px 12px;
+    text-decoration: none;
+  }
+}
+
diff --git a/packages/compiler-sass/test/fixtures/sass/import.sass b/packages/compiler-sass/test/fixtures/sass/import.sass
new file mode 100644
index 000000000..575407ed6
--- /dev/null
+++ b/packages/compiler-sass/test/fixtures/sass/import.sass
@@ -0,0 +1,4 @@
+@import './vars/colors.scss'
+
+body 
+  color: $red
diff --git a/packages/compiler-sass/test/fixtures/sass/import.scss b/packages/compiler-sass/test/fixtures/sass/import.scss
new file mode 100644
index 000000000..fa253b3b3
--- /dev/null
+++ b/packages/compiler-sass/test/fixtures/sass/import.scss
@@ -0,0 +1,4 @@
+@import './vars/colors.scss';
+body {
+  color: $red;
+}
diff --git a/packages/compiler-sass/test/fixtures/sass/vars/colors.scss b/packages/compiler-sass/test/fixtures/sass/vars/colors.scss
new file mode 100644
index 000000000..fac336549
--- /dev/null
+++ b/packages/compiler-sass/test/fixtures/sass/vars/colors.scss
@@ -0,0 +1 @@
+$red: #ff0101;
diff --git a/packages/compiler-sass/test/helpers/generate.js b/packages/compiler-sass/test/helpers/generate.js
new file mode 100644
index 000000000..91fdd65b4
--- /dev/null
+++ b/packages/compiler-sass/test/helpers/generate.js
@@ -0,0 +1,48 @@
+const path = require('path');
+const sass = require('sass');
+const fs = require('fs-extra');
+const specs = require('./specs');
+
+const projectPath = path.resolve(__dirname, '..', '..');
+const fixturesPath = path.resolve(projectPath, 'test', 'fixtures');
+const sassPath = path.resolve(fixturesPath, 'sass');
+const cssPath = path.resolve(fixturesPath, 'css');
+
+specs.getIds().forEach(id => {
+  const ext = path.extname(id);
+  const name = id.replace(new RegExp(ext + '$'), '');
+  const sassFile = path.join(sassPath, id);
+  const css = path.join(cssPath, `${id}.css`);
+  const tmpsass = path.join(sassPath, `${name}.tmp${ext}`);
+
+  let replaces = specs.getReplacements(id);
+
+  let content = fs.readFileSync(sassFile, 'utf-8');
+
+  replaces.forEach(r => {
+    content = content.replace(r[0], r[1]);
+  });
+  fs.outputFileSync(tmpsass, content);
+
+  let options = specs.getOpt(id);
+
+  // eslint-disable-next-line
+  console.log(`Generate spec: ${id}`);
+
+  sass.render(
+    {
+      file: tmpsass,
+      outFile: css,
+      ...options
+    },
+    function(err, result) {
+      if (err) {
+        // eslint-disable-next-line
+        console.log(err);
+        return;
+      }
+      fs.outputFileSync(css, result.css.toString(), 'utf-8');
+      fs.removeSync(tmpsass);
+    }
+  );
+});
diff --git a/packages/compiler-sass/test/helpers/specs.js b/packages/compiler-sass/test/helpers/specs.js
new file mode 100644
index 000000000..e75aa31b4
--- /dev/null
+++ b/packages/compiler-sass/test/helpers/specs.js
@@ -0,0 +1,47 @@
+const fs = require('fs');
+const path = require('path');
+
+const sassDir = path.resolve(__dirname, '../fixtures/sass/');
+
+let tests = null;
+
+const options = {
+  'basic.scss': {
+    json: {},
+    string: [],
+    resolve: {}
+  },
+  'alias.scss': {
+    replace: [[/~@/g, '../sass/vars']],
+    resolve: {
+      alias: {
+        '@': path.resolve(__dirname, '../fixtures/sass/vars')
+      }
+    }
+  }
+};
+
+exports = module.exports = {
+  getIds() {
+    if (tests) {
+      return tests;
+    }
+    tests = fs.readdirSync(sassDir).filter(name => {
+      let ext = path.extname(name);
+      return name.indexOf('.tmp') === -1 && (ext === '.sass' || ext === '.scss');
+    });
+    return tests;
+  },
+  getId(id) {
+    return options[id] || {};
+  },
+  getOpt(id) {
+    return this.getId(id).json || {};
+  },
+  getResolveOpt(id) {
+    return this.getId(id).resolve || {};
+  },
+  getReplacements(id) {
+    return this.getId(id).replace || [];
+  }
+};
diff --git a/packages/compiler-sass/test/index.test.js b/packages/compiler-sass/test/index.test.js
new file mode 100644
index 000000000..d49fd4490
--- /dev/null
+++ b/packages/compiler-sass/test/index.test.js
@@ -0,0 +1,95 @@
+const path = require('path');
+const fs = require('fs-extra');
+const expect = require('chai').expect;
+const sassPlugin = require('../index');
+const specs = require('./helpers/specs');
+const ResolverFactory = require('enhanced-resolve').ResolverFactory;
+const NodeJsInputFileSystem = require('enhanced-resolve/lib/NodeJsInputFileSystem');
+const CachedInputFileSystem = require('enhanced-resolve/lib/CachedInputFileSystem');
+
+class Hook {
+  register(key, fn) {
+    if (!this._fns) this._fns = {};
+    this._fns[key] = fn;
+  }
+  hook(key, ...args) {
+    return this._fns[key].apply(this, args);
+  }
+  clear() {
+    this._fns = {};
+  }
+}
+
+function createCompile(sassOpt, resolveOpt) {
+  let instance = new Hook();
+  sassPlugin(sassOpt).call(instance);
+
+  instance.resolvers = {
+    normal: ResolverFactory.createResolver(
+      Object.assign(
+        {
+          fileSystem: new CachedInputFileSystem(new NodeJsInputFileSystem(), 60000)
+        },
+        resolveOpt
+      )
+    )
+  };
+
+  let fnNormalBak = instance.resolvers.normal.resolve;
+  instance.resolvers.normal.resolve = function(...args) {
+    return new Promise((resolve, reject) => {
+      args.push(function(err, filepath, meta) {
+        if (err) {
+          reject(err);
+        } else {
+          resolve({ path: filepath, meta: meta });
+        }
+      });
+      fnNormalBak.apply(instance.resolvers.normal, args);
+    });
+  };
+  return instance;
+}
+
+function readSpec(id) {
+  let sassfile = path.join(__dirname, 'fixtures', 'sass', id);
+  let expectfile = path.join(__dirname, 'fixtures', 'css', id + '.css');
+
+  return {
+    node: {
+      content: fs.readFileSync(sassfile, 'utf-8')
+    },
+    file: sassfile,
+    expect: fs.readFileSync(expectfile, 'utf-8')
+  };
+}
+
+function compare(id, done) {
+  let compile = createCompile(specs.getOpt(id), specs.getResolveOpt(id));
+
+  let spec = readSpec(id);
+  let ext = path.extname(spec.file);
+  let type = ext.substring(1, ext.length);
+
+  return compile
+    .hook('wepy-compiler-' + type, spec.node, spec.file)
+    .then(node => {
+      let css = node.compiled.code;
+      expect(css).to.equal(spec.expect);
+      done();
+    })
+    .catch(e => {
+      done();
+      throw e;
+    });
+}
+
+describe('wepy-compiler-less', function() {
+  let ids = specs.getIds();
+
+  ids.forEach(id => {
+    it('testing ' + id, function(done) {
+      compare(id, done);
+    });
+  });
+});
diff --git a/packages/compiler-stylus/.npmignore b/packages/compiler-stylus/.npmignore
new file mode 100644
index 000000000..3c3629e64
--- /dev/null
+++ b/packages/compiler-stylus/.npmignore
@@ -0,0 +1 @@
+node_modules
diff --git a/packages/compiler-stylus/CHANGELOG.md b/packages/compiler-stylus/CHANGELOG.md
new file mode 100644
index 000000000..dd950e18d
--- /dev/null
+++ b/packages/compiler-stylus/CHANGELOG.md
@@ -0,0 +1,64 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# 2.1.0 (2020-07-04)
+
+**Note:** Version bump only for package @wepy/compiler-stylus
+
+
+
+
+
+# 2.1.0-alpha.10 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-stylus
+
+
+
+
+
+# 2.1.0-alpha.9 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-stylus
+
+
+
+
+
+# 2.1.0-alpha.8 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-stylus
+
+
+
+
+
+# 2.1.0-alpha.7 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-stylus
+
+
+
+
+
+# 2.1.0-alpha.6 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-stylus
+
+
+
+
+
+# 2.1.0-alpha.5 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-stylus
+
+
+
+
+
+# [2.1.0-alpha.4](https://github.com/Tencent/wepy/compare/v2.1.0-alpha.2...v2.1.0-alpha.4) (2020-06-20)
+
+**Note:** Version bump only for package @wepy/compiler-stylus
diff --git a/packages/wepy-compiler-stylus/README.md b/packages/compiler-stylus/README.md
old mode 100644
new mode 100755
similarity index 85%
rename from packages/wepy-compiler-stylus/README.md
rename to packages/compiler-stylus/README.md
index 6c91b2c8d..ccfa7c621
--- a/packages/wepy-compiler-stylus/README.md
+++ b/packages/compiler-stylus/README.md
@@ -3,7 +3,7 @@
 ## 安装
 
 ```
-npm install wepy-compiler-stylus --save-dev
+npm install @wepy/compiler-stylus --save-dev
 ```
 
 
diff --git a/packages/compiler-stylus/createPlugin.js b/packages/compiler-stylus/createPlugin.js
new file mode 100755
index 000000000..15ddcd70b
--- /dev/null
+++ b/packages/compiler-stylus/createPlugin.js
@@ -0,0 +1,32 @@
+const loaderUtils = require('loader-utils');
+const stylus = require('stylus');
+const isModuleName = /^~[^/\\]+$/;
+const trailingSlash = /[/\\]$/;
+
+function createPlugin(compliation) {
+  return function(style) {
+    style.define('url', function() {
+      const file = style.get('filename');
+      const fileArrs = file.split('.');
+      const fileExt = fileArrs.pop();
+      const fileArrs1 = fileArrs[0].split('/');
+      const fileName = fileArrs1.pop();
+
+      let url;
+      if (fileExt && !isModuleName.test(fileName)) {
+        url = fileName + '.' + fileExt;
+      } else {
+        url = fileName;
+      }
+      const moduleRequest = loaderUtils.urlToRequest(url, url.charAt(0) === '/' ? '' : null);
+      compliation.resolvers.normal
+        .resolve({}, fileArrs1.join('/').replace(trailingSlash, ''), moduleRequest, {})
+        .then(rst => {
+          compliation.involved[rst.path] = 1;
+          return stylus.url({ paths: [rst.path] });
+        });
+    });
+  };
+}
+
+exports = module.exports = createPlugin;
diff --git a/packages/compiler-stylus/index.js b/packages/compiler-stylus/index.js
new file mode 100755
index 000000000..54032078b
--- /dev/null
+++ b/packages/compiler-stylus/index.js
@@ -0,0 +1,41 @@
+/**
+ * Tencent is pleased to support the open source community by making WePY available.
+ * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
+ * http://opensource.org/licenses/MIT
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+
+const stylus = require('stylus');
+const createPlugin = require('./createPlugin');
+
+exports = module.exports = function(options) {
+  return function() {
+    this.register('wepy-compiler-stylus', function(node, ctx) {
+      let file = typeof ctx === 'string' ? ctx : ctx.file;
+      const plugins = createPlugin(this);
+      let config = Object.assign(
+        {
+          use: plugins,
+          filename: file
+        },
+        options
+      );
+      const styl = stylus(node.content || '', config);
+
+      return new Promise((resolve, reject) => {
+        styl.render(function(err, css) {
+          if (err) reject(err);
+          else {
+            node.compiled = {
+              code: css,
+              dep: styl.deps()
+            };
+            resolve(node);
+          }
+        });
+      });
+    });
+  };
+};
diff --git a/packages/compiler-stylus/package-lock.json b/packages/compiler-stylus/package-lock.json
new file mode 100644
index 000000000..2a07f3fcc
--- /dev/null
+++ b/packages/compiler-stylus/package-lock.json
@@ -0,0 +1,175 @@
+{
+	"name": "@wepy/compiler-stylus",
+	"version": "2.1.0",
+	"lockfileVersion": 1,
+	"requires": true,
+	"dependencies": {
+		"big.js": {
+			"version": "5.2.2",
+			"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+			"integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
+		},
+		"core-util-is": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+			"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+			"dev": true
+		},
+		"emojis-list": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+			"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
+		},
+		"enhanced-resolve": {
+			"version": "4.1.1",
+			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz",
+			"integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==",
+			"dev": true,
+			"requires": {
+				"graceful-fs": "^4.1.2",
+				"memory-fs": "^0.5.0",
+				"tapable": "^1.0.0"
+			}
+		},
+		"errno": {
+			"version": "0.1.7",
+			"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+			"integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+			"dev": true,
+			"requires": {
+				"prr": "~1.0.1"
+			}
+		},
+		"fs-extra": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz",
+			"integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==",
+			"dev": true,
+			"requires": {
+				"graceful-fs": "^4.1.2",
+				"jsonfile": "^4.0.0",
+				"universalify": "^0.1.0"
+			}
+		},
+		"graceful-fs": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
+			"integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
+			"dev": true
+		},
+		"inherits": {
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+			"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+			"dev": true
+		},
+		"isarray": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+			"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+			"dev": true
+		},
+		"json5": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+			"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+			"requires": {
+				"minimist": "^1.2.0"
+			}
+		},
+		"jsonfile": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+			"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+			"dev": true,
+			"requires": {
+				"graceful-fs": "^4.1.6"
+			}
+		},
+		"loader-utils": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+			"integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+			"requires": {
+				"big.js": "^5.2.2",
+				"emojis-list": "^3.0.0",
+				"json5": "^1.0.1"
+			}
+		},
+		"memory-fs": {
+			"version": "0.5.0",
+			"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+			"integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+			"dev": true,
+			"requires": {
+				"errno": "^0.1.3",
+				"readable-stream": "^2.0.1"
+			}
+		},
+		"minimist": {
+			"version": "1.2.6",
+			"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+			"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
+		},
+		"process-nextick-args": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+			"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+			"dev": true
+		},
+		"prr": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+			"integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+			"dev": true
+		},
+		"readable-stream": {
+			"version": "2.3.7",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+			"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+			"dev": true,
+			"requires": {
+				"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"
+			}
+		},
+		"safe-buffer": {
+			"version": "5.1.2",
+			"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+			"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+			"dev": true
+		},
+		"string_decoder": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+			"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+			"dev": true,
+			"requires": {
+				"safe-buffer": "~5.1.0"
+			}
+		},
+		"tapable": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+			"integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+			"dev": true
+		},
+		"universalify": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+			"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+			"dev": true
+		},
+		"util-deprecate": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+			"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+			"dev": true
+		}
+	}
+}
diff --git a/packages/compiler-stylus/package.json b/packages/compiler-stylus/package.json
new file mode 100755
index 000000000..61eed3069
--- /dev/null
+++ b/packages/compiler-stylus/package.json
@@ -0,0 +1,30 @@
+{
+  "name": "@wepy/compiler-stylus",
+  "version": "2.1.0",
+  "description": "wepy compile stylus",
+  "main": "index.js",
+  "scripts": {
+    "test": "node ./test/helpers/stylus.js && mocha ./test/*.test.js"
+  },
+  "keywords": [
+    "stylus"
+  ],
+  "dependencies": {
+    "loader-utils": "^1.1.0"
+  },
+  "peerDependencies": {
+    "stylus": "^0.54.0"
+  },
+  "author": {
+    "name": "Gcaufy"
+  },
+  "license": "MIT",
+  "devDependencies": {
+    "enhanced-resolve": "^4.0.0",
+    "fs-extra": "^6.0.1"
+  },
+  "readme": "ERROR: No README data found!",
+  "_id": "@wepy/compiler-stylus@2.0.1",
+  "_commitid": "4913bce",
+  "gitHead": "5a25776457360bbbbc54a4d059f6bc7c032d5df3"
+}
diff --git a/packages/compiler-stylus/test/fixtures/css/alias.css b/packages/compiler-stylus/test/fixtures/css/alias.css
new file mode 100755
index 000000000..e80245220
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/css/alias.css
@@ -0,0 +1,3 @@
+body {
+  color: #ff0101;
+}
diff --git a/packages/compiler-stylus/test/fixtures/css/basic.css b/packages/compiler-stylus/test/fixtures/css/basic.css
new file mode 100755
index 000000000..48951ed0d
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/css/basic.css
@@ -0,0 +1,5 @@
+.no-math {
+  width: calc(50% + (25vh - 20px));
+  foo: 3 calc(3 + 4) 11;
+  bar: calc(1 + 20%);
+}
diff --git a/packages/compiler-stylus/test/fixtures/css/extend.css b/packages/compiler-stylus/test/fixtures/css/extend.css
new file mode 100755
index 000000000..593134d7a
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/css/extend.css
@@ -0,0 +1,12 @@
+.some-module,
+#it-works {
+  color: #f00;
+  transform: scale(2);
+}
+.some-module .sub-module {
+  color: #008000;
+}
+#it-works {
+  margin: 0;
+  transform: rotate(15deg);
+}
diff --git a/packages/compiler-stylus/test/fixtures/css/function.css b/packages/compiler-stylus/test/fixtures/css/function.css
new file mode 100755
index 000000000..4c242b7f2
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/css/function.css
@@ -0,0 +1,9 @@
+.image-width {
+  width: 1px;
+}
+.image-height {
+  height: 1px;
+}
+.image-size {
+  width: 1px 1px;
+}
diff --git a/packages/compiler-stylus/test/fixtures/css/guards.css b/packages/compiler-stylus/test/fixtures/css/guards.css
new file mode 100755
index 000000000..03679e608
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/css/guards.css
@@ -0,0 +1,3 @@
+button {
+  foo: 1;
+}
diff --git a/packages/compiler-stylus/test/fixtures/css/import.css b/packages/compiler-stylus/test/fixtures/css/import.css
new file mode 100755
index 000000000..e80245220
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/css/import.css
@@ -0,0 +1,3 @@
+body {
+  color: #ff0101;
+}
diff --git a/packages/compiler-stylus/test/fixtures/css/list-each.css b/packages/compiler-stylus/test/fixtures/css/list-each.css
new file mode 100755
index 000000000..442fa7094
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/css/list-each.css
@@ -0,0 +1,9 @@
+.sel-blue {
+  a: b;
+}
+.sel-green {
+  a: b;
+}
+.sel-red {
+  a: b;
+}
diff --git a/packages/compiler-stylus/test/fixtures/css/list.css b/packages/compiler-stylus/test/fixtures/css/list.css
new file mode 100755
index 000000000..4c242b7f2
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/css/list.css
@@ -0,0 +1,9 @@
+.image-width {
+  width: 1px;
+}
+.image-height {
+  height: 1px;
+}
+.image-size {
+  width: 1px 1px;
+}
diff --git a/packages/compiler-stylus/test/fixtures/css/selector.css b/packages/compiler-stylus/test/fixtures/css/selector.css
new file mode 100755
index 000000000..3eb3c4e14
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/css/selector.css
@@ -0,0 +1,25 @@
+.button-ok {
+  foo: 1;
+}
+.button-cancel {
+  foo: 1;
+}
+.button-custom {
+  foo: 1;
+}
+.grand .parent > .grand .parent {
+  foo: 1;
+}
+.grand .parent + .grand .parent {
+  foo: 1;
+}
+.grand .parent .grand .parent {
+  foo: 1;
+}
+.grand .parent.grand .parent {
+  foo: 1;
+}
+.grand .parent,
+.grand .parentish {
+  foo: 1;
+}
diff --git a/packages/compiler-stylus/test/fixtures/css/uri.css b/packages/compiler-stylus/test/fixtures/css/uri.css
new file mode 100755
index 000000000..b5237f26d
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/css/uri.css
@@ -0,0 +1,10 @@
+.img {
+  background: url("../stylus/imgs/vacant.gif");
+  background: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.img1 {
+  background: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.img2 {
+  background-image: "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
+}
diff --git a/packages/compiler-stylus/test/fixtures/stylus/alias.styl b/packages/compiler-stylus/test/fixtures/stylus/alias.styl
new file mode 100755
index 000000000..e1d82525a
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/stylus/alias.styl
@@ -0,0 +1,4 @@
+@import '~@/colors.styl'
+
+body
+  color $red
diff --git a/packages/compiler-stylus/test/fixtures/stylus/basic.styl b/packages/compiler-stylus/test/fixtures/stylus/basic.styl
new file mode 100755
index 000000000..7621bfd1f
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/stylus/basic.styl
@@ -0,0 +1,7 @@
+var = 50vh/2
+floor = floor(1 + .1)
+
+.no-math
+  width: "calc(50% + (%s - 20px))" % var
+  foo: 1 + 2 calc(3 + 4) 5 + 6
+  bar: "calc(%s + 20%)" % floor
diff --git a/packages/compiler-stylus/test/fixtures/stylus/extend.styl b/packages/compiler-stylus/test/fixtures/stylus/extend.styl
new file mode 100755
index 000000000..31e0fe7a3
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/stylus/extend.styl
@@ -0,0 +1,6 @@
+@import "~@/modules"
+
+#it-works
+  @extends .some-module
+  margin 0
+  transform rotate(15deg)
diff --git a/packages/compiler-stylus/test/fixtures/stylus/fail-missing-file.styl b/packages/compiler-stylus/test/fixtures/stylus/fail-missing-file.styl
new file mode 100755
index 000000000..b72cd7ee5
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/stylus/fail-missing-file.styl
@@ -0,0 +1,4 @@
+@import 'missingfile.styl';
+
+body
+  color red
diff --git a/packages/compiler-stylus/test/fixtures/stylus/fail-uri-alias.styl b/packages/compiler-stylus/test/fixtures/stylus/fail-uri-alias.styl
new file mode 100755
index 000000000..73a3fdbd3
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/stylus/fail-uri-alias.styl
@@ -0,0 +1,3 @@
+.img-alias
+  background url("~@/vacant.gif")
+  background data-uri("~@/vacant.gif")
diff --git a/packages/compiler-stylus/test/fixtures/stylus/guards.styl b/packages/compiler-stylus/test/fixtures/stylus/guards.styl
new file mode 100755
index 000000000..bf68f8a12
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/stylus/guards.styl
@@ -0,0 +1,5 @@
+my-option = true
+
+if my-option
+  button
+    foo 1
\ No newline at end of file
diff --git a/packages/compiler-stylus/test/fixtures/stylus/imgs/vacant.gif b/packages/compiler-stylus/test/fixtures/stylus/imgs/vacant.gif
new file mode 100755
index 000000000..f191b280c
Binary files /dev/null and b/packages/compiler-stylus/test/fixtures/stylus/imgs/vacant.gif differ
diff --git a/packages/compiler-stylus/test/fixtures/stylus/import.styl b/packages/compiler-stylus/test/fixtures/stylus/import.styl
new file mode 100755
index 000000000..3412f85e4
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/stylus/import.styl
@@ -0,0 +1,3 @@
+@import './vars/colors.styl'
+body
+  color $red
diff --git a/packages/compiler-stylus/test/fixtures/stylus/list-each.styl b/packages/compiler-stylus/test/fixtures/stylus/list-each.styl
new file mode 100755
index 000000000..e53108b63
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/stylus/list-each.styl
@@ -0,0 +1,3 @@
+for $value in 'blue' 'green' 'red'
+  .sel-{$value}
+    a b
diff --git a/packages/compiler-stylus/test/fixtures/stylus/list.styl b/packages/compiler-stylus/test/fixtures/stylus/list.styl
new file mode 100755
index 000000000..5372be45f
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/stylus/list.styl
@@ -0,0 +1,9 @@
+$imagePath = 'imgs/vacant.gif'
+.image-width
+  width image-size($imagePath)[0]
+
+.image-height
+  height image-size($imagePath)[1]
+
+.image-size
+  width image-size($imagePath)
diff --git a/packages/compiler-stylus/test/fixtures/stylus/selector.styl b/packages/compiler-stylus/test/fixtures/stylus/selector.styl
new file mode 100755
index 000000000..ebd91b806
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/stylus/selector.styl
@@ -0,0 +1,20 @@
+.button
+  &-ok
+    foo 1
+  &-cancel
+    foo 1
+  &-custom
+    foo 1
+
+.grand 
+  .parent 
+    & > & 
+      foo 1
+    & + & 
+      foo 1
+    & & 
+      foo 1
+    &&
+      foo 1
+    &, &ish 
+      foo 1
diff --git a/packages/compiler-stylus/test/fixtures/stylus/uri.styl b/packages/compiler-stylus/test/fixtures/stylus/uri.styl
new file mode 100755
index 000000000..7fb7ee501
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/stylus/uri.styl
@@ -0,0 +1,11 @@
+$base64 = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
+
+.img
+  background url("imgs/vacant.gif")
+  background embedurl("imgs/vacant.gif")
+
+.img1
+  background embedurl("imgs/vacant.gif")
+
+.img2
+  background-image $base64
diff --git a/packages/compiler-stylus/test/fixtures/stylus/vars/colors.styl b/packages/compiler-stylus/test/fixtures/stylus/vars/colors.styl
new file mode 100755
index 000000000..eaa63cec9
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/stylus/vars/colors.styl
@@ -0,0 +1 @@
+$red = #ff0101
diff --git a/packages/compiler-stylus/test/fixtures/stylus/vars/modules.styl b/packages/compiler-stylus/test/fixtures/stylus/vars/modules.styl
new file mode 100755
index 000000000..ac1749070
--- /dev/null
+++ b/packages/compiler-stylus/test/fixtures/stylus/vars/modules.styl
@@ -0,0 +1,5 @@
+.some-module
+  color red
+  transform scale(2)
+  .sub-module
+    color green
\ No newline at end of file
diff --git a/packages/compiler-stylus/test/helpers/specs.js b/packages/compiler-stylus/test/helpers/specs.js
new file mode 100755
index 000000000..b43854250
--- /dev/null
+++ b/packages/compiler-stylus/test/helpers/specs.js
@@ -0,0 +1,69 @@
+const fs = require('fs');
+const path = require('path');
+
+const stylusDir = path.resolve(__dirname, '../fixtures/stylus/');
+
+let tests = null;
+
+const options = {
+  basic: {
+    json: {},
+    string: [],
+    resolve: {}
+  },
+  alias: {
+    replace: [[/~@/g, '../stylus/vars']],
+    resolve: {
+      alias: {
+        '@': path.resolve(__dirname, '../fixtures/stylus/vars')
+      }
+    }
+  },
+  'fail-missing-file': {
+    error: 'fail-missing-file' // Error message.
+  },
+  'fail-uri-alias': {
+    then: true, // Consider as a success test case.
+    resolve: {
+      alias: {
+        '@': path.resolve(__dirname, '../fixtures/stylus/imgs')
+      }
+    }
+  },
+  extend: {
+    replace: [[/~@/g, '../stylus/vars']],
+    resolve: {
+      alias: {
+        '@': path.resolve(__dirname, '../fixtures/stylus/vars')
+      }
+    }
+  }
+};
+
+exports = module.exports = {
+  getIds() {
+    if (tests) {
+      return tests;
+    }
+    tests = fs
+      .readdirSync(stylusDir)
+      .filter(name => path.extname(name) === '.styl' && name.indexOf('.tmp') === -1)
+      .map(name => path.basename(name, '.styl'));
+    return tests;
+  },
+  getId(id) {
+    return options[id] || {};
+  },
+  getOpt(id) {
+    return this.getId(id).json || {};
+  },
+  getResolveOpt(id) {
+    return this.getId(id).resolve || {};
+  },
+  getStyluscOpt(id) {
+    return (this.getId(id).string || []).join(' ');
+  },
+  getReplacements(id) {
+    return this.getId(id).replace || [];
+  }
+};
diff --git a/packages/compiler-stylus/test/helpers/stylus.js b/packages/compiler-stylus/test/helpers/stylus.js
new file mode 100755
index 000000000..76e050aaa
--- /dev/null
+++ b/packages/compiler-stylus/test/helpers/stylus.js
@@ -0,0 +1,45 @@
+const { exec } = require('child_process');
+const path = require('path');
+const fs = require('fs-extra');
+const specs = require('./specs');
+
+const styluscPath = require.resolve('.bin/stylus');
+
+const projectPath = path.resolve(__dirname, '..', '..');
+const fixturesPath = path.resolve(projectPath, 'test', 'fixtures');
+const stylusPath = path.resolve(fixturesPath, 'stylus');
+const cssPath = path.resolve(fixturesPath, 'css');
+
+// Ignore the fail test cases;
+let ids = specs.getIds().filter(v => !/^fail-/.test(v));
+
+ids.forEach(id => {
+  const stylusFile = path.join(stylusPath, `${id}.styl`);
+  const css = path.join(cssPath, `${id}.css`);
+  const tmpstylus = path.join(stylusPath, `${id}.tmp.styl`);
+
+  let replaces = specs.getReplacements(id);
+
+  let content = fs.readFileSync(stylusFile, 'utf-8');
+
+  replaces.forEach(r => {
+    content = content.replace(r[0], r[1]);
+  });
+  fs.outputFileSync(tmpstylus, content);
+
+  let options = specs.getStyluscOpt(id);
+
+  const relativeUrls = '--resolve-url';
+  let cmd = `${styluscPath} ${relativeUrls} ${options} ${tmpstylus} ${css}`;
+
+  // eslint-disable-next-line
+  console.log(`Generate spec: ${id}`);
+
+  exec(cmd, { cwd: projectPath }, (err, stdout, stderr) => {
+    if (err || stderr) {
+      err = err || new Error(stderr);
+      throw err;
+    }
+    if (stdout) fs.removeSync(tmpstylus);
+  });
+});
diff --git a/packages/compiler-stylus/test/index.test.js b/packages/compiler-stylus/test/index.test.js
new file mode 100755
index 000000000..c02504e9d
--- /dev/null
+++ b/packages/compiler-stylus/test/index.test.js
@@ -0,0 +1,137 @@
+const path = require('path');
+const fs = require('fs-extra');
+const expect = require('chai').expect;
+const stylusPlugin = require('../index');
+const specs = require('./helpers/specs');
+const ResolverFactory = require('enhanced-resolve').ResolverFactory;
+const NodeJsInputFileSystem = require('enhanced-resolve/lib/NodeJsInputFileSystem');
+const CachedInputFileSystem = require('enhanced-resolve/lib/CachedInputFileSystem');
+
+class Hook {
+  constructor() {}
+
+  register(key, fn) {
+    if (!this._fns) this._fns = {};
+    this._fns[key] = fn;
+  }
+  hook(key, ...args) {
+    return this._fns[key].apply(this, args);
+  }
+  clear() {
+    this._fns = {};
+  }
+}
+
+function createCompile(stylusOpt, resolveOpt) {
+  let instance = new Hook();
+  stylusPlugin(stylusOpt).call(instance);
+
+  instance.resolvers = {
+    normal: ResolverFactory.createResolver(
+      Object.assign(
+        {
+          fileSystem: new CachedInputFileSystem(new NodeJsInputFileSystem(), 60000)
+        },
+        resolveOpt
+      )
+    )
+  };
+
+  instance.logger = {
+    error(e) {
+      /* eslint-disable no-console */
+      console.log('======= ERROR OUTPUT ======');
+      console.log(e);
+      /* eslint-enable no-console */
+    }
+  };
+
+  let fnNormalBak = instance.resolvers.normal.resolve;
+  instance.resolvers.normal.resolve = function(...args) {
+    return new Promise((resolve, reject) => {
+      args.push(function(err, filepath, meta) {
+        if (err) {
+          reject(err);
+        } else {
+          resolve({ path: filepath, meta: meta });
+        }
+      });
+      fnNormalBak.apply(instance.resolvers.normal, args);
+    });
+  };
+  return instance;
+}
+
+function readSpec(id, isFailSpec) {
+  let stylusfile = path.join(__dirname, 'fixtures', 'stylus', id + '.styl');
+  let expectfile = isFailSpec ? '' : path.join(__dirname, 'fixtures', 'css', id + '.css');
+
+  return {
+    node: {
+      content: fs.readFileSync(stylusfile, 'utf-8')
+    },
+    file: stylusfile,
+    expect: isFailSpec ? '' : fs.readFileSync(expectfile, 'utf-8')
+  };
+}
+
+function compare(id, done) {
+  let compile = createCompile(specs.getOpt(id), specs.getResolveOpt(id));
+
+  let spec = readSpec(id);
+  return compile
+    .hook('wepy-compiler-stylus', spec.node, spec.file)
+    .then(node => {
+      let css = node.compiled.code;
+      expect(css).to.equal(spec.expect);
+      done();
+    })
+    .catch(e => {
+      done(e);
+    });
+}
+
+function compileFail(id, done) {
+  let compile = createCompile(specs.getOpt(id), specs.getResolveOpt(id));
+
+  let spec = readSpec(id, true);
+
+  let setting = specs.getId(id);
+
+  return compile
+    .hook('wepy-compiler-stylus', spec.node, spec.file)
+    .then(() => {
+      // e.g. uri-alias, alias is not awared in uri, so treat as compile successfully.
+      if (setting.then) {
+        done();
+      }
+    })
+    .catch(e => {
+      if (setting.error) {
+        expect(e.lineno).to.be.gt(0);
+        expect(e.filename).to.have.string(setting.error);
+      } else {
+        expect(e).to.be.an('error');
+      }
+      done();
+    });
+}
+
+describe('wepy-compiler-stylus', function() {
+  let ids = specs.getIds();
+
+  let shouldPassIds = ids.filter(id => !/^fail-/.test(id));
+
+  let shouldFailIds = ids.filter(id => /^fail-/.test(id));
+
+  shouldPassIds.forEach(id => {
+    it('Pass test cases: ' + id, function(done) {
+      compare(id, done);
+    });
+  });
+  shouldFailIds.forEach(id => {
+    it('Fail test cases: ' + id, function(done) {
+      compileFail(id, done);
+    });
+  });
+});
diff --git a/packages/wepy-compiler-pug/.npmignore b/packages/compiler-typescript/.npmignore
similarity index 100%
rename from packages/wepy-compiler-pug/.npmignore
rename to packages/compiler-typescript/.npmignore
diff --git a/packages/compiler-typescript/CHANGELOG.md b/packages/compiler-typescript/CHANGELOG.md
new file mode 100644
index 000000000..bc3e6e6e8
--- /dev/null
+++ b/packages/compiler-typescript/CHANGELOG.md
@@ -0,0 +1,64 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# 2.1.0 (2020-07-04)
+
+**Note:** Version bump only for package @wepy/compiler-typescript
+
+
+
+
+
+# 2.1.0-alpha.10 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-typescript
+
+
+
+
+
+# 2.1.0-alpha.9 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-typescript
+
+
+
+
+
+# 2.1.0-alpha.8 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-typescript
+
+
+
+
+
+# 2.1.0-alpha.7 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-typescript
+
+
+
+
+
+# 2.1.0-alpha.6 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-typescript
+
+
+
+
+
+# 2.1.0-alpha.5 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/compiler-typescript
+
+
+
+
+
+# [2.1.0-alpha.4](https://github.com/Tencent/wepy/compare/v2.1.0-alpha.2...v2.1.0-alpha.4) (2020-06-20)
+
+**Note:** Version bump only for package @wepy/compiler-typescript
diff --git a/packages/compiler-typescript/README.md b/packages/compiler-typescript/README.md
new file mode 100644
index 000000000..a70eba854
--- /dev/null
+++ b/packages/compiler-typescript/README.md
@@ -0,0 +1,25 @@
+# wepy typescript 编译器
+
+## 安装
+
+```
+npm install @wepy/compiler-typescript typescript --save-dev
+```
+
+## 配置`wepy.config.js`
+
+```
+
+const TypeScriptCompiler = require('@wepy/compiler-typescript');
+
+
+module.exports = {
+  "plugins": [
+      TypeScriptCompiler()
+  ]
+};
+```
+
+## 参数说明
+
+[TypeScript](https://www.typescriptlang.org/docs/handbook/compiler-options.html)
diff --git a/packages/compiler-typescript/index.js b/packages/compiler-typescript/index.js
new file mode 100644
index 000000000..61a9734cd
--- /dev/null
+++ b/packages/compiler-typescript/index.js
@@ -0,0 +1,88 @@
+/**
+ * Tencent is pleased to support the open source community by making WePY available.
+ * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
+ * http://opensource.org/licenses/MIT
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+const path = require('path');
+const ts = require('typescript');
+
+exports = module.exports = function(options) {
+  return function() {
+    this.register('wepy-compiler-typescript', function(node, ctx) {
+      let p;
+      let file = typeof ctx === 'string' ? ctx : ctx.file;
+      let source = node.content;
+      let params = Object.assign(
+        {},
+        {
+          fileName: file,
+          compilerOptions: {
+            esModuleInterop: true,
+            module: ts.ModuleKind.CommonJS
+          }
+        },
+        options
+      );
+      try {
+        let compiled = ts.transpileModule(source, params);
+        compiled.code = compiled.outputText;
+        let fileObj = path.parse(ctx.file);
+        delete compiled.outputText;
+        node.compiled = compiled;
+
+        compiled.outputFileName = fileObj.name + '.js';
+        p = Promise.resolve(node);
+      } catch (e) {
+        this.hookUnique('error-handler', {
+          type: 'error',
+          title: 'babel',
+          file: file,
+          message: e.message,
+          snapshot: e.codeFrame
+        });
+        p = Promise.reject(e);
+      }
+      return p;
+    });
+
+    // eslint-disable-next-line
+    this.register('prewalk-VariableDeclarator', function(walker, declarator, name, decl) {
+      if (walker.lang !== 'typescript') return;
+      // var core_1 = __importDefault(require('@wepy/core'))
+      if (declarator.init && declarator.init.type === 'CallExpression') {
+        if (declarator.init.callee.name === '__importDefault') {
+          let arg = declarator.init.arguments[0];
+          if (
+            arg &&
+            arg.type === 'CallExpression' &&
+            arg.callee.name === 'require' &&
+            arg.arguments[0].value === '@wepy/core'
+          ) {
+            walker.scope.instances.push(name + '.default');
+          }
+        }
+        /*
+         * var core_1 = require('@wepy/core');
+        if (declarator.init.callee.name === 'require') {
+          if (declarator.init.arguments && declarator.init.arguments[0] && declarator.init.arguments[0].value === '@wepy/core') {
+            walker.scope.instances.push(name + '.default');
+          }
+        }*/
+      }
+    });
+
+    this.register('walker-detect-entry', function(walker, expression, exprName) {
+      if (walker.lang !== 'typescript') return;
+      if (walker.scope.instances && walker.scope.instances.length && exprName) {
+        if (exprName.callee === 'app' || exprName.callee === 'page' || exprName.callee === 'component') {
+          if (walker.scope.instances.indexOf(exprName.instance) !== -1) {
+            walker.entry = expression;
+          }
+        }
+      }
+    });
+  };
+};
diff --git a/packages/compiler-typescript/package.json b/packages/compiler-typescript/package.json
new file mode 100644
index 000000000..9694d904c
--- /dev/null
+++ b/packages/compiler-typescript/package.json
@@ -0,0 +1,23 @@
+{
+  "name": "@wepy/compiler-typescript",
+  "version": "2.1.0",
+  "description": "wepy compile typescript",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "keywords": [
+    "typescript"
+  ],
+  "author": {
+    "name": "Gcaufy"
+  },
+  "license": "MIT",
+  "readme": "ERROR: No README data found!",
+  "peerDependencies": {
+    "typescript": "^3.3.3"
+  },
+  "_id": "@wepy/compiler-typescript@2.0.2",
+  "_commitid": "eae8bf5",
+  "gitHead": "5a25776457360bbbbc54a4d059f6bc7c032d5df3"
+}
diff --git a/packages/core/.nycrc b/packages/core/.nycrc
new file mode 100644
index 000000000..82f7d1b4e
--- /dev/null
+++ b/packages/core/.nycrc
@@ -0,0 +1,15 @@
+{
+  "reporter": [
+    "html",
+    "text",
+    "text-summary"
+  ],
+  "include": [
+    "src/**/*.js"
+  ],
+  "require": [
+    "esm"
+  ],
+  "check-coverage": false,
+  "cache": true
+}
diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md
new file mode 100644
index 000000000..60dc95204
--- /dev/null
+++ b/packages/core/CHANGELOG.md
@@ -0,0 +1,67 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# 2.1.0 (2020-07-04)
+
+**Note:** Version bump only for package @wepy/core
+
+
+
+
+
+# 2.1.0-alpha.10 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/core
+
+
+
+
+
+# 2.1.0-alpha.9 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/core
+
+
+
+
+
+# 2.1.0-alpha.8 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/core
+
+
+
+
+
+# 2.1.0-alpha.7 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/core
+
+
+
+
+
+# 2.1.0-alpha.6 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/core
+
+
+
+
+
+# 2.1.0-alpha.5 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/core
+
+
+
+
+
+# [2.1.0-alpha.4](https://github.com/Tencent/wepy/compare/v2.1.0-alpha.2...v2.1.0-alpha.4) (2020-06-20)
+
+
+### Bug Fixes
+
+* fixed eslint ([570050e](https://github.com/Tencent/wepy/commit/570050edb292ce75cc06a75448819c753275ecb4))
diff --git a/packages/core/ant/apis/index.js b/packages/core/ant/apis/index.js
new file mode 100644
index 000000000..fd4ef6770
--- /dev/null
+++ b/packages/core/ant/apis/index.js
@@ -0,0 +1,26 @@
+import { use } from '../../weapp/apis/use';
+import { mixin } from '../../weapp/apis/mixin';
+import { set, del, observe } from '../../weapp/observer/index';
+import { renderNextTick } from '../../weapp/util/next-tick';
+import { app, page, component } from '../native/index';
+
+export function initGlobalAPI(wepy) {
+  wepy.use = use;
+  wepy.mixin = mixin;
+
+  wepy.set = function(target, key, val) {
+    set.apply(wepy, [undefined, target, key, val]);
+  };
+
+  wepy.delete = del;
+
+  wepy.observe = observe;
+
+  wepy.nextTick = renderNextTick;
+
+  wepy.app = app;
+  wepy.page = page;
+  wepy.component = component;
+
+  return wepy;
+}
diff --git a/packages/core/ant/class/WepyComponent.js b/packages/core/ant/class/WepyComponent.js
new file mode 100644
index 000000000..d1f37106d
--- /dev/null
+++ b/packages/core/ant/class/WepyComponent.js
@@ -0,0 +1,40 @@
+import Base from './../../weapp/class/Base';
+import Watcher from './../../weapp/observer/watcher';
+import { isArr, isPlainObject } from '../../shared/index';
+import { renderNextTick } from './../../weapp/util/next-tick';
+
+export default class WepyComponent extends Base {
+  $watch(expOrFn, cb, options) {
+    let vm = this;
+    if (isArr(cb)) {
+      cb.forEach(handler => {
+        this.$watch(expOrFn, handler, options);
+      });
+    }
+    if (isPlainObject(cb)) {
+      let handler = cb;
+      options = handler;
+      handler = handler.handler;
+      if (typeof handler === 'string') handler = this[handler];
+      return this.$watch(expOrFn, handler, options);
+    }
+
+    options = options || {};
+    options.user = true;
+    let watcher = new Watcher(vm, expOrFn, cb, options);
+    if (options.immediate) {
+      cb.call(vm, watcher.value);
+    }
+    return function unwatchFn() {
+      watcher.teardown();
+    };
+  }
+
+  $forceUpdate() {
+    if (this._watcher) {
+      this._watcher.update();
+    }
+  }
+}
+
+WepyComponent.prototype.$nextTick = renderNextTick;
diff --git a/packages/core/ant/class/WepyPage.js b/packages/core/ant/class/WepyPage.js
new file mode 100644
index 000000000..167fceb68
--- /dev/null
+++ b/packages/core/ant/class/WepyPage.js
@@ -0,0 +1,48 @@
+import WepyComponent from './WepyComponent';
+import { isStr, isNum, isObj, isUndef, isFunc } from '../../shared/index';
+
+// eslint-disable-next-line
+let wx = my;
+export default class WepyPage extends WepyComponent {
+  $launch(url, params) {
+    this.$route('reLaunch', url, params);
+  }
+  $navigate(url, params) {
+    this.$route('navigate', url, params);
+  }
+
+  $redirect(url, params) {
+    this.$route('redirect', url, params);
+  }
+
+  $back(p = {}) {
+    if (isNum(p)) p = { delta: p };
+
+    if (!p.delta) p.delta = 1;
+
+    return wx.navigateBack(p);
+  }
+
+  $route(type, url, params = {}) {
+    let wxparams;
+    if (isStr(url)) {
+      let paramsList = [];
+      if (isObj(params)) {
+        for (let k in params) {
+          if (!isUndef(params[k])) {
+            paramsList.push(`${k}=${encodeURIComponent(params[k])}`);
+          }
+        }
+      }
+      if (paramsList.length) url = url + '?' + paramsList.join('&');
+
+      wxparams = { url: url };
+    } else {
+      wxparams = url;
+    }
+    let fn = wx[type] || wx[type + 'To'];
+    if (isFunc(fn)) {
+      return fn(wxparams);
+    }
+  }
+}
diff --git a/packages/core/ant/init/events.js b/packages/core/ant/init/events.js
new file mode 100644
index 000000000..2b623ff8e
--- /dev/null
+++ b/packages/core/ant/init/events.js
@@ -0,0 +1,20 @@
+/*
+ * initialize events
+ */
+export function initEvents(vm) {
+  let parent = vm.$parent;
+  let rel = parent.$rel;
+  vm._events = {};
+  let on = rel.info.on;
+  let evtId = vm.$evtId;
+  if (!evtId) return;
+
+  let evtNames = on[evtId];
+
+  evtNames.forEach(evtName => {
+    vm.$on(evtName, function() {
+      let fn = rel.handlers[evtId][evtName];
+      fn.apply(parent, arguments);
+    });
+  });
+}
diff --git a/packages/core/ant/init/index.js b/packages/core/ant/init/index.js
new file mode 100644
index 000000000..f93085eac
--- /dev/null
+++ b/packages/core/ant/init/index.js
@@ -0,0 +1,9 @@
+export * from '../../weapp/init/data';
+export * from '../../weapp/init/computed';
+export * from './lifecycle';
+export * from './methods';
+export * from '../../weapp/init/watch';
+export * from './props';
+export * from '../../weapp/init/mixins';
+export * from '../../weapp/init/hooks';
+export * from '../../weapp/init/relations';
diff --git a/packages/core/ant/init/lifecycle.js b/packages/core/ant/init/lifecycle.js
new file mode 100644
index 000000000..5ac6ebf9f
--- /dev/null
+++ b/packages/core/ant/init/lifecycle.js
@@ -0,0 +1,225 @@
+import WepyApp from '../../weapp/class/WepyApp';
+import WepyPage from '../class/WepyPage';
+import WepyComponent from '../../weapp/class/WepyComponent';
+
+import { initHooks } from '../../weapp/init/hooks';
+import { initProps } from './props';
+import { initWatch } from '../../weapp/init/watch';
+import { initRender } from '../../weapp/init/render';
+import { initData } from '../../weapp/init/data';
+import { initComputed } from '../../weapp/init/computed';
+import { initMethods } from './methods';
+import { initEvents } from './events';
+import { isArr, isFunc } from '../../shared/index';
+import Dirty from '../../weapp/class/Dirty';
+import { WEAPP_APP_LIFECYCLE, WEAPP_PAGE_LIFECYCLE, WEAPP_COMPONENT_LIFECYCLE } from '../../shared/index';
+import { warn } from '../../weapp/util/index';
+
+let comid = 0;
+let app;
+
+const callUserMethod = function(vm, userOpt, method, args) {
+  let result;
+  let methods = userOpt[method];
+  if (isFunc(methods)) {
+    result = userOpt[method].apply(vm, args);
+  } else if (isArr(methods)) {
+    for (let i in methods) {
+      if (isFunc(methods[i])) {
+        result = methods[i].apply(vm, args);
+      }
+    }
+  }
+  return result;
+};
+
+const getLifecycycle = (defaultLifecycle, rel, type) => {
+  let lifecycle = defaultLifecycle.concat([]);
+  if (rel && rel.lifecycle && rel.lifecycle[type]) {
+    let userDefinedLifecycle = [];
+    if (isFunc(rel.lifecycle[type])) {
+      userDefinedLifecycle = rel.lifecycle[type].call(null, lifecycle);
+    }
+    userDefinedLifecycle.forEach(u => {
+      if (lifecycle.indexOf(u) > -1) {
+        warn(`'${u}' is already implemented in current version, please remove it from your lifecycel config`);
+      } else {
+        lifecycle.push(u);
+      }
+    });
+  }
+  return lifecycle;
+};
+
+/*
+ * patch app lifecyle
+ */
+export function patchAppLifecycle(appConfig, options, rel = {}) {
+  appConfig.onLaunch = function(...args) {
+    let vm = new WepyApp();
+    app = vm;
+    vm.$options = options;
+    vm.$route = {};
+    vm.$rel = rel;
+
+    vm.$wx = this;
+    this.$wepy = vm;
+
+    initHooks(vm, options.hooks);
+
+    initMethods(vm, options.methods);
+
+    return callUserMethod(vm, vm.$options, 'onLaunch', args);
+  };
+
+  let lifecycle = getLifecycycle(WEAPP_APP_LIFECYCLE, rel, 'app');
+
+  lifecycle.forEach(k => {
+    // it's not defined aready && user defined it && it's an array or function
+    if (!appConfig[k] && options[k] && (isFunc(options[k]) || isArr(options[k]))) {
+      appConfig[k] = function(...args) {
+        return callUserMethod(app, app.$options, k, args);
+      };
+    }
+  });
+}
+
+export function patchLifecycle(output, options, rel, isComponent) {
+  const initClass = isComponent ? WepyComponent : WepyPage;
+  const initLifecycle = function(...args) {
+    let vm = new initClass();
+
+    vm.$dirty = new Dirty('path');
+    vm.$children = [];
+    vm.$refs = {};
+
+    this.$wepy = vm;
+    vm.$wx = this;
+    vm.$is = this.is;
+    vm.$options = options;
+    vm.$rel = rel;
+    vm._watchers = [];
+    if (!isComponent) {
+      vm.$root = vm;
+      vm.$app = app;
+    }
+    if (this.is === 'custom-tab-bar/index') {
+      vm.$app = app;
+      vm.$parent = app;
+    }
+
+    vm.$id = ++comid + (isComponent ? '.1' : '.0');
+    if (!vm.$app) {
+      // vm.$app = $global.$app;
+    }
+
+    callUserMethod(vm, vm.$options, 'beforeCreate', args);
+
+    initHooks(vm, options.hooks);
+
+    initProps(vm, output.properties);
+
+    initData(vm, output.data, isComponent);
+
+    initMethods(vm, options.methods);
+
+    initComputed(vm, options.computed, true);
+
+    initWatch(vm, options.watch);
+
+    // create render watcher
+    initRender(
+      vm,
+      Object.keys(vm._data)
+        .concat(Object.keys(vm._props))
+        .concat(Object.keys(vm._computedWatchers || {})),
+      Object.keys(vm._computedWatchers || {})
+    );
+
+    callUserMethod(vm, vm.$options, 'created', args);
+    return callUserMethod(vm, vm.$options, 'onLoad', args);
+  };
+
+  if (isComponent) {
+    output.onInit = initLifecycle; // 组件生命周期函数，组件创建时触发
+  } else {
+    output.onLoad = initLifecycle; // 页面加载时触发
+  }
+
+  if (isComponent) {
+    output.didMount = function(...args) {
+      // Component attached  组件生命周期函数，组件创建完毕时触发
+      let outProps = output.properties || {};
+
+      // this.propperties are includes datas
+      let vm = this.$wepy;
+      let acceptProps = vm.$wx.props;
+
+      // let target = isComponent ? output.methods: output;
+      // target.__initComponent(vm);
+      vm.$wx.props.onInit(vm);
+      // let parent = this.triggerEvent('_init', vm);
+
+      // created 不能调用 setData，如果有 dirty 在此更新
+      vm.$forceUpdate();
+
+      initEvents(vm);
+
+      Object.keys(outProps).forEach(k => (vm[k] = acceptProps[k]));
+
+      return callUserMethod(vm, vm.$options, 'didMount', args);
+    };
+  } else {
+    output.onShow = function(...args) {
+      // Page attached
+      let vm = this.$wepy;
+      let app = vm.$app;
+      // eslint-disable-next-line
+      let pages = getCurrentPages();
+      let currentPage = pages[pages.length - 1];
+      let path = currentPage.__route__;
+      let webViewId = currentPage.__wxWebviewId__;
+
+      // created 不能调用 setData，如果有 dirty 在此更新
+      vm.$forceUpdate();
+
+      if (app.$route.path !== path) {
+        app.$route.path = path;
+        app.$route.webViewId = webViewId;
+        vm.routed && vm.routed();
+      }
+
+      // TODO: page attached
+      return callUserMethod(vm, vm.$options, 'onShow', args);
+    };
+    // Page lifecycle will be called under methods
+    // e.g:
+    // Component({
+    //   methods: {
+    //     onLoad () {
+    //       console.log('page onload')
+    //     }
+    //   }
+    // })
+
+    let lifecycle = getLifecycycle(WEAPP_PAGE_LIFECYCLE, rel, 'page');
+
+    lifecycle.forEach(k => {
+      if (!output[k] && options[k] && (isFunc(options[k]) || isArr(options[k]))) {
+        output.methods[k] = function(...args) {
+          return callUserMethod(this.$wepy, this.$wepy.$options, k, args);
+        };
+      }
+    });
+  }
+  let lifecycle = getLifecycycle(WEAPP_COMPONENT_LIFECYCLE, rel, 'component');
+
+  lifecycle.forEach(k => {
+    // beforeCreate is not a real lifecycle
+    if (!output[k] && k !== 'beforeCreate' && (isFunc(options[k]) || isArr(options[k]))) {
+      output[k] = function(...args) {
+        return callUserMethod(this.$wepy, this.$wepy.$options, k, args);
+      };
+    }
+  });
+}
diff --git a/packages/core/ant/init/methods.js b/packages/core/ant/init/methods.js
new file mode 100644
index 000000000..65e47eb14
--- /dev/null
+++ b/packages/core/ant/init/methods.js
@@ -0,0 +1,57 @@
+import { warn } from '../../weapp/util/index';
+import { dispatcher } from '../../weapp/dispatcher/index';
+
+/*
+ * initialize page methods, also the app
+ */
+export function initMethods(vm, methods) {
+  if (methods) {
+    Object.keys(methods).forEach(method => {
+      vm[method] = methods[method];
+    });
+  }
+}
+
+/*
+ * patch method option
+ */
+export function patchMethods(output, methods, isComponent) {
+  output.methods = {};
+  let target = isComponent ? output.methods : output;
+
+  target.__initComponent = function(e) {
+    let child = e;
+    var ref = e.$wx.props['data-ref'];
+    var wpyEvt = e.$wx.props['data-wpy-evt'];
+
+    let vm = this.$wepy;
+    vm.$children.push(child);
+    if (ref) {
+      if (vm.$refs[ref]) {
+        warn('duplicate ref "' + ref + '" will be covered by the last instance.\n', vm);
+      }
+      vm.$refs[ref] = child;
+    }
+    child.$evtId = wpyEvt;
+    child.$parent = vm;
+    child.$app = vm.$app;
+    child.$root = vm.$root;
+    // 支付宝组件嵌套时，子组件执行早已组件
+    if (e.$children && e.$children.length) {
+      e.$children.forEach(x => {
+        x.$app = vm.$app;
+        x.$root = vm.$root;
+      });
+    }
+    return vm;
+  };
+  target.__dispatcher = dispatcher;
+
+  // TODO: perf
+  // Only orginal component method goes to target. no need to add all methods.
+  if (methods) {
+    Object.keys(methods).forEach(method => {
+      target[method] = methods[method];
+    });
+  }
+}
diff --git a/packages/core/ant/init/props.js b/packages/core/ant/init/props.js
new file mode 100644
index 000000000..f5c3256e9
--- /dev/null
+++ b/packages/core/ant/init/props.js
@@ -0,0 +1,73 @@
+import { observe } from '../../weapp/observer/index';
+import { proxy } from '../../weapp/init/data';
+import { isArr, isStr, isObj } from '../../weapp/util/index';
+
+const observerFn = function() {
+  return function(newVal, oldVal, changedPaths) {
+    let vm = this.$wepy;
+
+    // changedPaths 长度大于 1，说明是由内部赋值改变的 prop
+    if (changedPaths.length > 1) {
+      return;
+    }
+    let _data = newVal;
+    if (typeof _data === 'function') {
+      _data = _data.call(vm);
+    }
+    vm[changedPaths[0]] = _data;
+  };
+};
+/*
+ * patch props option
+ */
+export function patchProps(output, props) {
+  let newProps = {};
+  if (isStr(props)) {
+    newProps = [props];
+  }
+  if (isArr(props)) {
+    props.forEach(prop => {
+      newProps[prop] = {
+        type: null,
+        observer: observerFn(output, props, prop)
+      };
+    });
+  } else if (isObj(props)) {
+    for (let k in props) {
+      let prop = props[k];
+
+      // notsupport obj
+      if (!isObj(prop)) {
+        newProps[k] = prop;
+      } else {
+        newProps[k] = prop.default ? prop.default : '';
+      }
+    }
+  }
+
+  newProps['onInit'] = '';
+  output.properties = newProps;
+}
+
+/*
+ * init props
+ */
+export function initProps(vm, properties) {
+  vm._props = {};
+
+  if (!properties) {
+    return;
+  }
+
+  Object.keys(properties).forEach(key => {
+    vm._props[key] = properties[key].value;
+    proxy(vm, '_props', key);
+  });
+
+  observe({
+    vm: vm,
+    key: '',
+    value: vm._props,
+    root: true
+  });
+}
diff --git a/packages/core/ant/native/app.js b/packages/core/ant/native/app.js
new file mode 100644
index 000000000..66cb54559
--- /dev/null
+++ b/packages/core/ant/native/app.js
@@ -0,0 +1,10 @@
+import { patchMixins, patchAppLifecycle } from '../init/index';
+
+export function app(option, rel) {
+  let appConfig = {};
+
+  patchMixins(appConfig, option, option.mixins);
+  patchAppLifecycle(appConfig, option, rel);
+
+  return App(appConfig);
+}
diff --git a/packages/core/ant/native/component.js b/packages/core/ant/native/component.js
new file mode 100644
index 000000000..1691a7761
--- /dev/null
+++ b/packages/core/ant/native/component.js
@@ -0,0 +1,34 @@
+import { patchMixins, patchMethods, patchData, patchLifecycle, patchProps, patchRelations } from '../init/index';
+
+export function component(opt = {}, rel) {
+  let compConfig = {
+    externalClasses: opt.externalClasses || [],
+    // support component options property
+    // example: options: {addGlobalClass:true}
+    options: opt.options || {}
+  };
+
+  patchMixins(compConfig, opt, opt.mixins);
+
+  if (opt.properties) {
+    compConfig.props = opt.properties;
+    if (opt.props) {
+      // eslint-disable-next-line no-console
+      console.warn(`props will be ignore, if properties is set`);
+    }
+  } else if (opt.props) {
+    patchProps(compConfig, opt.props);
+  }
+
+  compConfig.props = compConfig.properties;
+
+  patchMethods(compConfig, opt.methods, true);
+
+  patchData(compConfig, opt.data, true);
+
+  patchRelations(compConfig, opt.relations);
+
+  patchLifecycle(compConfig, opt, rel, true);
+
+  return Component(compConfig);
+}
diff --git a/packages/core/ant/native/index.js b/packages/core/ant/native/index.js
new file mode 100644
index 000000000..b5bce1f40
--- /dev/null
+++ b/packages/core/ant/native/index.js
@@ -0,0 +1,3 @@
+export * from './app';
+export * from './component';
+export * from './page';
diff --git a/packages/core/ant/native/page.js b/packages/core/ant/native/page.js
new file mode 100644
index 000000000..a2be9a78e
--- /dev/null
+++ b/packages/core/ant/native/page.js
@@ -0,0 +1,30 @@
+import { patchMixins, patchData, patchMethods, patchLifecycle, patchProps } from '../init/index';
+
+export function page(opt = {}, rel) {
+  let pageConfig = {
+    externalClasses: opt.externalClasses || [],
+    // support component options property
+    // example: options: {addGlobalClass:true}
+    options: opt.options || {}
+  };
+
+  patchMixins(pageConfig, opt, opt.mixins);
+
+  if (opt.properties) {
+    pageConfig.properties = opt.properties;
+    if (opt.props) {
+      // eslint-disable-next-line
+      console.warn(`props will be ignore, if properties is set`);
+    }
+  } else if (opt.props) {
+    patchProps(pageConfig, opt.props);
+  }
+
+  patchMethods(pageConfig, opt.methods);
+
+  patchData(pageConfig, opt.data);
+
+  patchLifecycle(pageConfig, opt, rel);
+
+  return Page(pageConfig);
+}
diff --git a/packages/core/ant/wepy.js b/packages/core/ant/wepy.js
new file mode 100644
index 000000000..f06bb73f6
--- /dev/null
+++ b/packages/core/ant/wepy.js
@@ -0,0 +1,12 @@
+import WepyConstructor from '../weapp/class/WepyConstructor';
+import $global from '../weapp/global';
+import { initGlobalAPI } from './apis/index';
+import { config } from '../weapp/config';
+
+const wepy = initGlobalAPI(WepyConstructor);
+
+wepy.config = config;
+wepy.global = $global;
+wepy.version = __VERSION__;
+
+export default wepy;
diff --git a/packages/core/dist/wepy.ant.js b/packages/core/dist/wepy.ant.js
new file mode 100644
index 000000000..0278eac86
--- /dev/null
+++ b/packages/core/dist/wepy.ant.js
@@ -0,0 +1,2796 @@
+'use strict';
+
+// can we use __proto__?
+function getHasProto() {
+  var hasProto = false;
+  if ('__proto__' in {}) {
+    var fn = function () {};
+    var arr = [];
+    arr.__proto__ = { push: fn };
+    hasProto = fn === arr.push;
+  }
+  return hasProto;
+}
+var hasProto = getHasProto();
+
+var _Set; // $flow-disable-line
+/* istanbul ignore if */ if (typeof Set !== 'undefined' && isNative(Set)) {
+  // use native Set when available.
+  _Set = Set;
+} else {
+  // a non-standard Set polyfill that only works with primitive keys.
+  _Set = /*@__PURE__*/(function () {
+    function Set() {
+      this.set = Object.create(null);
+    }
+    Set.prototype.has = function has (key) {
+      return this.set[key] === true;
+    };
+    Set.prototype.add = function add (key) {
+      this.set[key] = true;
+    };
+    Set.prototype.clear = function clear () {
+      this.set = Object.create(null);
+    };
+
+    return Set;
+  }());
+}
+
+/* istanbul ignore next */
+function isNative(Ctor) {
+  return typeof Ctor === 'function' && /native code/.test(Ctor.toString());
+}
+
+/**
+ * String type check
+ */
+var isStr = function (v) { return typeof v === 'string'; };
+/**
+ * Number type check
+ */
+var isNum = function (v) { return typeof v === 'number'; };
+/**
+ * Array type check
+ */
+var isArr = Array.isArray;
+/**
+ * undefined type check
+ */
+var isUndef = function (v) { return v === undefined; };
+/**
+ * Function type check
+ */
+var isFunc = function (v) { return typeof v === 'function'; };
+/**
+ * Quick object check - this is primarily used to tell
+ * Objects from primitive values when we know the value
+ * is a JSON-compliant type.
+ */
+function isObject(obj) {
+  return obj !== null && typeof obj === 'object';
+}
+
+var isObj = isObject;
+/**
+ * Strict object type check. Only returns true
+ * for plain JavaScript objects.
+ */
+var _toString = Object.prototype.toString;
+function isPlainObject(obj) {
+  return _toString.call(obj) === '[object Object]';
+}
+
+/**
+ * Check whether the object has the property.
+ */
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+function hasOwn(obj, key) {
+  return hasOwnProperty.call(obj, key);
+}
+
+/**
+ * Perform no operation.
+ * Stubbing args to make Flow happy without leaving useless transpiled code
+ * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/)
+ */
+// eslint-disable-next-line
+function noop(a, b, c) {}
+
+/**
+ * Check if val is a valid array index.
+ */
+function isValidArrayIndex(val) {
+  var n = parseFloat(String(val));
+  return n >= 0 && Math.floor(n) === n && isFinite(val);
+}
+
+/**
+ * Convert an Array-lik object to a real Array
+ */
+function toArray(list, start) {
+  if ( start === void 0 ) start = 0;
+
+  var i = list.length - start;
+  var rst = new Array(i);
+  while (i--) {
+    rst[i] = list[i + start];
+  }
+  return rst;
+}
+
+/**
+ * Cached simply key function return
+ */
+var cached = function (fn) {
+  var cache = {};
+  return function (str) { return cache[str] || (cache[str] = fn(str)); };
+};
+
+var camelizeRE = /-(\w)/g;
+
+/**
+ * camelize words
+ * e.g. my-key => myKey
+ */
+var camelize = cached(function (str) { return str.replace(camelizeRE, function (_, c) { return (c ? c.toUpperCase() : ''); }); });
+
+/*
+ * extend objects
+ * e.g.
+ * extend({}, {a: 1}) : extend {a: 1} to {}
+ * extend(true, [], [1,2,3]) : deep extend [1,2,3] to an empty array
+ * extend(true, {}, {a: 1}, {b: 2}) : deep extend two objects to {}
+ */
+function extend() {
+  var arguments$1 = arguments;
+
+  var options,
+    name,
+    src,
+    copy,
+    copyIsArray,
+    clone,
+    target = arguments[0] || {},
+    i = 1,
+    length = arguments.length,
+    deep = false;
+
+  // Handle a deep copy situation
+  if (typeof target === 'boolean') {
+    deep = target;
+
+    // Skip the boolean and the target
+    target = arguments[i] || {};
+    i++;
+  }
+
+  // Handle case when target is a string or something (possible in deep copy)
+  if (typeof target !== 'object' && !(typeof target === 'function')) {
+    target = {};
+  }
+
+  // Extend jQuery itself if only one argument is passed
+  if (i === length) {
+    target = this;
+    i--;
+  }
+
+  for (; i < length; i++) {
+    // Only deal with non-null/undefined values
+    if ((options = arguments$1[i])) {
+      // Extend the base object
+      for (name in options) {
+        src = target[name];
+        copy = options[name];
+
+        // Prevent never-ending loop
+        if (target === copy) {
+          continue;
+        }
+
+        // Recurse if we're merging plain objects or arrays
+        if (deep && copy && (isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) {
+          if (copyIsArray) {
+            copyIsArray = false;
+            clone = src && Array.isArray(src) ? src : [];
+          } else {
+            clone = src && isPlainObject(src) ? src : {};
+          }
+
+          // Never move original objects, clone them
+          target[name] = extend(deep, clone, copy);
+
+          // Don't bring in undefined values => bring undefined values
+        } else {
+          target[name] = copy;
+        }
+      }
+    }
+  }
+
+  // Return the modified object
+  return target;
+}
+
+/*
+ * clone objects, return a cloned object default to use deep clone
+ * e.g.
+ * clone({a: 1})
+ * clone({a: b: {c : 1}}, false);
+ */
+function clone(sth, deep) {
+  if ( deep === void 0 ) deep = true;
+
+  if (isArr(sth)) {
+    return extend(deep, [], sth);
+  } else if ('' + sth === 'null') {
+    return sth;
+  } else if (isPlainObject(sth)) {
+    return extend(deep, {}, sth);
+  } else {
+    return sth;
+  }
+}
+
+var WEAPP_APP_LIFECYCLE = ['onLaunch', 'onShow', 'onHide', 'onError', 'onPageNotFound'];
+
+var WEAPP_PAGE_LIFECYCLE = [
+  'onLoad',
+  'onShow',
+  'onReady',
+  'onHide',
+  'onUnload',
+  'onPullDownRefresh',
+  'onReachBottom',
+  'onShareAppMessage',
+  'onPageScroll',
+  'onTabItemTap',
+  'onResize'
+];
+
+var WEAPP_COMPONENT_LIFECYCLE = ['beforeCreate', 'created', 'attached', 'ready', 'moved', 'detached'];
+
+var WEAPP_LIFECYCLE = []
+  .concat(WEAPP_APP_LIFECYCLE)
+  .concat(WEAPP_PAGE_LIFECYCLE)
+  .concat(WEAPP_COMPONENT_LIFECYCLE);
+
+var config = {};
+
+var warn = noop;
+
+var generateComponentTrace = function(vm) {
+  return ("Found in component: \"" + (vm.$is) + "\"");
+};
+
+{
+  var hasConsole = typeof console !== 'undefined';
+  // TODO
+  warn = function (msg, vm) {
+    if (hasConsole && !config.silent) {
+      // eslint-disable-next-line
+      console.error("[WePY warn]: " + msg + (vm ? generateComponentTrace(vm) : ''));
+    }
+  };
+}
+
+function handleError(err, vm, info) {
+  if (vm) {
+    var cur = vm;
+    while ((cur = cur.$parent)) {
+      var hooks = cur.$options.errorCaptured;
+      if (hooks) {
+        for (var i = 0; i < hooks.length; i++) {
+          try {
+            var capture = hooks[i].call(cur, err, vm, info) === false;
+            if (capture) { return; }
+          } catch (e) {
+            globalHandleError(e, cur, 'errorCaptured hook');
+          }
+        }
+      }
+    }
+  }
+  globalHandleError(err, vm, info);
+}
+
+function globalHandleError(err, vm, info) {
+  if (config.errorHandler) {
+    try {
+      return config.errorHandler.call(null, err, vm, info);
+    } catch (e) {
+      logError(e, null, 'config.errorHandler');
+    }
+  }
+  logError(err, vm, info);
+}
+
+function logError(err, vm, info) {
+  {
+    warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
+  }
+  /* istanbul ignore else */
+  if (typeof console !== 'undefined') {
+    // eslint-disable-next-line
+    console.error(err);
+  } else {
+    throw err;
+  }
+}
+
+var callbacks = [];
+var pending = false;
+
+function flushCallbacks() {
+  pending = false;
+  var copies = callbacks.slice(0);
+  callbacks.length = 0;
+  for (var i = 0; i < copies.length; i++) {
+    copies[i]();
+  }
+}
+
+// Here we have async deferring wrappers using both micro and macro tasks.
+// In < 2.4 we used micro tasks everywhere, but there are some scenarios where
+// micro tasks have too high a priority and fires in between supposedly
+// sequential events (e.g. #4521, #6690) or even between bubbling of the same
+// event (#6566). However, using macro tasks everywhere also has subtle problems
+// when state is changed right before repaint (e.g. #6813, out-in transitions).
+// Here we use micro task by default, but expose a way to force macro task when
+// needed (e.g. in event handlers attached by v-on).
+var microTimerFunc;
+var macroTimerFunc;
+var useMacroTask = false;
+
+// Determine (macro) Task defer implementation.
+// Technically setImmediate should be the ideal choice, but it's only available
+// in IE. The only polyfill that consistently queues the callback after all DOM
+// events triggered in the same loop is by using MessageChannel.
+/* istanbul ignore if */
+if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
+  macroTimerFunc = function () {
+    setImmediate(flushCallbacks);
+  };
+} else if (
+  /* eslint-disable no-undef */
+  typeof MessageChannel !== 'undefined' &&
+  (isNative(MessageChannel) ||
+    // PhantomJS
+    MessageChannel.toString() === '[object MessageChannelConstructor]')
+) {
+  var channel = new MessageChannel();
+  var port = channel.port2;
+  channel.port1.onmessage = flushCallbacks;
+  macroTimerFunc = function () {
+    port.postMessage(1);
+  };
+  /* eslint-enable no-undef */
+} else {
+  /* istanbul ignore next */
+  macroTimerFunc = function () {
+    setTimeout(flushCallbacks, 0);
+  };
+}
+
+// Determine MicroTask defer implementation.
+/* istanbul ignore next, $flow-disable-line */
+if (typeof Promise !== 'undefined' && isNative(Promise)) {
+  var p = Promise.resolve();
+  microTimerFunc = function () {
+    p.then(flushCallbacks);
+    // in problematic UIWebViews, Promise.then doesn't completely break, but
+    // it can get stuck in a weird state where callbacks are pushed into the
+    // microtask queue but the queue isn't being flushed, until the browser
+    // needs to do some other work, e.g. handle a timer. Therefore we can
+    // "force" the microtask queue to be flushed by adding an empty timer.
+    // if (isIOS) setTimeout(noop)
+  };
+} else {
+  // fallback to macro
+  microTimerFunc = macroTimerFunc;
+}
+
+function nextTick(cb, ctx) {
+  var _resolve;
+  callbacks.push(function () {
+    if (cb) {
+      try {
+        cb.call(ctx);
+      } catch (e) {
+        handleError(e, ctx, 'nextTick');
+      }
+    } else if (_resolve) {
+      _resolve(ctx);
+    }
+  });
+  if (!pending) {
+    pending = true;
+    if (useMacroTask) {
+      macroTimerFunc();
+    } else {
+      microTimerFunc();
+    }
+  }
+  // $flow-disable-line
+  if (!cb && typeof Promise !== 'undefined') {
+    return new Promise(function (resolve) {
+      _resolve = resolve;
+    });
+  }
+}
+
+var renderCallbacks = [];
+
+function renderFlushCallbacks() {
+  var copies = renderCallbacks.slice(0);
+  renderCallbacks.length = 0;
+  for (var i = 0; i < copies.length; i++) {
+    copies[i]();
+  }
+}
+
+function renderNextTick(cb, ctx) {
+  var _resolve;
+  renderCallbacks.push(function () {
+    if (cb) {
+      try {
+        cb.call(ctx);
+      } catch (e) {
+        handleError(e, ctx, 'nextTick');
+      }
+    } else if (_resolve) {
+      _resolve(ctx);
+    }
+  });
+
+  if (!cb && typeof Promise !== 'undefined') {
+    return new Promise(function (resolve) {
+      _resolve = resolve;
+    });
+  }
+}
+
+/**
+ * Parse a v-model expression into a base path and a final key segment.
+ * Handles both dot-path and possible square brackets.
+ *
+ * Possible cases:
+ *
+ * - test
+ * - test[key]
+ * - test[test1[key]]
+ * - test["a"][key]
+ * - xxx.test[a[a].test1[key]]
+ * - test.xxx.a["asa"][test1[key]]
+ *
+ */
+
+/**
+ * Remove an item from an array
+ */
+function remove(arr, item) {
+  if (arr.length) {
+    var index = arr.indexOf(item);
+    if (index > -1) {
+      return arr.splice(index, 1);
+    }
+  }
+}
+
+/**
+ * Define a property.
+ */
+function def(obj, key, val, enumerable) {
+  Object.defineProperty(obj, key, {
+    value: val,
+    enumerable: !!enumerable,
+    writable: true,
+    configurable: true
+  });
+}
+
+/**
+ * Parse simple path.
+ */
+var bailRE = /[^\w.$]/;
+function parsePath(path) {
+  if (bailRE.test(path)) {
+    return;
+  }
+  var segments = path.split('.');
+  return function(obj) {
+    for (var i = 0; i < segments.length; i++) {
+      if (!obj) { return; }
+      obj = obj[segments[i]];
+    }
+    return obj;
+  };
+}
+
+// import type Watcher from './watcher'
+
+var uid = 0;
+
+/**
+ * A dep is an observable that can have multiple
+ * directives subscribing to it.
+ */
+var Dep = function Dep() {
+  this.id = uid++;
+  this.subs = [];
+};
+
+Dep.prototype.addSub = function addSub (sub) {
+  this.subs.push(sub);
+};
+
+Dep.prototype.removeSub = function removeSub (sub) {
+  remove(this.subs, sub);
+};
+
+Dep.prototype.depend = function depend () {
+  if (Dep.target) {
+    Dep.target.addDep(this);
+  }
+};
+
+Dep.prototype.notify = function notify () {
+  // stabilize the subscriber list first
+  var subs = this.subs.slice();
+  for (var i = 0, l = subs.length; i < l; i++) {
+    subs[i].update();
+  }
+};
+
+// the current target watcher being evaluated.
+// this is globally unique because there could be only one
+// watcher being evaluated at any time.
+Dep.target = null;
+var targetStack = [];
+
+function pushTarget(_target) {
+  if (Dep.target) { targetStack.push(Dep.target); }
+  Dep.target = _target;
+}
+
+function popTarget() {
+  Dep.target = targetStack.pop();
+}
+
+/**
+ * @desc ObserverPath 类以及相关处理函数
+ * Observer 所在位置对应在整棵 data tree 的路径集合
+ * @createDate 2019-07-21
+ */
+
+/**
+ * 生成完整路径
+ * @param key  {String|Number} 当为字符串时，说明是属性名，当为数字时，说明是索引
+ * @param parentPath {String} 父路径
+ * @return {string}
+ */
+var setPath = function (key, parentPath) {
+  return isNum(key) ? (parentPath + "[" + key + "]") : (parentPath + "." + key);
+};
+
+/**
+ * 得到 ObserverPath
+ * @param value 被观察对象
+ * @return {ObserverPath|null}
+ */
+var pickOp = function (value) {
+  return isObject(value) && hasOwn(value, '__ob__') ? value.__ob__.op : null;
+};
+
+var ObserverPath = function ObserverPath(key, ob, parentOp) {
+  this.ob = ob;
+  // eslint-disable-next-line eqeqeq
+  if (parentOp) {
+    var ref = getPathMap(key, parentOp.pathKeys, parentOp.pathMap);
+    var combinePathKeys = ref.combinePathKeys;
+    var combinePathMap = ref.combinePathMap;
+    this.pathKeys = combinePathKeys;
+    this.pathMap = combinePathMap;
+  } else {
+    this.pathKeys = null;
+    this.pathMap = null;
+  }
+};
+
+ObserverPath.prototype.traverseOp = function traverseOp (key, pathKeys, pathMap, handler) {
+  // 得到 newKey 和 pathMap 组合的路径集合
+  var ref = getPathMap(key, pathKeys, pathMap);
+    var combinePathMap = ref.combinePathMap;
+    var combinePathKeys = ref.combinePathKeys;
+  var handlePathKeys = [];
+  var handlePathMap = {};
+  var hasChange = false;
+
+  // 遍历 combinePathMap
+  for (var i = 0; i < combinePathKeys.length; i++) {
+    var pathObj = handler(combinePathMap[combinePathKeys[i]], this);
+    if (pathObj) {
+      hasChange = true;
+      handlePathKeys.push(pathObj.path);
+      handlePathMap[pathObj.path] = pathObj;
+    }
+  }
+
+  if (hasChange) {
+    var value = this.ob.value;
+    if (Array.isArray(value)) {
+      for (var i$1 = 0; i$1 < value.length; i$1++) {
+        var op = pickOp(value[i$1]);
+        op && op.traverseOp(i$1, handlePathKeys, handlePathMap, handler);
+      }
+    } else {
+      var keys = Object.keys(value);
+      for (var i$2 = 0; i$2 < keys.length; i$2++) {
+        var key$1 = keys[i$2];
+        var op$1 = pickOp(value[key$1]);
+        op$1 && op$1.traverseOp(key$1, handlePathKeys, handlePathMap, handler);
+      }
+    }
+  }
+};
+
+ObserverPath.prototype.addPath = function addPath (pathObj) {
+  this.pathKeys.push(pathObj.path);
+  this.pathMap[pathObj.path] = pathObj;
+};
+
+ObserverPath.prototype.delPath = function delPath (path) {
+  remove(this.pathKeys, path);
+  delete this.pathMap[path];
+};
+
+/**
+ * 添加新的 __ob__ 的 path
+ */
+function addPaths(newKey, op, parentOp) {
+  op.traverseOp(newKey, parentOp.pathKeys, parentOp.pathMap, handler);
+
+  function handler(pathObj, op) {
+    if (!(pathObj.path in op.pathMap)) {
+      // 新增一条 path
+      op.addPath(pathObj);
+      return pathObj;
+    } else {
+      return null;
+    }
+  }
+}
+
+/**
+ * 删除指定的 __ob__ 的 path
+ */
+function cleanPaths(oldKey, op, parentOp) {
+  op.traverseOp(oldKey, parentOp.pathKeys, parentOp.pathMap, handler);
+
+  function handler(pathObj, op) {
+    // 删除一条 path
+    op.delPath(pathObj.path);
+    return pathObj;
+  }
+}
+
+/**
+ * 得到 pathMap 与 key 组合后的路径集合
+ */
+function getPathMap(key, pathKeys, pathMap) {
+  var obj;
+
+  if (pathMap) {
+    // console.log('pathMap', pathMap)
+    var combinePathKeys = [];
+    var combinePathMap = {};
+    for (var i = 0; i < pathKeys.length; i++) {
+      var path = setPath(key, pathMap[pathKeys[i]].path);
+      combinePathKeys.push(path);
+      combinePathMap[path] = { key: key, root: pathMap[pathKeys[i]].root, path: path };
+    }
+    return { combinePathKeys: combinePathKeys, combinePathMap: combinePathMap };
+  } else {
+    return {
+      combinePathKeys: [key],
+      combinePathMap: ( obj = {}, obj[key] = { key: key, root: key, path: key }, obj)
+    };
+  }
+}
+
+/*
+ * not type checking this file because flow doesn't play well with
+ * dynamically accessing methods on Array prototype
+ */
+
+var arrayProto = Array.prototype;
+var arrayMethods = Object.create(arrayProto);
+
+var methodsToPatch = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'];
+
+/**
+ * Intercept mutating methods and emit events
+ */
+methodsToPatch.forEach(function(method) {
+  // cache original method
+  var original = arrayProto[method];
+  def(arrayMethods, method, function mutator() {
+    var args = [], len$1 = arguments.length;
+    while ( len$1-- ) args[ len$1 ] = arguments[ len$1 ];
+
+    var len = this.length;
+    // 清除已经失效的 paths
+    if (len > 0) {
+      switch (method) {
+        case 'pop':
+          delInvalidPaths(len - 1, this[len - 1], this);
+          break;
+        case 'shift':
+          delInvalidPaths(0, this[0], this);
+          break;
+        case 'splice':
+        case 'sort':
+        case 'reverse':
+          for (var i = 0; i < this.length; i++) {
+            delInvalidPaths(i, this[i], this);
+          }
+      }
+    }
+
+    var result = original.apply(this, args);
+    var ob = this.__ob__;
+    var vm = ob.vm;
+
+    // push parent key to dirty, wait to setData
+    if (vm.$dirty) {
+      if (method === 'push') {
+        var lastIndex = ob.value.length - 1;
+        vm.$dirty.set(ob.op, lastIndex, ob.value[lastIndex]);
+      } else {
+        vm.$dirty.set(ob.op, null, ob.value);
+      }
+    }
+
+    // 这里和 vue 不一样，所有变异方法都需要更新 path
+    ob.observeArray(ob.key, ob.value);
+
+    // notify change
+    ob.dep.notify();
+    return result;
+  });
+});
+
+function delInvalidPaths(key, value, parent) {
+  if (isObject(value) && hasOwn(value, '__ob__')) {
+    // delete invalid paths
+    cleanPaths(key, value.__ob__.op, parent.__ob__.op);
+  }
+}
+
+var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
+
+/**
+ * By default, when a reactive property is set, the new value is
+ * also converted to become reactive. However when passing down props,
+ * we don't want to force conversion because the value may be a nested value
+ * under a frozen data structure. Converting it would defeat the optimization.
+ */
+var observerState = {
+  shouldConvert: true
+};
+
+/**
+ * Observer class that are attached to each observed
+ * object. Once attached, the observer converts target
+ * object's property keys into getter/setters that
+ * collect dependencies and dispatches updates.
+ */
+var Observer = function Observer(ref) {
+  var vm = ref.vm;
+  var key = ref.key;
+  var value = ref.value;
+  var parent = ref.parent;
+
+  this.value = value;
+  this.dep = new Dep();
+  this.vmCount = 0;
+  this.vm = vm;
+  this.op = new ObserverPath(key, this, parent && parent.__ob__ && parent.__ob__.op);
+
+  def(value, '__ob__', this);
+  if (Array.isArray(value)) {
+    var augment = hasProto ? protoAugment : copyAugment;
+    augment(value, arrayMethods, arrayKeys);
+    this.observeArray(key, value);
+  } else {
+    this.walk(key, value);
+  }
+};
+
+/**
+ * Walk through each property and convert them into
+ * getter/setters. This method should only be called when
+ * value type is Object.
+ */
+Observer.prototype.walk = function walk (key, obj) {
+  var keys = Object.keys(obj);
+  for (var i = 0; i < keys.length; i++) {
+    defineReactive({ vm: this.vm, obj: obj, key: keys[i], value: obj[keys[i]], parent: obj });
+    //defineReactive(this.vm, obj, keys[i], obj[keys[i]]);
+  }
+};
+
+/**
+ * Observe a list of Array items.
+ */
+Observer.prototype.observeArray = function observeArray (key, items) {
+  for (var i = 0, l = items.length; i < l; i++) {
+    observe({ vm: this.vm, key: i, value: items[i], parent: items });
+  }
+};
+
+/**
+ * Check if path exsit in vm
+ */
+Observer.prototype.hasPath = function hasPath (path) {
+  var value = this.vm;
+  var key = '';
+  var i = 0;
+  while (i < path.length) {
+    if (path[i] !== '.' && path[i] !== '[' && path[i] !== ']') {
+      key += path[i];
+    } else if (key.length !== 0) {
+      value = value[key];
+      key = '';
+      if (!isObject(value)) {
+        return false;
+      }
+    }
+    i++;
+  }
+  return true;
+};
+
+/**
+ * Is this path value equal
+ */
+Observer.prototype.isPathEq = function isPathEq (path, value) {
+  var objValue = this.vm;
+  var key = '';
+  var i = 0;
+  while (i < path.length) {
+    if (path[i] !== '.' && path[i] !== '[' && path[i] !== ']') {
+      key += path[i];
+    } else if (key.length !== 0) {
+      objValue = objValue[key];
+      key = '';
+      if (!isObject(objValue)) {
+        return false;
+      }
+    }
+    i++;
+  }
+  if (key.length !== 0) {
+    objValue = objValue[key];
+  }
+  return value === objValue;
+};
+
+// helpers
+
+/**
+ * Augment an target Object or Array by intercepting
+ * the prototype chain using __proto__
+ */
+function protoAugment(target, src) {
+  /* eslint-disable no-proto */
+  target.__proto__ = src;
+  /* eslint-enable no-proto */
+}
+
+/**
+ * Augment an target Object or Array by defining
+ * hidden properties.
+ */
+/* istanbul ignore next */
+function copyAugment(target, src, keys) {
+  for (var i = 0, l = keys.length; i < l; i++) {
+    var key = keys[i];
+    def(target, key, src[key]);
+  }
+}
+
+/**
+ * Attempt to create an observer instance for a value,
+ * returns the new observer if successfully observed,
+ * or the existing observer if the value already has one.
+ */
+function observe(ref) {
+  var vm = ref.vm;
+  var key = ref.key;
+  var value = ref.value;
+  var parent = ref.parent;
+  var root = ref.root;
+
+  if (!isObject(value)) {
+    return;
+  }
+  var ob;
+  if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
+    ob = value.__ob__;
+    var op = ob.op;
+    addPaths(key, op, parent.__ob__.op);
+  } else if (
+    observerState.shouldConvert &&
+    (Array.isArray(value) || isPlainObject(value)) &&
+    Object.isExtensible(value) &&
+    !value._isVue
+  ) {
+    ob = new Observer({ vm: vm, key: key, value: value, parent: parent });
+  }
+  if (root && ob) {
+    ob.vmCount++;
+  }
+  return ob;
+}
+
+/**
+ * Define a reactive property on an Object.
+ */
+function defineReactive(ref) {
+  var vm = ref.vm;
+  var obj = ref.obj;
+  var key = ref.key;
+  var value = ref.value;
+  var parent = ref.parent;
+  var customSetter = ref.customSetter;
+  var shallow = ref.shallow;
+
+  var dep = new Dep();
+
+  var property = Object.getOwnPropertyDescriptor(obj, key);
+  if (property && property.configurable === false) {
+    return;
+  }
+
+  // cater for pre-defined getter/setters
+  var getter = property && property.get;
+  if (!getter && arguments.length === 2) {
+    value = obj[key];
+  }
+  var setter = property && property.set;
+
+  var childOb = !shallow && observe({ vm: vm, key: key, value: value, parent: obj });
+  Object.defineProperty(obj, key, {
+    enumerable: true,
+    configurable: true,
+    get: function reactiveGetter() {
+      var val = getter ? getter.call(obj) : value;
+      if (Dep.target) {
+        dep.depend();
+        if (childOb) {
+          childOb.dep.depend();
+          if (Array.isArray(val)) {
+            dependArray(val);
+          }
+        }
+      }
+      return val;
+    },
+    set: function reactiveSetter(newVal) {
+      var val = getter ? getter.call(obj) : value;
+      /* eslint-disable no-self-compare */
+      if (newVal === val || (newVal !== newVal && val !== val)) {
+        return;
+      }
+
+      if (isObject(value) && hasOwn(value, '__ob__')) {
+        /**
+         * 删掉无效的 paths
+         * 注意：即使 path 只有一个也要删掉，因为其子节点可能有多个 path
+         */
+        cleanPaths(key, value.__ob__.op, parent.__ob__.op);
+      }
+
+      /* eslint-enable no-self-compare */
+      if ("development" !== 'production' && customSetter) {
+        customSetter();
+      }
+      if (setter) {
+        setter.call(obj, newVal);
+      } else {
+        value = newVal;
+      }
+
+      // Have to set dirty after value assigned, otherwise the dirty key is incrrect.
+      if (vm) {
+        // push parent key to dirty, wait to setData
+        if (vm.$dirty) {
+          vm.$dirty.set(obj.__ob__.op, key, newVal);
+        }
+      }
+      childOb = !shallow && observe({ vm: vm, key: key, value: newVal, parent: parent });
+      dep.notify();
+    }
+  });
+}
+
+/**
+ * Set a property on an object. Adds the new property and
+ * triggers change notification if the property doesn't
+ * already exist.
+ */
+function set(vm, target, key, val) {
+  if (Array.isArray(target) && isValidArrayIndex(key)) {
+    target.length = Math.max(target.length, key);
+    target.splice(key, 1, val);
+    return val;
+  }
+
+  if (key in target && !(key in Object.prototype)) {
+    target[key] = val;
+    return val;
+  }
+
+  var ob = target.__ob__;
+  if (target._isVue || (ob && ob.vmCount)) {
+    "development" !== 'production' &&
+      warn(
+        'Avoid adding reactive properties to a Vue instance or its root $data ' +
+          'at runtime - declare it upfront in the data option.'
+      );
+    return val;
+  }
+
+  if (!ob) {
+    target[key] = val;
+    return val;
+  }
+
+  if (isObject(target[key]) && hasOwn(target[key], '__ob__')) {
+    // delete invalid paths
+    cleanPaths(key, target[key].__ob__.op, ob.op);
+  }
+  defineReactive({ vm: vm, obj: ob.value, key: key, value: val, parent: ob.value });
+  if (vm) {
+    // push parent key to dirty, wait to setData
+    if (vm.$dirty && hasOwn(target, '__ob__')) {
+      vm.$dirty.set(target.__ob__.op, key, val);
+    }
+  }
+  ob.dep.notify();
+  return val;
+}
+
+/**
+ * Delete a property and trigger change if necessary.
+ */
+function del(target, key) {
+  if (Array.isArray(target) && isValidArrayIndex(key)) {
+    target.splice(key, 1);
+    return;
+  }
+
+  var ob = target.__ob__;
+  if (target._isVue || (ob && ob.vmCount)) {
+    "development" !== 'production' &&
+      warn('Avoid deleting properties on a Vue instance or its root $data ' + '- just set it to null.');
+    return;
+  }
+
+  if (!hasOwn(target, key)) {
+    return;
+  }
+
+  // set $dirty
+  target[key] = null;
+  delete target[key];
+  if (!ob) {
+    return;
+  }
+  ob.dep.notify();
+}
+
+/**
+ * Collect dependencies on array elements when the array is touched, since
+ * we cannot intercept array element access like property getters.
+ */
+function dependArray(value) {
+  for (var e = (void 0), i = 0, l = value.length; i < l; i++) {
+    e = value[i];
+    e && e.__ob__ && e.__ob__.dep.depend();
+    if (Array.isArray(e)) {
+      dependArray(e);
+    }
+  }
+}
+
+var Base = function Base() {
+  this._events = {};
+  this._watchers = [];
+};
+
+Base.prototype.$set = function $set (target, key, val) {
+  return set(this, target, key, val);
+};
+
+Base.prototype.$delete = function $delete (target, key) {
+  return del(target, key);
+};
+
+Base.prototype.$on = function $on (event, fn) {
+    var this$1 = this;
+
+  if (isArr(event)) {
+    event.forEach(function (item) {
+      if (isStr(item)) {
+        this$1.$on(item, fn);
+      } else if (isObj(item)) {
+        this$1.$on(item.event, item.fn);
+      }
+    });
+  } else {
+    (this._events[event] || (this._events[event] = [])).push(fn);
+  }
+  return this;
+};
+
+Base.prototype.$once = function $once () {};
+
+Base.prototype.$off = function $off (event, fn) {
+    var this$1 = this;
+
+  if (!event && !fn) {
+    this._events = Object.create(null);
+    return this;
+  }
+
+  if (isArr(event)) {
+    event.forEach(function (item) {
+      if (isStr(item)) {
+        this$1.$off(item, fn);
+      } else if (isObj(item)) {
+        this$1.$off(item.event, item.fn);
+      }
+    });
+    return this;
+  }
+  if (!this._events[event]) { return this; }
+
+  if (!fn) {
+    this._events[event] = null;
+    return this;
+  }
+
+  if (fn) {
+    var fns = this._events[event];
+    var i = fns.length;
+    while (i--) {
+      var tmp = fns[i];
+      if (tmp === fn || tmp.fn === fn) {
+        fns.splice(i, 1);
+        break;
+      }
+    }
+  }
+  return this;
+};
+
+Base.prototype.$emit = function $emit (event) {
+    var this$1 = this;
+
+  var vm = this;
+  var lowerCaseEvent = event.toLowerCase();
+  var fns = this._events[event] || [];
+  if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {
+    // TODO: handler warn
+  }
+  var args = toArray(arguments, 1);
+  fns.forEach(function (fn) {
+    try {
+      fn.apply(this$1, args);
+    } catch (e) {
+      handleError(e, vm, ("event handler for \"" + event + "\""));
+    }
+  });
+  return this;
+};
+
+var seenObjects = new _Set();
+
+/**
+ * Recursively traverse an object to evoke all converted
+ * getters, so that every nested property inside the object
+ * is collected as a "deep" dependency.
+ */
+function traverse(val) {
+  _traverse(val, seenObjects);
+  seenObjects.clear();
+}
+
+function _traverse(val, seen) {
+  var i, keys;
+  var isA = Array.isArray(val);
+  if ((!isA && !isObject(val)) || Object.isFrozen(val)) {
+    return;
+  }
+  if (val.__ob__) {
+    var depId = val.__ob__.dep.id;
+    if (seen.has(depId)) {
+      return;
+    }
+    seen.add(depId);
+  }
+  if (isA) {
+    i = val.length;
+    while (i--) { _traverse(val[i], seen); }
+  } else {
+    keys = Object.keys(val);
+    i = keys.length;
+    while (i--) { _traverse(val[keys[i]], seen); }
+  }
+}
+
+//import { callHook, activateChildComponent } from '../instance/lifecycle';
+
+var MAX_UPDATE_COUNT = 100;
+
+var queue = [];
+var activatedChildren = [];
+var has = {};
+var circular = {};
+var waiting = false;
+var flushing = false;
+var index = 0;
+
+/**
+ * Reset the scheduler's state.
+ */
+function resetSchedulerState() {
+  index = queue.length = activatedChildren.length = 0;
+  has = {};
+  {
+    circular = {};
+  }
+  waiting = flushing = false;
+}
+
+/**
+ * Flush both queues and run the watchers.
+ */
+function flushSchedulerQueue(times) {
+  if ( times === void 0 ) times = 0;
+
+  flushing = true;
+  var watcher, id;
+
+  // Sort queue before flush.
+  // This ensures that:
+  // 1. Components are updated from parent to child. (because parent is always
+  //    created before the child)
+  // 2. A component's user watchers are run before its render watcher (because
+  //    user watchers are created before the render watcher)
+  // 3. If a component is destroyed during a parent component's watcher run,
+  //    its watchers can be skipped.
+  times === 0 && queue.sort(function (a, b) { return a.id - b.id; });
+
+  // do not cache length because more watchers might be pushed
+  // as we run existing watchers
+  // there would be mutilple renderWatcher in the queue.
+  var renderWatcher = [];
+  if (times === 0) {
+    index = 0;
+  }
+  for (; index < queue.length; index++) {
+    // if it's renderWatcher, run it in the end
+    watcher = queue[index];
+    if (watcher && watcher.isRenderWatcher) {
+      renderWatcher.push(watcher);
+      continue;
+    }
+    id = watcher.id;
+    has[id] = null;
+    watcher.run();
+    // in dev build, check and stop circular updates.
+    // eslint-disable-next-line
+    if ("development" !== 'production' && has[id] != null) {
+      circular[id] = (circular[id] || 0) + 1;
+      if (circular[id] > MAX_UPDATE_COUNT) {
+        warn(
+          'You may have an infinite update loop ' +
+            (watcher.user ? ("in watcher with expression \"" + (watcher.expression) + "\"") : "in a component render function."),
+          watcher.vm
+        );
+        resetSchedulerState();
+        return;
+      }
+    }
+  }
+  // Run renderWatcher in the end.
+  if (renderWatcher.length) {
+    renderWatcher.forEach(function (watcher) {
+      has[watcher.id] = null;
+      watcher.run();
+    });
+  }
+
+  // It may added new watcher to the queue in render watcher
+  var pendingQueue = queue.slice(index);
+
+  if (pendingQueue.length) {
+    flushSchedulerQueue(times + 1);
+  } else {
+    // keep copies of post queues before resetting state
+    // const activatedQueue = activatedChildren.slice()
+    // const updatedQueue = queue.slice()
+
+    resetSchedulerState();
+
+    // call component updated and activated hooks
+    // callActivatedHooks(activatedQueue)
+    // callUpdatedHooks(updatedQueue)
+
+    // devtool hook
+    /* istanbul ignore if */
+    /*
+    if (devtools && config.devtools) {
+      devtools.emit('flush')
+    }*/
+  }
+}
+
+/*
+function callActivatedHooks(queue) {
+  for (let i = 0; i < queue.length; i++) {
+    queue[i]._inactive = true;
+    activateChildComponent(queue[i], true);
+  }
+}
+*/
+
+/**
+ * Push a watcher into the watcher queue.
+ * Jobs with duplicate IDs will be skipped unless it's
+ * pushed when the queue is being flushed.
+ */
+function queueWatcher(watcher) {
+  var id = watcher.id;
+  // eslint-disable-next-line
+  if (has[id] == null) {
+    has[id] = true;
+    if (!flushing) {
+      queue.push(watcher);
+    } else {
+      // if already flushing, splice the watcher based on its id
+      // if already past its id, it will be run next immediately.
+      var i = queue.length - 1;
+      while (i > index && queue[i].id > watcher.id) {
+        i--;
+      }
+      queue.splice(i + 1, 0, watcher);
+    }
+    // queue the flush
+    if (!waiting) {
+      waiting = true;
+      nextTick(flushSchedulerQueue);
+    }
+  }
+}
+
+//import { SimpleSet } from '../util/index';
+
+var uid$1 = 0;
+
+/**
+ * A watcher parses an expression, collects dependencies,
+ * and fires callback when the expression value changes.
+ * This is used for both the $watch() api and directives.
+ */
+var Watcher = function Watcher(vm, expOrFn, cb, options, isRenderWatcher) {
+  this.vm = vm;
+  if (isRenderWatcher) {
+    vm._watcher = this;
+  }
+  vm._watchers.push(this);
+  // options
+  if (options) {
+    this.deep = !!options.deep;
+    this.user = !!options.user;
+    this.computed = !!options.computed;
+    this.sync = !!options.sync;
+  } else {
+    this.deep = this.user = this.computed = this.sync = false;
+  }
+  this.cb = cb;
+  this.id = ++uid$1; // uid for batching
+  this.active = true;
+  this.dirty = this.computed; // for computed watchers
+  this.deps = [];
+  this.newDeps = [];
+  this.depIds = new _Set();
+  this.newDepIds = new _Set();
+  this.isRenderWatcher = isRenderWatcher;
+  this.expression = expOrFn.toString();
+  // parse expression for getter
+  if (typeof expOrFn === 'function') {
+    this.getter = expOrFn;
+  } else {
+    this.getter = parsePath(expOrFn);
+    if (!this.getter) {
+      this.getter = function() {};
+      "development" !== 'production' &&
+        warn(
+          "Failed watching path: \"" + expOrFn + "\" " +
+            'Watcher only accepts simple dot-delimited paths. ' +
+            'For full control, use a function instead.',
+          vm
+        );
+    }
+  }
+  this.value = this.computed ? undefined : this.get();
+};
+
+/**
+ * Evaluate the getter, and re-collect dependencies.
+ */
+Watcher.prototype.get = function get () {
+  pushTarget(this);
+  var value;
+  var vm = this.vm;
+  try {
+    value = this.getter.call(vm, vm);
+  } catch (e) {
+    if (this.user) {
+      handleError(e, vm, ("getter for watcher \"" + (this.expression) + "\""));
+    } else {
+      throw e;
+    }
+  } finally {
+    // "touch" every property so they are all tracked as
+    // dependencies for deep watching
+    if (this.deep) {
+      traverse(value);
+    }
+    popTarget();
+    if (!this.isRenderWatcher) { this.cleanupDeps(); }
+  }
+  return value;
+};
+
+/**
+ * Add a dependency to this directive.
+ */
+Watcher.prototype.addDep = function addDep (dep) {
+  var id = dep.id;
+  if (!this.newDepIds.has(id)) {
+    this.newDepIds.add(id);
+    this.newDeps.push(dep);
+    if (!this.depIds.has(id)) {
+      dep.addSub(this);
+    }
+  }
+};
+
+/**
+ * Clean up for dependency collection.
+ */
+Watcher.prototype.cleanupDeps = function cleanupDeps () {
+  var i = this.deps.length;
+  while (i--) {
+    var dep = this.deps[i];
+    if (!this.newDepIds.has(dep.id)) {
+      dep.removeSub(this);
+    }
+  }
+  var tmp = this.depIds;
+  this.depIds = this.newDepIds;
+  this.newDepIds = tmp;
+  this.newDepIds.clear();
+  tmp = this.deps;
+  this.deps = this.newDeps;
+  this.newDeps = tmp;
+  this.newDeps.length = 0;
+};
+
+/**
+ * Subscriber interface.
+ * Will be called when a dependency changes.
+ */
+Watcher.prototype.update = function update () {
+  /* istanbul ignore else */
+  if (this.computed) {
+    this.dirty = true;
+  } else if (this.sync) {
+    this.run();
+  } else {
+    queueWatcher(this);
+  }
+};
+
+/**
+ * Scheduler job interface.
+ * Will be called by the scheduler.
+ */
+Watcher.prototype.run = function run () {
+  if (this.active) {
+    var value = this.get();
+    if (
+      value !== this.value ||
+      // Deep watchers and watchers on Object/Arrays should fire even
+      // when the value is the same, because the value may
+      // have mutated.
+      isObject(value) ||
+      this.deep
+    ) {
+      // set new value
+      var oldValue = this.value;
+      this.value = value;
+      if (this.user) {
+        try {
+          this.cb.call(this.vm, value, oldValue);
+        } catch (e) {
+          handleError(e, this.vm, ("callback for watcher \"" + (this.expression) + "\""));
+        }
+      } else {
+        this.cb.call(this.vm, value, oldValue);
+      }
+    }
+  }
+};
+
+/**
+ * Evaluate the value of the watcher.
+ * This only gets called for computed watchers.
+ */
+Watcher.prototype.evaluate = function evaluate () {
+  this.value = this.get();
+  if (this.vm.$dirty) {
+    var keyVal =
+      this._computedWatchers && this._computedWatchers[this.key]
+        ? this.vm._computedWatchers[this.key].value
+        : this.value;
+    this.vm.$dirty.push(this.key, this.key, keyVal, this.value);
+  }
+  this.dirty = false;
+  return this.value;
+};
+
+/**
+ * Depend on all deps collected by this watcher.
+ */
+Watcher.prototype.depend = function depend () {
+  if (Dep.target) {
+    var i = this.deps.length;
+    while (i--) {
+      this.deps[i].depend();
+    }
+  }
+};
+
+/**
+ * Remove self from all dependencies' subscriber list.
+ */
+Watcher.prototype.teardown = function teardown () {
+  if (this.active) {
+    // remove self from vm's watcher list
+    // this is a somewhat expensive operation so we skip it
+    // if the vm is being destroyed.
+    if (!this.vm._isBeingDestroyed) {
+      remove(this.vm._watchers, this);
+    }
+    var i = this.deps.length;
+    while (i--) {
+      this.deps[i].removeSub(this);
+    }
+    this.active = false;
+  }
+};
+
+var WepyComponent = /*@__PURE__*/(function (Base$$1) {
+  function WepyComponent () {
+    Base$$1.apply(this, arguments);
+  }
+
+  if ( Base$$1 ) WepyComponent.__proto__ = Base$$1;
+  WepyComponent.prototype = Object.create( Base$$1 && Base$$1.prototype );
+  WepyComponent.prototype.constructor = WepyComponent;
+
+  WepyComponent.prototype.$watch = function $watch (expOrFn, cb, options) {
+    var this$1 = this;
+
+    var vm = this;
+    if (isArr(cb)) {
+      cb.forEach(function (handler) {
+        this$1.$watch(expOrFn, handler, options);
+      });
+    }
+    if (isPlainObject(cb)) {
+      var handler = cb;
+      options = handler;
+      handler = handler.handler;
+      if (typeof handler === 'string') { handler = this[handler]; }
+      return this.$watch(expOrFn, handler, options);
+    }
+
+    options = options || {};
+    options.user = true;
+    var watcher = new Watcher(vm, expOrFn, cb, options);
+    if (options.immediate) {
+      cb.call(vm, watcher.value);
+    }
+    return function unwatchFn() {
+      watcher.teardown();
+    };
+  };
+
+  WepyComponent.prototype.$forceUpdate = function $forceUpdate () {
+    if (this._watcher) {
+      this._watcher.update();
+    }
+  };
+
+  WepyComponent.prototype.$emit = function $emit (event) {
+    var args = [], len = arguments.length - 1;
+    while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
+
+    var fns = this._events[event];
+
+    if (fns) {
+      Base$$1.prototype.$emit.apply(this, arguments);
+    } else {
+      this.$wx.triggerEvent(event, { arguments: args });
+    }
+
+    return this;
+  };
+
+  WepyComponent.prototype.$trigger = function $trigger (event, data, option) {
+    this.$wx.triggerEvent(event, { arguments: [data] }, option);
+  };
+
+  return WepyComponent;
+}(Base));
+
+WepyComponent.prototype.$nextTick = renderNextTick;
+
+var sharedPropertyDefinition = {
+  enumerable: true,
+  configurable: true,
+  get: noop,
+  set: noop
+};
+
+function proxy(target, sourceKey, key) {
+  sharedPropertyDefinition.get = function proxyGetter() {
+    return this[sourceKey][key];
+  };
+  sharedPropertyDefinition.set = function proxySetter(val) {
+    this[sourceKey][key] = val;
+  };
+  Object.defineProperty(target, key, sharedPropertyDefinition);
+}
+
+/*
+ * patch data option
+ */
+function patchData(output, data) {
+  if (!data) {
+    data = {};
+  }
+  output.data = data;
+}
+
+/*
+ * init data
+ */
+function initData(vm, data) {
+  if (!data) {
+    data = {};
+  }
+  var _data;
+  if (typeof data === 'function') {
+    _data = data.call(vm);
+  } else {
+    _data = clone(data);
+  }
+  vm._data = _data;
+  Object.keys(_data).forEach(function (key) {
+    proxy(vm, '_data', key);
+  });
+
+  observe({
+    vm: vm,
+    key: '',
+    value: _data,
+    parent: '',
+    root: true
+  });
+  //observe(vm, _data, null, true);
+}
+
+function initWatch(vm, watch) {
+  if (watch) {
+    Object.keys(watch).forEach(function (key) {
+      vm.$watch(key, watch[key]);
+    });
+  }
+}
+
+function createComputedGetter(key) {
+  return function computedGetter() {
+    var watcher = this._computedWatchers && this._computedWatchers[key];
+    if (watcher) {
+      watcher.key = key;
+      if (watcher.dirty) {
+        watcher.evaluate();
+      }
+      if (Dep.target) {
+        watcher.depend();
+      }
+      return watcher.value;
+    }
+  };
+}
+
+/*
+ * init computed
+ */
+function initComputed(vm, computed) {
+  if (!computed) {
+    return;
+  }
+  var watchers = (vm._computedWatchers = Object.create(null));
+  var computedWatcherOptions = { computed: true };
+
+  Object.keys(computed).forEach(function (key) {
+    var def = computed[key];
+    var getter = typeof def === 'object' ? def.get : def;
+
+    if (!getter || typeof getter !== 'function') {
+      // eslint-disable-next-line
+      console.error(("Getter is missing for computed property \"" + key + "\""));
+    }
+
+    // push to dirty after dep called.
+    watchers[key] = new Watcher(
+      vm,
+      getter || function() {},
+      function() {
+        // evaluate will set dirty
+        // vm.$dirty.push(key, key, newv);
+      },
+      computedWatcherOptions
+    );
+
+    if (typeof def === 'function') {
+      sharedPropertyDefinition.get = createComputedGetter(key);
+      sharedPropertyDefinition.set = function() {};
+    } else {
+      sharedPropertyDefinition.get = def.cache !== false ? createComputedGetter(key) : def.get;
+      sharedPropertyDefinition.set = def.set;
+    }
+
+    Object.defineProperty(vm, key, sharedPropertyDefinition);
+  });
+}
+
+var WepyConstructor = /*@__PURE__*/(function (WepyComponent$$1) {
+  function WepyConstructor(opt) {
+    if ( opt === void 0 ) opt = {};
+
+    WepyComponent$$1.call(this);
+    var vm = new WepyComponent$$1();
+
+    // Only need data and watchers for a empty WepyComponent
+    if (opt.data) {
+      initData(vm, opt.data);
+    }
+    initWatch(vm);
+
+    initComputed(vm, opt.computed);
+    return vm;
+  }
+
+  if ( WepyComponent$$1 ) WepyConstructor.__proto__ = WepyComponent$$1;
+  WepyConstructor.prototype = Object.create( WepyComponent$$1 && WepyComponent$$1.prototype );
+  WepyConstructor.prototype.constructor = WepyConstructor;
+
+  return WepyConstructor;
+}(WepyComponent));
+
+var $global = Object.create(null);
+
+function use(plugin) {
+  var args = [], len = arguments.length - 1;
+  while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
+
+  if (plugin.installed) {
+    return this;
+  }
+
+  var install = plugin.install || plugin;
+
+  if (isFunc(install)) {
+    install.apply(plugin, [this].concat(args));
+  }
+
+  plugin.installed = 1;
+}
+
+function mixin(options) {
+  if ( options === void 0 ) options = {};
+
+  $global.mixin = ($global.mixin || []).concat(options);
+}
+
+var WepyApp = /*@__PURE__*/(function (Base$$1) {
+  function WepyApp() {
+    Base$$1.call(this);
+  }
+
+  if ( Base$$1 ) WepyApp.__proto__ = Base$$1;
+  WepyApp.prototype = Object.create( Base$$1 && Base$$1.prototype );
+  WepyApp.prototype.constructor = WepyApp;
+
+  return WepyApp;
+}(Base));
+
+var WepyComponent$1 = /*@__PURE__*/(function (Base$$1) {
+  function WepyComponent () {
+    Base$$1.apply(this, arguments);
+  }
+
+  if ( Base$$1 ) WepyComponent.__proto__ = Base$$1;
+  WepyComponent.prototype = Object.create( Base$$1 && Base$$1.prototype );
+  WepyComponent.prototype.constructor = WepyComponent;
+
+  WepyComponent.prototype.$watch = function $watch (expOrFn, cb, options) {
+    var this$1 = this;
+
+    var vm = this;
+    if (isArr(cb)) {
+      cb.forEach(function (handler) {
+        this$1.$watch(expOrFn, handler, options);
+      });
+    }
+    if (isPlainObject(cb)) {
+      var handler = cb;
+      options = handler;
+      handler = handler.handler;
+      if (typeof handler === 'string') { handler = this[handler]; }
+      return this.$watch(expOrFn, handler, options);
+    }
+
+    options = options || {};
+    options.user = true;
+    var watcher = new Watcher(vm, expOrFn, cb, options);
+    if (options.immediate) {
+      cb.call(vm, watcher.value);
+    }
+    return function unwatchFn() {
+      watcher.teardown();
+    };
+  };
+
+  WepyComponent.prototype.$forceUpdate = function $forceUpdate () {
+    if (this._watcher) {
+      this._watcher.update();
+    }
+  };
+
+  return WepyComponent;
+}(Base));
+
+WepyComponent$1.prototype.$nextTick = renderNextTick;
+
+// eslint-disable-next-line
+var wx = my;
+var WepyPage = /*@__PURE__*/(function (WepyComponent) {
+  function WepyPage () {
+    WepyComponent.apply(this, arguments);
+  }
+
+  if ( WepyComponent ) WepyPage.__proto__ = WepyComponent;
+  WepyPage.prototype = Object.create( WepyComponent && WepyComponent.prototype );
+  WepyPage.prototype.constructor = WepyPage;
+
+  WepyPage.prototype.$launch = function $launch (url, params) {
+    this.$route('reLaunch', url, params);
+  };
+  WepyPage.prototype.$navigate = function $navigate (url, params) {
+    this.$route('navigate', url, params);
+  };
+
+  WepyPage.prototype.$redirect = function $redirect (url, params) {
+    this.$route('redirect', url, params);
+  };
+
+  WepyPage.prototype.$back = function $back (p) {
+    if ( p === void 0 ) p = {};
+
+    if (isNum(p)) { p = { delta: p }; }
+
+    if (!p.delta) { p.delta = 1; }
+
+    return wx.navigateBack(p);
+  };
+
+  WepyPage.prototype.$route = function $route (type, url, params) {
+    if ( params === void 0 ) params = {};
+
+    var wxparams;
+    if (isStr(url)) {
+      var paramsList = [];
+      if (isObj(params)) {
+        for (var k in params) {
+          if (!isUndef(params[k])) {
+            paramsList.push((k + "=" + (encodeURIComponent(params[k]))));
+          }
+        }
+      }
+      if (paramsList.length) { url = url + '?' + paramsList.join('&'); }
+
+      wxparams = { url: url };
+    } else {
+      wxparams = url;
+    }
+    var fn = wx[type] || wx[type + 'To'];
+    if (isFunc(fn)) {
+      return fn(wxparams);
+    }
+  };
+
+  return WepyPage;
+}(WepyComponent$1));
+
+function callUserHook(vm, hookName, arg) {
+  var pageHook = vm.hooks ? vm.hooks[hookName] : null;
+  var appHook = vm.$app && vm.$app.hooks ? vm.$app.hooks[hookName] : null;
+
+  if (!vm.$app) {
+    warn('$app is not initialized in this Component', vm);
+  }
+
+  var result = arg;
+
+  // First run page hook, and then run app hook
+  // Pass page hook result to app hook
+  // If return undefined, then return default argument
+  [pageHook, appHook].forEach(function (fn) {
+    if (isFunc(fn)) {
+      result = fn.call(vm, result);
+      if (isUndef(result)) {
+        result = arg;
+      }
+    }
+  });
+
+  return result;
+}
+
+function initHooks(vm, hooks) {
+  if ( hooks === void 0 ) hooks = {};
+
+  vm.hooks = hooks;
+}
+
+var observerFn = function() {
+  return function(newVal, oldVal, changedPaths) {
+    var vm = this.$wepy;
+
+    // changedPaths 长度大于 1，说明是由内部赋值改变的 prop
+    if (changedPaths.length > 1) {
+      return;
+    }
+    var _data = newVal;
+    if (typeof _data === 'function') {
+      _data = _data.call(vm);
+    }
+    vm[changedPaths[0]] = _data;
+  };
+};
+/*
+ * patch props option
+ */
+function patchProps(output, props) {
+  var newProps = {};
+  if (isStr(props)) {
+    newProps = [props];
+  }
+  if (isArr(props)) {
+    props.forEach(function (prop) {
+      newProps[prop] = {
+        type: null,
+        observer: observerFn(output, props, prop)
+      };
+    });
+  } else if (isObj(props)) {
+    for (var k in props) {
+      var prop = props[k];
+
+      // notsupport obj
+      if (!isObj(prop)) {
+        newProps[k] = prop;
+      } else {
+        newProps[k] = prop.default ? prop.default : '';
+      }
+    }
+  }
+
+  newProps['onInit'] = '';
+  output.properties = newProps;
+}
+
+/*
+ * init props
+ */
+function initProps(vm, properties) {
+  vm._props = {};
+
+  if (!properties) {
+    return;
+  }
+
+  Object.keys(properties).forEach(function (key) {
+    vm._props[key] = properties[key].value;
+    proxy(vm, '_props', key);
+  });
+
+  observe({
+    vm: vm,
+    key: '',
+    value: vm._props,
+    root: true
+  });
+}
+
+function initRender(vm, keys, computedKeys) {
+  vm._init = false;
+  var dirtyFromAttach = null;
+  return new Watcher(
+    vm,
+    function() {
+      if (!vm._init) {
+        keys.forEach(function (key) { return clone(vm[key]); });
+      }
+
+      if (vm.$dirty.length() || dirtyFromAttach) {
+        var keys$1 = vm.$dirty.get('key');
+        computedKeys.forEach(function (key) { return vm[key]; });
+        var dirty = vm.$dirty.pop();
+
+        // TODO: reset subs
+        Object.keys(keys$1).forEach(function (key) { return clone(vm[key]); });
+
+        if (vm._init) {
+          dirty = callUserHook(vm, 'before-setData', dirty);
+        }
+
+        // vm._fromSelf = true;
+        if (dirty || dirtyFromAttach) {
+          // init render is in lifecycle, setData in lifecycle will not work, so cacheData is needed.
+          if (!vm._init) {
+            if (dirtyFromAttach === null) {
+              dirtyFromAttach = {};
+            }
+            Object.assign(dirtyFromAttach, dirty);
+          } else if (dirtyFromAttach) {
+            // setData in attached
+            vm.$wx.setData(Object.assign(dirtyFromAttach, dirty || {}), renderFlushCallbacks);
+            dirtyFromAttach = null;
+          } else {
+            vm.$wx.setData(dirty, renderFlushCallbacks);
+          }
+        }
+      }
+      vm._init = true;
+    },
+    function() {},
+    null,
+    true
+  );
+}
+
+var Event = function Event(e) {
+  var detail = e.detail;
+  var target = e.target;
+  var currentTarget = e.currentTarget;
+  this.$wx = e;
+  this.type = e.type;
+  this.timeStamp = e.timeStamp;
+  if (detail) {
+    this.x = detail.x;
+    this.y = detail.y;
+  }
+
+  this.target = target;
+  this.currentTarget = currentTarget;
+  this.touches = e.touches;
+  this.changedTouches = e.changedTouches;
+};
+
+/**
+ * Transform wxml data-xx params to an array
+ */
+function transformParams(dataset, type, hasModel) {
+  if ( hasModel === void 0 ) hasModel = false;
+
+  var i = 0;
+  var params = [];
+  var modelParams = [];
+
+  var noParams = false;
+  var noModelParams = !hasModel;
+
+  var camelizedType = camelize(type);
+  while (i++ < 26 && (!noParams || !noModelParams)) {
+    var alpha = String.fromCharCode(64 + i);
+    if (!noParams) {
+      var key = 'wpy' + camelizedType + alpha;
+      if (!(key in dataset)) {
+        // it can be undefined;
+        noParams = true;
+      } else {
+        params.push(dataset[key]);
+      }
+    }
+    if (!noModelParams && hasModel) {
+      var modelKey = 'model' + alpha;
+      if (!(modelKey in dataset)) {
+        noModelParams = true;
+      } else {
+        modelParams.push(dataset[modelKey]);
+      }
+    }
+  }
+
+  return {
+    handler: params,
+    model: modelParams
+  };
+}
+
+var dispatcher = function(e) {
+  var vm = this.$wepy;
+  var type = e.type;
+  // touchstart do not have currentTarget
+  var dataset = (e.currentTarget || e.target).dataset || {};
+  var evtid = dataset.wpyEvt;
+  var modelId = dataset.modelId;
+  var rel = vm.$rel || {};
+  var handler = rel.handlers && rel.handlers[evtid] && rel.handlers[evtid][type];
+  var model = rel.models && rel.models[modelId];
+
+  if (!handler && !model) {
+    return;
+  }
+
+  var params = transformParams(dataset, type, !!model);
+
+  // Call model method
+  if (model && type === model.type && isFunc(model.handler)) {
+    model.handler.call(vm, e.detail.value, params.model);
+  }
+
+  // Call handler method
+  if (isFunc(handler)) {
+    var $event = new Event(e);
+    var paramsWithEvent = params.handler.concat($event);
+    var args = (e.detail && e.detail.arguments) || [];
+
+    var hookRes = callUserHook(vm, 'before-event', {
+      event: $event,
+      params: paramsWithEvent,
+      args: args
+    });
+
+    if (hookRes === false) {
+      // Event cancelled.
+      return;
+    }
+    return handler.apply(vm, paramsWithEvent);
+  } else if (!model) {
+    throw new Error('Unrecognized event');
+  }
+};
+
+/*
+ * initialize page methods, also the app
+ */
+function initMethods(vm, methods) {
+  if (methods) {
+    Object.keys(methods).forEach(function (method) {
+      vm[method] = methods[method];
+    });
+  }
+}
+
+/*
+ * patch method option
+ */
+function patchMethods(output, methods, isComponent) {
+  output.methods = {};
+  var target = isComponent ? output.methods : output;
+
+  target.__initComponent = function(e) {
+    var child = e;
+    var ref = e.$wx.props['data-ref'];
+    var wpyEvt = e.$wx.props['data-wpy-evt'];
+
+    var vm = this.$wepy;
+    vm.$children.push(child);
+    if (ref) {
+      if (vm.$refs[ref]) {
+        warn('duplicate ref "' + ref + '" will be covered by the last instance.\n', vm);
+      }
+      vm.$refs[ref] = child;
+    }
+    child.$evtId = wpyEvt;
+    child.$parent = vm;
+    child.$app = vm.$app;
+    child.$root = vm.$root;
+    // 支付宝组件嵌套时，子组件执行早已组件
+    if (e.$children && e.$children.length) {
+      e.$children.forEach(function (x) {
+        x.$app = vm.$app;
+        x.$root = vm.$root;
+      });
+    }
+    return vm;
+  };
+  target.__dispatcher = dispatcher;
+
+  // TODO: perf
+  // Only orginal component method goes to target. no need to add all methods.
+  if (methods) {
+    Object.keys(methods).forEach(function (method) {
+      target[method] = methods[method];
+    });
+  }
+}
+
+/*
+ * initialize events
+ */
+function initEvents(vm) {
+  var parent = vm.$parent;
+  var rel = parent.$rel;
+  vm._events = {};
+  var on = rel.info.on;
+  var evtId = vm.$evtId;
+  if (!evtId) { return; }
+
+  var evtNames = on[evtId];
+
+  evtNames.forEach(function (evtName) {
+    vm.$on(evtName, function() {
+      var fn = rel.handlers[evtId][evtName];
+      fn.apply(parent, arguments);
+    });
+  });
+}
+
+var Dirty = function Dirty(type) {
+  this.reset();
+
+  // path||key
+  this.type = type || 'path';
+};
+
+Dirty.prototype.push = function push (key, path, keyValue, pathValue) {
+  if (pathValue === undefined) {
+    return;
+  }
+  this._keys[key] = keyValue;
+  this._path[path] = pathValue;
+  this._length++;
+};
+
+Dirty.prototype.pop = function pop () {
+  var data = Object.create(null);
+  if (this.type === 'path') {
+    data = this._path;
+  } else if (this.type === 'key') {
+    data = this._keys;
+  }
+  this.reset();
+  return data;
+};
+
+Dirty.prototype.get = function get (type) {
+  return type === 'path' ? this._path : this._keys;
+};
+
+/**
+ * Set dirty from a ObserverPath
+ */
+Dirty.prototype.set = function set (op, key, value) {
+  var pathMap;
+  var pathKeys;
+  // eslint-disable-next-line eqeqeq
+  if (key != null) {
+    var ref = getPathMap(key, op.pathKeys, op.pathMap);
+      var combinePathKeys = ref.combinePathKeys;
+      var combinePathMap = ref.combinePathMap;
+    pathKeys = combinePathKeys;
+    pathMap = combinePathMap;
+  } else {
+    pathKeys = op.pathKeys;
+    pathMap = op.pathMap;
+  }
+  /**
+   * 出于性能考虑，使用 usingComponents 时， setData 内容不会被直接深复制，
+   * 即 this.setData({ field: obj }) 后 this.data.field === obj 。
+   * 因此不需要所有 path 都 setData 。
+   */
+  var ref$1 = pathMap[pathKeys[0]];
+    var root = ref$1.root;
+    var path = ref$1.path;
+  this.push(root, path, root === path ? value : op.ob.vm[root], value);
+};
+
+Dirty.prototype.reset = function reset () {
+  this._keys = {};
+  this._path = {};
+  this._length = 0;
+  return this;
+};
+
+Dirty.prototype.length = function length () {
+  return this._length;
+};
+
+var comid = 0;
+var app;
+
+var callUserMethod = function(vm, userOpt, method, args) {
+  var result;
+  var methods = userOpt[method];
+  if (isFunc(methods)) {
+    result = userOpt[method].apply(vm, args);
+  } else if (isArr(methods)) {
+    for (var i in methods) {
+      if (isFunc(methods[i])) {
+        result = methods[i].apply(vm, args);
+      }
+    }
+  }
+  return result;
+};
+
+var getLifecycycle = function (defaultLifecycle, rel, type) {
+  var lifecycle = defaultLifecycle.concat([]);
+  if (rel && rel.lifecycle && rel.lifecycle[type]) {
+    var userDefinedLifecycle = [];
+    if (isFunc(rel.lifecycle[type])) {
+      userDefinedLifecycle = rel.lifecycle[type].call(null, lifecycle);
+    }
+    userDefinedLifecycle.forEach(function (u) {
+      if (lifecycle.indexOf(u) > -1) {
+        warn(("'" + u + "' is already implemented in current version, please remove it from your lifecycel config"));
+      } else {
+        lifecycle.push(u);
+      }
+    });
+  }
+  return lifecycle;
+};
+
+/*
+ * patch app lifecyle
+ */
+function patchAppLifecycle(appConfig, options, rel) {
+  if ( rel === void 0 ) rel = {};
+
+  appConfig.onLaunch = function() {
+    var args = [], len = arguments.length;
+    while ( len-- ) args[ len ] = arguments[ len ];
+
+    var vm = new WepyApp();
+    app = vm;
+    vm.$options = options;
+    vm.$route = {};
+    vm.$rel = rel;
+
+    vm.$wx = this;
+    this.$wepy = vm;
+
+    initHooks(vm, options.hooks);
+
+    initMethods(vm, options.methods);
+
+    return callUserMethod(vm, vm.$options, 'onLaunch', args);
+  };
+
+  var lifecycle = getLifecycycle(WEAPP_APP_LIFECYCLE, rel, 'app');
+
+  lifecycle.forEach(function (k) {
+    // it's not defined aready && user defined it && it's an array or function
+    if (!appConfig[k] && options[k] && (isFunc(options[k]) || isArr(options[k]))) {
+      appConfig[k] = function() {
+        var args = [], len = arguments.length;
+        while ( len-- ) args[ len ] = arguments[ len ];
+
+        return callUserMethod(app, app.$options, k, args);
+      };
+    }
+  });
+}
+
+function patchLifecycle(output, options, rel, isComponent) {
+  var initClass = isComponent ? WepyComponent : WepyPage;
+  var initLifecycle = function() {
+    var args = [], len = arguments.length;
+    while ( len-- ) args[ len ] = arguments[ len ];
+
+    var vm = new initClass();
+
+    vm.$dirty = new Dirty('path');
+    vm.$children = [];
+    vm.$refs = {};
+
+    this.$wepy = vm;
+    vm.$wx = this;
+    vm.$is = this.is;
+    vm.$options = options;
+    vm.$rel = rel;
+    vm._watchers = [];
+    if (!isComponent) {
+      vm.$root = vm;
+      vm.$app = app;
+    }
+    if (this.is === 'custom-tab-bar/index') {
+      vm.$app = app;
+      vm.$parent = app;
+    }
+
+    vm.$id = ++comid + (isComponent ? '.1' : '.0');
+
+    callUserMethod(vm, vm.$options, 'beforeCreate', args);
+
+    initHooks(vm, options.hooks);
+
+    initProps(vm, output.properties);
+
+    initData(vm, output.data, isComponent);
+
+    initMethods(vm, options.methods);
+
+    initComputed(vm, options.computed, true);
+
+    initWatch(vm, options.watch);
+
+    // create render watcher
+    initRender(
+      vm,
+      Object.keys(vm._data)
+        .concat(Object.keys(vm._props))
+        .concat(Object.keys(vm._computedWatchers || {})),
+      Object.keys(vm._computedWatchers || {})
+    );
+
+    callUserMethod(vm, vm.$options, 'created', args);
+    return callUserMethod(vm, vm.$options, 'onLoad', args);
+  };
+
+  if (isComponent) {
+    output.onInit = initLifecycle; // 组件生命周期函数，组件创建时触发
+  } else {
+    output.onLoad = initLifecycle; // 页面加载时触发
+  }
+
+  if (isComponent) {
+    output.didMount = function() {
+      var args = [], len = arguments.length;
+      while ( len-- ) args[ len ] = arguments[ len ];
+
+      // Component attached  组件生命周期函数，组件创建完毕时触发
+      var outProps = output.properties || {};
+
+      // this.propperties are includes datas
+      var vm = this.$wepy;
+      var acceptProps = vm.$wx.props;
+
+      // let target = isComponent ? output.methods: output;
+      // target.__initComponent(vm);
+      vm.$wx.props.onInit(vm);
+      // let parent = this.triggerEvent('_init', vm);
+
+      // created 不能调用 setData，如果有 dirty 在此更新
+      vm.$forceUpdate();
+
+      initEvents(vm);
+
+      Object.keys(outProps).forEach(function (k) { return (vm[k] = acceptProps[k]); });
+
+      return callUserMethod(vm, vm.$options, 'didMount', args);
+    };
+  } else {
+    output.onShow = function() {
+      var args = [], len = arguments.length;
+      while ( len-- ) args[ len ] = arguments[ len ];
+
+      // Page attached
+      var vm = this.$wepy;
+      var app = vm.$app;
+      // eslint-disable-next-line
+      var pages = getCurrentPages();
+      var currentPage = pages[pages.length - 1];
+      var path = currentPage.__route__;
+      var webViewId = currentPage.__wxWebviewId__;
+
+      // created 不能调用 setData，如果有 dirty 在此更新
+      vm.$forceUpdate();
+
+      if (app.$route.path !== path) {
+        app.$route.path = path;
+        app.$route.webViewId = webViewId;
+        vm.routed && vm.routed();
+      }
+
+      // TODO: page attached
+      return callUserMethod(vm, vm.$options, 'onShow', args);
+    };
+    // Page lifecycle will be called under methods
+    // e.g:
+    // Component({
+    //   methods: {
+    //     onLoad () {
+    //       console.log('page onload')
+    //     }
+    //   }
+    // })
+
+    var lifecycle$1 = getLifecycycle(WEAPP_PAGE_LIFECYCLE, rel, 'page');
+
+    lifecycle$1.forEach(function (k) {
+      if (!output[k] && options[k] && (isFunc(options[k]) || isArr(options[k]))) {
+        output.methods[k] = function() {
+          var args = [], len = arguments.length;
+          while ( len-- ) args[ len ] = arguments[ len ];
+
+          return callUserMethod(this.$wepy, this.$wepy.$options, k, args);
+        };
+      }
+    });
+  }
+  var lifecycle = getLifecycycle(WEAPP_COMPONENT_LIFECYCLE, rel, 'component');
+
+  lifecycle.forEach(function (k) {
+    // beforeCreate is not a real lifecycle
+    if (!output[k] && k !== 'beforeCreate' && (isFunc(options[k]) || isArr(options[k]))) {
+      output[k] = function() {
+        var args = [], len = arguments.length;
+        while ( len-- ) args[ len ] = arguments[ len ];
+
+        return callUserMethod(this.$wepy, this.$wepy.$options, k, args);
+      };
+    }
+  });
+}
+
+var config$1 = {
+  optionMergeStrategies: {},
+  constants: {
+    WEAPP_LIFECYCLE: WEAPP_LIFECYCLE,
+    WEAPP_APP_LIFECYCLE: WEAPP_APP_LIFECYCLE,
+    WEAPP_PAGE_LIFECYCLE: WEAPP_PAGE_LIFECYCLE,
+    WEAPP_COMPONENT_LIFECYCLE: WEAPP_COMPONENT_LIFECYCLE
+  }
+};
+
+// [Default Strategy]
+// Update if it's not exist in output. Can be replaced by option[key].
+// e.g.
+// export default {
+//   myCustomMethod () {
+//     // doSomething
+//   }
+// }
+//
+// [Merge Strategy]
+// Replaced by the latest mixins property.
+// e.g.
+// export default {
+//   data: {
+//     a: 1
+//   }
+// }
+//
+// [Lifecycle Strategy]
+// Extend lifecycle. update lifecycle to an array.
+// e.g.
+// export default {
+//   onShow: {
+//     console.log('onShow');
+//   }
+// }
+var globalMixinPatched = false;
+
+var strats = null;
+
+function getStrategy(key) {
+  if (!strats) {
+    initStrats();
+  }
+  if (strats[key]) {
+    return strats[key];
+  } else {
+    return defaultStrat;
+  }
+}
+function defaultStrat(output, option, key, data) {
+  if (!output[key]) {
+    output[key] = data;
+  }
+}
+
+function simpleMerge(parentVal, childVal) {
+  return !parentVal || !childVal ? parentVal || childVal : Object.assign({}, parentVal, childVal);
+}
+
+function initStrats() {
+  if (strats) { return strats; }
+
+  strats = config$1.optionMergeStrategies;
+
+  strats.data = strats.props = strats.methods = strats.computed = strats.watch = strats.hooks = function mergeStrategy(
+    output,
+    option,
+    key,
+    data
+  ) {
+    option[key] = simpleMerge(option[key], data);
+  };
+
+  WEAPP_LIFECYCLE.forEach(function (lifecycle) {
+    if (!strats[lifecycle]) {
+      strats[lifecycle] = function lifeCycleStrategy(output, option, key, data) {
+        if (!option[key]) {
+          option[key] = isArr(data) ? data : [data];
+        } else {
+          option[key] = [data].concat(option[key]);
+        }
+      };
+    }
+  });
+}
+
+function patchMixins(output, option, mixins) {
+  if (!mixins && !$global.mixin) {
+    return;
+  }
+
+  if (!globalMixinPatched) {
+    var globalMixin = $global.mixin || [];
+
+    mixins = globalMixin.concat(mixins);
+    globalMixinPatched = true;
+  }
+
+  if (isArr(mixins)) {
+    mixins.forEach(function (mixin) { return patchMixins(output, option, mixin); });
+    globalMixinPatched = false;
+  } else {
+    if (!strats) {
+      initStrats();
+    }
+    for (var k in mixins) {
+      strat = getStrategy(k);
+      var strat = strats[k] || defaultStrat;
+      strat(output, option, k, mixins[k]);
+    }
+  }
+}
+
+function patchRelations(output, relations) {
+  if (!relations) {
+    relations = {};
+  }
+  output.relations = relations;
+}
+
+function app$1(option, rel) {
+  var appConfig = {};
+
+  patchMixins(appConfig, option, option.mixins);
+  patchAppLifecycle(appConfig, option, rel);
+
+  return App(appConfig);
+}
+
+function component(opt, rel) {
+  if ( opt === void 0 ) opt = {};
+
+  var compConfig = {
+    externalClasses: opt.externalClasses || [],
+    // support component options property
+    // example: options: {addGlobalClass:true}
+    options: opt.options || {}
+  };
+
+  patchMixins(compConfig, opt, opt.mixins);
+
+  if (opt.properties) {
+    compConfig.props = opt.properties;
+    if (opt.props) {
+      // eslint-disable-next-line no-console
+      console.warn("props will be ignore, if properties is set");
+    }
+  } else if (opt.props) {
+    patchProps(compConfig, opt.props);
+  }
+
+  compConfig.props = compConfig.properties;
+
+  patchMethods(compConfig, opt.methods, true);
+
+  patchData(compConfig, opt.data, true);
+
+  patchRelations(compConfig, opt.relations);
+
+  patchLifecycle(compConfig, opt, rel, true);
+
+  return Component(compConfig);
+}
+
+function page(opt, rel) {
+  if ( opt === void 0 ) opt = {};
+
+  var pageConfig = {
+    externalClasses: opt.externalClasses || [],
+    // support component options property
+    // example: options: {addGlobalClass:true}
+    options: opt.options || {}
+  };
+
+  patchMixins(pageConfig, opt, opt.mixins);
+
+  if (opt.properties) {
+    pageConfig.properties = opt.properties;
+    if (opt.props) {
+      // eslint-disable-next-line
+      console.warn("props will be ignore, if properties is set");
+    }
+  } else if (opt.props) {
+    patchProps(pageConfig, opt.props);
+  }
+
+  patchMethods(pageConfig, opt.methods);
+
+  patchData(pageConfig, opt.data);
+
+  patchLifecycle(pageConfig, opt, rel);
+
+  return Page(pageConfig);
+}
+
+function initGlobalAPI(wepy) {
+  wepy.use = use;
+  wepy.mixin = mixin;
+
+  wepy.set = function(target, key, val) {
+    set.apply(wepy, [undefined, target, key, val]);
+  };
+
+  wepy.delete = del;
+
+  wepy.observe = observe;
+
+  wepy.nextTick = renderNextTick;
+
+  wepy.app = app$1;
+  wepy.page = page;
+  wepy.component = component;
+
+  return wepy;
+}
+
+var wepy = initGlobalAPI(WepyConstructor);
+
+wepy.config = config$1;
+wepy.global = $global;
+wepy.version = "2.0.0-alpha.16";
+
+module.exports = wepy;
diff --git a/packages/core/dist/wepy.js b/packages/core/dist/wepy.js
new file mode 100644
index 000000000..a4b55bf74
--- /dev/null
+++ b/packages/core/dist/wepy.js
@@ -0,0 +1,2775 @@
+'use strict';
+
+// can we use __proto__?
+function getHasProto() {
+  var hasProto = false;
+  if ('__proto__' in {}) {
+    var fn = function () {};
+    var arr = [];
+    arr.__proto__ = { push: fn };
+    hasProto = fn === arr.push;
+  }
+  return hasProto;
+}
+var hasProto = getHasProto();
+
+var _Set; // $flow-disable-line
+/* istanbul ignore if */ if (typeof Set !== 'undefined' && isNative(Set)) {
+  // use native Set when available.
+  _Set = Set;
+} else {
+  // a non-standard Set polyfill that only works with primitive keys.
+  _Set = /*@__PURE__*/(function () {
+    function Set() {
+      this.set = Object.create(null);
+    }
+    Set.prototype.has = function has (key) {
+      return this.set[key] === true;
+    };
+    Set.prototype.add = function add (key) {
+      this.set[key] = true;
+    };
+    Set.prototype.clear = function clear () {
+      this.set = Object.create(null);
+    };
+
+    return Set;
+  }());
+}
+
+/* istanbul ignore next */
+function isNative(Ctor) {
+  return typeof Ctor === 'function' && /native code/.test(Ctor.toString());
+}
+
+/**
+ * String type check
+ */
+var isStr = function (v) { return typeof v === 'string'; };
+/**
+ * Number type check
+ */
+var isNum = function (v) { return typeof v === 'number'; };
+/**
+ * Array type check
+ */
+var isArr = Array.isArray;
+/**
+ * undefined type check
+ */
+var isUndef = function (v) { return v === undefined; };
+/**
+ * Function type check
+ */
+var isFunc = function (v) { return typeof v === 'function'; };
+/**
+ * Quick object check - this is primarily used to tell
+ * Objects from primitive values when we know the value
+ * is a JSON-compliant type.
+ */
+function isObject(obj) {
+  return obj !== null && typeof obj === 'object';
+}
+
+var isObj = isObject;
+/**
+ * Strict object type check. Only returns true
+ * for plain JavaScript objects.
+ */
+var _toString = Object.prototype.toString;
+function isPlainObject(obj) {
+  return _toString.call(obj) === '[object Object]';
+}
+
+/**
+ * Check whether the object has the property.
+ */
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+function hasOwn(obj, key) {
+  return hasOwnProperty.call(obj, key);
+}
+
+/**
+ * Perform no operation.
+ * Stubbing args to make Flow happy without leaving useless transpiled code
+ * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/)
+ */
+// eslint-disable-next-line
+function noop(a, b, c) {}
+
+/**
+ * Check if val is a valid array index.
+ */
+function isValidArrayIndex(val) {
+  var n = parseFloat(String(val));
+  return n >= 0 && Math.floor(n) === n && isFinite(val);
+}
+
+/**
+ * Convert an Array-lik object to a real Array
+ */
+function toArray(list, start) {
+  if ( start === void 0 ) start = 0;
+
+  var i = list.length - start;
+  var rst = new Array(i);
+  while (i--) {
+    rst[i] = list[i + start];
+  }
+  return rst;
+}
+
+/**
+ * Cached simply key function return
+ */
+var cached = function (fn) {
+  var cache = {};
+  return function (str) { return cache[str] || (cache[str] = fn(str)); };
+};
+
+var camelizeRE = /-(\w)/g;
+
+/**
+ * camelize words
+ * e.g. my-key => myKey
+ */
+var camelize = cached(function (str) { return str.replace(camelizeRE, function (_, c) { return (c ? c.toUpperCase() : ''); }); });
+
+/*
+ * extend objects
+ * e.g.
+ * extend({}, {a: 1}) : extend {a: 1} to {}
+ * extend(true, [], [1,2,3]) : deep extend [1,2,3] to an empty array
+ * extend(true, {}, {a: 1}, {b: 2}) : deep extend two objects to {}
+ */
+function extend() {
+  var arguments$1 = arguments;
+
+  var options,
+    name,
+    src,
+    copy,
+    copyIsArray,
+    clone,
+    target = arguments[0] || {},
+    i = 1,
+    length = arguments.length,
+    deep = false;
+
+  // Handle a deep copy situation
+  if (typeof target === 'boolean') {
+    deep = target;
+
+    // Skip the boolean and the target
+    target = arguments[i] || {};
+    i++;
+  }
+
+  // Handle case when target is a string or something (possible in deep copy)
+  if (typeof target !== 'object' && !(typeof target === 'function')) {
+    target = {};
+  }
+
+  // Extend jQuery itself if only one argument is passed
+  if (i === length) {
+    target = this;
+    i--;
+  }
+
+  for (; i < length; i++) {
+    // Only deal with non-null/undefined values
+    if ((options = arguments$1[i])) {
+      // Extend the base object
+      for (name in options) {
+        src = target[name];
+        copy = options[name];
+
+        // Prevent never-ending loop
+        if (target === copy) {
+          continue;
+        }
+
+        // Recurse if we're merging plain objects or arrays
+        if (deep && copy && (isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) {
+          if (copyIsArray) {
+            copyIsArray = false;
+            clone = src && Array.isArray(src) ? src : [];
+          } else {
+            clone = src && isPlainObject(src) ? src : {};
+          }
+
+          // Never move original objects, clone them
+          target[name] = extend(deep, clone, copy);
+
+          // Don't bring in undefined values => bring undefined values
+        } else {
+          target[name] = copy;
+        }
+      }
+    }
+  }
+
+  // Return the modified object
+  return target;
+}
+
+/*
+ * clone objects, return a cloned object default to use deep clone
+ * e.g.
+ * clone({a: 1})
+ * clone({a: b: {c : 1}}, false);
+ */
+function clone(sth, deep) {
+  if ( deep === void 0 ) deep = true;
+
+  if (isArr(sth)) {
+    return extend(deep, [], sth);
+  } else if ('' + sth === 'null') {
+    return sth;
+  } else if (isPlainObject(sth)) {
+    return extend(deep, {}, sth);
+  } else {
+    return sth;
+  }
+}
+
+var WEAPP_APP_LIFECYCLE = ['onLaunch', 'onShow', 'onHide', 'onError', 'onPageNotFound'];
+
+var WEAPP_PAGE_LIFECYCLE = [
+  'onLoad',
+  'onShow',
+  'onReady',
+  'onHide',
+  'onUnload',
+  'onPullDownRefresh',
+  'onReachBottom',
+  'onShareAppMessage',
+  'onPageScroll',
+  'onTabItemTap',
+  'onResize'
+];
+
+var WEAPP_COMPONENT_LIFECYCLE = ['beforeCreate', 'created', 'attached', 'ready', 'moved', 'detached'];
+
+var WEAPP_LIFECYCLE = []
+  .concat(WEAPP_APP_LIFECYCLE)
+  .concat(WEAPP_PAGE_LIFECYCLE)
+  .concat(WEAPP_COMPONENT_LIFECYCLE);
+
+var config = {};
+
+var warn = noop;
+
+var generateComponentTrace = function(vm) {
+  return ("Found in component: \"" + (vm.$is) + "\"");
+};
+
+{
+  var hasConsole = typeof console !== 'undefined';
+  // TODO
+  warn = function (msg, vm) {
+    if (hasConsole && !config.silent) {
+      // eslint-disable-next-line
+      console.error("[WePY warn]: " + msg + (vm ? generateComponentTrace(vm) : ''));
+    }
+  };
+}
+
+function handleError(err, vm, info) {
+  if (vm) {
+    var cur = vm;
+    while ((cur = cur.$parent)) {
+      var hooks = cur.$options.errorCaptured;
+      if (hooks) {
+        for (var i = 0; i < hooks.length; i++) {
+          try {
+            var capture = hooks[i].call(cur, err, vm, info) === false;
+            if (capture) { return; }
+          } catch (e) {
+            globalHandleError(e, cur, 'errorCaptured hook');
+          }
+        }
+      }
+    }
+  }
+  globalHandleError(err, vm, info);
+}
+
+function globalHandleError(err, vm, info) {
+  if (config.errorHandler) {
+    try {
+      return config.errorHandler.call(null, err, vm, info);
+    } catch (e) {
+      logError(e, null, 'config.errorHandler');
+    }
+  }
+  logError(err, vm, info);
+}
+
+function logError(err, vm, info) {
+  {
+    warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
+  }
+  /* istanbul ignore else */
+  if (typeof console !== 'undefined') {
+    // eslint-disable-next-line
+    console.error(err);
+  } else {
+    throw err;
+  }
+}
+
+var callbacks = [];
+var pending = false;
+
+function flushCallbacks() {
+  pending = false;
+  var copies = callbacks.slice(0);
+  callbacks.length = 0;
+  for (var i = 0; i < copies.length; i++) {
+    copies[i]();
+  }
+}
+
+// Here we have async deferring wrappers using both micro and macro tasks.
+// In < 2.4 we used micro tasks everywhere, but there are some scenarios where
+// micro tasks have too high a priority and fires in between supposedly
+// sequential events (e.g. #4521, #6690) or even between bubbling of the same
+// event (#6566). However, using macro tasks everywhere also has subtle problems
+// when state is changed right before repaint (e.g. #6813, out-in transitions).
+// Here we use micro task by default, but expose a way to force macro task when
+// needed (e.g. in event handlers attached by v-on).
+var microTimerFunc;
+var macroTimerFunc;
+var useMacroTask = false;
+
+// Determine (macro) Task defer implementation.
+// Technically setImmediate should be the ideal choice, but it's only available
+// in IE. The only polyfill that consistently queues the callback after all DOM
+// events triggered in the same loop is by using MessageChannel.
+/* istanbul ignore if */
+if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
+  macroTimerFunc = function () {
+    setImmediate(flushCallbacks);
+  };
+} else if (
+  /* eslint-disable no-undef */
+  typeof MessageChannel !== 'undefined' &&
+  (isNative(MessageChannel) ||
+    // PhantomJS
+    MessageChannel.toString() === '[object MessageChannelConstructor]')
+) {
+  var channel = new MessageChannel();
+  var port = channel.port2;
+  channel.port1.onmessage = flushCallbacks;
+  macroTimerFunc = function () {
+    port.postMessage(1);
+  };
+  /* eslint-enable no-undef */
+} else {
+  /* istanbul ignore next */
+  macroTimerFunc = function () {
+    setTimeout(flushCallbacks, 0);
+  };
+}
+
+// Determine MicroTask defer implementation.
+/* istanbul ignore next, $flow-disable-line */
+if (typeof Promise !== 'undefined' && isNative(Promise)) {
+  var p = Promise.resolve();
+  microTimerFunc = function () {
+    p.then(flushCallbacks);
+    // in problematic UIWebViews, Promise.then doesn't completely break, but
+    // it can get stuck in a weird state where callbacks are pushed into the
+    // microtask queue but the queue isn't being flushed, until the browser
+    // needs to do some other work, e.g. handle a timer. Therefore we can
+    // "force" the microtask queue to be flushed by adding an empty timer.
+    // if (isIOS) setTimeout(noop)
+  };
+} else {
+  // fallback to macro
+  microTimerFunc = macroTimerFunc;
+}
+
+function nextTick(cb, ctx) {
+  var _resolve;
+  callbacks.push(function () {
+    if (cb) {
+      try {
+        cb.call(ctx);
+      } catch (e) {
+        handleError(e, ctx, 'nextTick');
+      }
+    } else if (_resolve) {
+      _resolve(ctx);
+    }
+  });
+  if (!pending) {
+    pending = true;
+    if (useMacroTask) {
+      macroTimerFunc();
+    } else {
+      microTimerFunc();
+    }
+  }
+  // $flow-disable-line
+  if (!cb && typeof Promise !== 'undefined') {
+    return new Promise(function (resolve) {
+      _resolve = resolve;
+    });
+  }
+}
+
+var renderCallbacks = [];
+
+function renderFlushCallbacks() {
+  var copies = renderCallbacks.slice(0);
+  renderCallbacks.length = 0;
+  for (var i = 0; i < copies.length; i++) {
+    copies[i]();
+  }
+}
+
+function renderNextTick(cb, ctx) {
+  var _resolve;
+  renderCallbacks.push(function () {
+    if (cb) {
+      try {
+        cb.call(ctx);
+      } catch (e) {
+        handleError(e, ctx, 'nextTick');
+      }
+    } else if (_resolve) {
+      _resolve(ctx);
+    }
+  });
+
+  if (!cb && typeof Promise !== 'undefined') {
+    return new Promise(function (resolve) {
+      _resolve = resolve;
+    });
+  }
+}
+
+/**
+ * Parse a v-model expression into a base path and a final key segment.
+ * Handles both dot-path and possible square brackets.
+ *
+ * Possible cases:
+ *
+ * - test
+ * - test[key]
+ * - test[test1[key]]
+ * - test["a"][key]
+ * - xxx.test[a[a].test1[key]]
+ * - test.xxx.a["asa"][test1[key]]
+ *
+ */
+
+/**
+ * Remove an item from an array
+ */
+function remove(arr, item) {
+  if (arr.length) {
+    var index = arr.indexOf(item);
+    if (index > -1) {
+      return arr.splice(index, 1);
+    }
+  }
+}
+
+/**
+ * Define a property.
+ */
+function def(obj, key, val, enumerable) {
+  Object.defineProperty(obj, key, {
+    value: val,
+    enumerable: !!enumerable,
+    writable: true,
+    configurable: true
+  });
+}
+
+/**
+ * Parse simple path.
+ */
+var bailRE = /[^\w.$]/;
+function parsePath(path) {
+  if (bailRE.test(path)) {
+    return;
+  }
+  var segments = path.split('.');
+  return function(obj) {
+    for (var i = 0; i < segments.length; i++) {
+      if (!obj) { return; }
+      obj = obj[segments[i]];
+    }
+    return obj;
+  };
+}
+
+// import type Watcher from './watcher'
+
+var uid = 0;
+
+/**
+ * A dep is an observable that can have multiple
+ * directives subscribing to it.
+ */
+var Dep = function Dep() {
+  this.id = uid++;
+  this.subs = [];
+};
+
+Dep.prototype.addSub = function addSub (sub) {
+  this.subs.push(sub);
+};
+
+Dep.prototype.removeSub = function removeSub (sub) {
+  remove(this.subs, sub);
+};
+
+Dep.prototype.depend = function depend () {
+  if (Dep.target) {
+    Dep.target.addDep(this);
+  }
+};
+
+Dep.prototype.notify = function notify () {
+  // stabilize the subscriber list first
+  var subs = this.subs.slice();
+  for (var i = 0, l = subs.length; i < l; i++) {
+    subs[i].update();
+  }
+};
+
+// the current target watcher being evaluated.
+// this is globally unique because there could be only one
+// watcher being evaluated at any time.
+Dep.target = null;
+var targetStack = [];
+
+function pushTarget(_target) {
+  if (Dep.target) { targetStack.push(Dep.target); }
+  Dep.target = _target;
+}
+
+function popTarget() {
+  Dep.target = targetStack.pop();
+}
+
+/**
+ * @desc ObserverPath 类以及相关处理函数
+ * Observer 所在位置对应在整棵 data tree 的路径集合
+ * @createDate 2019-07-21
+ */
+
+/**
+ * 生成完整路径
+ * @param key  {String|Number} 当为字符串时，说明是属性名，当为数字时，说明是索引
+ * @param parentPath {String} 父路径
+ * @return {string}
+ */
+var setPath = function (key, parentPath) {
+  return isNum(key) ? (parentPath + "[" + key + "]") : (parentPath + "." + key);
+};
+
+/**
+ * 得到 ObserverPath
+ * @param value 被观察对象
+ * @return {ObserverPath|null}
+ */
+var pickOp = function (value) {
+  return isObject(value) && hasOwn(value, '__ob__') ? value.__ob__.op : null;
+};
+
+var ObserverPath = function ObserverPath(key, ob, parentOp) {
+  this.ob = ob;
+  // eslint-disable-next-line eqeqeq
+  if (parentOp) {
+    var ref = getPathMap(key, parentOp.pathKeys, parentOp.pathMap);
+    var combinePathKeys = ref.combinePathKeys;
+    var combinePathMap = ref.combinePathMap;
+    this.pathKeys = combinePathKeys;
+    this.pathMap = combinePathMap;
+  } else {
+    this.pathKeys = null;
+    this.pathMap = null;
+  }
+};
+
+ObserverPath.prototype.traverseOp = function traverseOp (key, pathKeys, pathMap, handler) {
+  // 得到 newKey 和 pathMap 组合的路径集合
+  var ref = getPathMap(key, pathKeys, pathMap);
+    var combinePathMap = ref.combinePathMap;
+    var combinePathKeys = ref.combinePathKeys;
+  var handlePathKeys = [];
+  var handlePathMap = {};
+  var hasChange = false;
+
+  // 遍历 combinePathMap
+  for (var i = 0; i < combinePathKeys.length; i++) {
+    var pathObj = handler(combinePathMap[combinePathKeys[i]], this);
+    if (pathObj) {
+      hasChange = true;
+      handlePathKeys.push(pathObj.path);
+      handlePathMap[pathObj.path] = pathObj;
+    }
+  }
+
+  if (hasChange) {
+    var value = this.ob.value;
+    if (Array.isArray(value)) {
+      for (var i$1 = 0; i$1 < value.length; i$1++) {
+        var op = pickOp(value[i$1]);
+        op && op.traverseOp(i$1, handlePathKeys, handlePathMap, handler);
+      }
+    } else {
+      var keys = Object.keys(value);
+      for (var i$2 = 0; i$2 < keys.length; i$2++) {
+        var key$1 = keys[i$2];
+        var op$1 = pickOp(value[key$1]);
+        op$1 && op$1.traverseOp(key$1, handlePathKeys, handlePathMap, handler);
+      }
+    }
+  }
+};
+
+ObserverPath.prototype.addPath = function addPath (pathObj) {
+  this.pathKeys.push(pathObj.path);
+  this.pathMap[pathObj.path] = pathObj;
+};
+
+ObserverPath.prototype.delPath = function delPath (path) {
+  remove(this.pathKeys, path);
+  delete this.pathMap[path];
+};
+
+/**
+ * 添加新的 __ob__ 的 path
+ */
+function addPaths(newKey, op, parentOp) {
+  op.traverseOp(newKey, parentOp.pathKeys, parentOp.pathMap, handler);
+
+  function handler(pathObj, op) {
+    if (!(pathObj.path in op.pathMap)) {
+      // 新增一条 path
+      op.addPath(pathObj);
+      return pathObj;
+    } else {
+      return null;
+    }
+  }
+}
+
+/**
+ * 删除指定的 __ob__ 的 path
+ */
+function cleanPaths(oldKey, op, parentOp) {
+  op.traverseOp(oldKey, parentOp.pathKeys, parentOp.pathMap, handler);
+
+  function handler(pathObj, op) {
+    // 删除一条 path
+    op.delPath(pathObj.path);
+    return pathObj;
+  }
+}
+
+/**
+ * 得到 pathMap 与 key 组合后的路径集合
+ */
+function getPathMap(key, pathKeys, pathMap) {
+  var obj;
+
+  if (pathMap) {
+    // console.log('pathMap', pathMap)
+    var combinePathKeys = [];
+    var combinePathMap = {};
+    for (var i = 0; i < pathKeys.length; i++) {
+      var path = setPath(key, pathMap[pathKeys[i]].path);
+      combinePathKeys.push(path);
+      combinePathMap[path] = { key: key, root: pathMap[pathKeys[i]].root, path: path };
+    }
+    return { combinePathKeys: combinePathKeys, combinePathMap: combinePathMap };
+  } else {
+    return {
+      combinePathKeys: [key],
+      combinePathMap: ( obj = {}, obj[key] = { key: key, root: key, path: key }, obj)
+    };
+  }
+}
+
+/*
+ * not type checking this file because flow doesn't play well with
+ * dynamically accessing methods on Array prototype
+ */
+
+var arrayProto = Array.prototype;
+var arrayMethods = Object.create(arrayProto);
+
+var methodsToPatch = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'];
+
+/**
+ * Intercept mutating methods and emit events
+ */
+methodsToPatch.forEach(function(method) {
+  // cache original method
+  var original = arrayProto[method];
+  def(arrayMethods, method, function mutator() {
+    var args = [], len$1 = arguments.length;
+    while ( len$1-- ) args[ len$1 ] = arguments[ len$1 ];
+
+    var len = this.length;
+    // 清除已经失效的 paths
+    if (len > 0) {
+      switch (method) {
+        case 'pop':
+          delInvalidPaths(len - 1, this[len - 1], this);
+          break;
+        case 'shift':
+          delInvalidPaths(0, this[0], this);
+          break;
+        case 'splice':
+        case 'sort':
+        case 'reverse':
+          for (var i = 0; i < this.length; i++) {
+            delInvalidPaths(i, this[i], this);
+          }
+      }
+    }
+
+    var result = original.apply(this, args);
+    var ob = this.__ob__;
+    var vm = ob.vm;
+
+    // push parent key to dirty, wait to setData
+    if (vm.$dirty) {
+      if (method === 'push') {
+        var lastIndex = ob.value.length - 1;
+        vm.$dirty.set(ob.op, lastIndex, ob.value[lastIndex]);
+      } else {
+        vm.$dirty.set(ob.op, null, ob.value);
+      }
+    }
+
+    // 这里和 vue 不一样，所有变异方法都需要更新 path
+    ob.observeArray(ob.key, ob.value);
+
+    // notify change
+    ob.dep.notify();
+    return result;
+  });
+});
+
+function delInvalidPaths(key, value, parent) {
+  if (isObject(value) && hasOwn(value, '__ob__')) {
+    // delete invalid paths
+    cleanPaths(key, value.__ob__.op, parent.__ob__.op);
+  }
+}
+
+var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
+
+/**
+ * By default, when a reactive property is set, the new value is
+ * also converted to become reactive. However when passing down props,
+ * we don't want to force conversion because the value may be a nested value
+ * under a frozen data structure. Converting it would defeat the optimization.
+ */
+var observerState = {
+  shouldConvert: true
+};
+
+/**
+ * Observer class that are attached to each observed
+ * object. Once attached, the observer converts target
+ * object's property keys into getter/setters that
+ * collect dependencies and dispatches updates.
+ */
+var Observer = function Observer(ref) {
+  var vm = ref.vm;
+  var key = ref.key;
+  var value = ref.value;
+  var parent = ref.parent;
+
+  this.value = value;
+  this.dep = new Dep();
+  this.vmCount = 0;
+  this.vm = vm;
+  this.op = new ObserverPath(key, this, parent && parent.__ob__ && parent.__ob__.op);
+
+  def(value, '__ob__', this);
+  if (Array.isArray(value)) {
+    var augment = hasProto ? protoAugment : copyAugment;
+    augment(value, arrayMethods, arrayKeys);
+    this.observeArray(key, value);
+  } else {
+    this.walk(key, value);
+  }
+};
+
+/**
+ * Walk through each property and convert them into
+ * getter/setters. This method should only be called when
+ * value type is Object.
+ */
+Observer.prototype.walk = function walk (key, obj) {
+  var keys = Object.keys(obj);
+  for (var i = 0; i < keys.length; i++) {
+    defineReactive({ vm: this.vm, obj: obj, key: keys[i], value: obj[keys[i]], parent: obj });
+    //defineReactive(this.vm, obj, keys[i], obj[keys[i]]);
+  }
+};
+
+/**
+ * Observe a list of Array items.
+ */
+Observer.prototype.observeArray = function observeArray (key, items) {
+  for (var i = 0, l = items.length; i < l; i++) {
+    observe({ vm: this.vm, key: i, value: items[i], parent: items });
+  }
+};
+
+/**
+ * Check if path exsit in vm
+ */
+Observer.prototype.hasPath = function hasPath (path) {
+  var value = this.vm;
+  var key = '';
+  var i = 0;
+  while (i < path.length) {
+    if (path[i] !== '.' && path[i] !== '[' && path[i] !== ']') {
+      key += path[i];
+    } else if (key.length !== 0) {
+      value = value[key];
+      key = '';
+      if (!isObject(value)) {
+        return false;
+      }
+    }
+    i++;
+  }
+  return true;
+};
+
+/**
+ * Is this path value equal
+ */
+Observer.prototype.isPathEq = function isPathEq (path, value) {
+  var objValue = this.vm;
+  var key = '';
+  var i = 0;
+  while (i < path.length) {
+    if (path[i] !== '.' && path[i] !== '[' && path[i] !== ']') {
+      key += path[i];
+    } else if (key.length !== 0) {
+      objValue = objValue[key];
+      key = '';
+      if (!isObject(objValue)) {
+        return false;
+      }
+    }
+    i++;
+  }
+  if (key.length !== 0) {
+    objValue = objValue[key];
+  }
+  return value === objValue;
+};
+
+// helpers
+
+/**
+ * Augment an target Object or Array by intercepting
+ * the prototype chain using __proto__
+ */
+function protoAugment(target, src) {
+  /* eslint-disable no-proto */
+  target.__proto__ = src;
+  /* eslint-enable no-proto */
+}
+
+/**
+ * Augment an target Object or Array by defining
+ * hidden properties.
+ */
+/* istanbul ignore next */
+function copyAugment(target, src, keys) {
+  for (var i = 0, l = keys.length; i < l; i++) {
+    var key = keys[i];
+    def(target, key, src[key]);
+  }
+}
+
+/**
+ * Attempt to create an observer instance for a value,
+ * returns the new observer if successfully observed,
+ * or the existing observer if the value already has one.
+ */
+function observe(ref) {
+  var vm = ref.vm;
+  var key = ref.key;
+  var value = ref.value;
+  var parent = ref.parent;
+  var root = ref.root;
+
+  if (!isObject(value)) {
+    return;
+  }
+  var ob;
+  if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
+    ob = value.__ob__;
+    var op = ob.op;
+    addPaths(key, op, parent.__ob__.op);
+  } else if (
+    observerState.shouldConvert &&
+    (Array.isArray(value) || isPlainObject(value)) &&
+    Object.isExtensible(value) &&
+    !value._isVue
+  ) {
+    ob = new Observer({ vm: vm, key: key, value: value, parent: parent });
+  }
+  if (root && ob) {
+    ob.vmCount++;
+  }
+  return ob;
+}
+
+/**
+ * Define a reactive property on an Object.
+ */
+function defineReactive(ref) {
+  var vm = ref.vm;
+  var obj = ref.obj;
+  var key = ref.key;
+  var value = ref.value;
+  var parent = ref.parent;
+  var customSetter = ref.customSetter;
+  var shallow = ref.shallow;
+
+  var dep = new Dep();
+
+  var property = Object.getOwnPropertyDescriptor(obj, key);
+  if (property && property.configurable === false) {
+    return;
+  }
+
+  // cater for pre-defined getter/setters
+  var getter = property && property.get;
+  if (!getter && arguments.length === 2) {
+    value = obj[key];
+  }
+  var setter = property && property.set;
+
+  var childOb = !shallow && observe({ vm: vm, key: key, value: value, parent: obj });
+  Object.defineProperty(obj, key, {
+    enumerable: true,
+    configurable: true,
+    get: function reactiveGetter() {
+      var val = getter ? getter.call(obj) : value;
+      if (Dep.target) {
+        dep.depend();
+        if (childOb) {
+          childOb.dep.depend();
+          if (Array.isArray(val)) {
+            dependArray(val);
+          }
+        }
+      }
+      return val;
+    },
+    set: function reactiveSetter(newVal) {
+      var val = getter ? getter.call(obj) : value;
+      /* eslint-disable no-self-compare */
+      if (newVal === val || (newVal !== newVal && val !== val)) {
+        return;
+      }
+
+      if (isObject(value) && hasOwn(value, '__ob__')) {
+        /**
+         * 删掉无效的 paths
+         * 注意：即使 path 只有一个也要删掉，因为其子节点可能有多个 path
+         */
+        cleanPaths(key, value.__ob__.op, parent.__ob__.op);
+      }
+
+      /* eslint-enable no-self-compare */
+      if ("development" !== 'production' && customSetter) {
+        customSetter();
+      }
+      if (setter) {
+        setter.call(obj, newVal);
+      } else {
+        value = newVal;
+      }
+
+      // Have to set dirty after value assigned, otherwise the dirty key is incrrect.
+      if (vm) {
+        // push parent key to dirty, wait to setData
+        if (vm.$dirty) {
+          vm.$dirty.set(obj.__ob__.op, key, newVal);
+        }
+      }
+      childOb = !shallow && observe({ vm: vm, key: key, value: newVal, parent: parent });
+      dep.notify();
+    }
+  });
+}
+
+/**
+ * Set a property on an object. Adds the new property and
+ * triggers change notification if the property doesn't
+ * already exist.
+ */
+function set(vm, target, key, val) {
+  if (Array.isArray(target) && isValidArrayIndex(key)) {
+    target.length = Math.max(target.length, key);
+    target.splice(key, 1, val);
+    return val;
+  }
+
+  if (key in target && !(key in Object.prototype)) {
+    target[key] = val;
+    return val;
+  }
+
+  var ob = target.__ob__;
+  if (target._isVue || (ob && ob.vmCount)) {
+    "development" !== 'production' &&
+      warn(
+        'Avoid adding reactive properties to a Vue instance or its root $data ' +
+          'at runtime - declare it upfront in the data option.'
+      );
+    return val;
+  }
+
+  if (!ob) {
+    target[key] = val;
+    return val;
+  }
+
+  if (isObject(target[key]) && hasOwn(target[key], '__ob__')) {
+    // delete invalid paths
+    cleanPaths(key, target[key].__ob__.op, ob.op);
+  }
+  defineReactive({ vm: vm, obj: ob.value, key: key, value: val, parent: ob.value });
+  if (vm) {
+    // push parent key to dirty, wait to setData
+    if (vm.$dirty && hasOwn(target, '__ob__')) {
+      vm.$dirty.set(target.__ob__.op, key, val);
+    }
+  }
+  ob.dep.notify();
+  return val;
+}
+
+/**
+ * Delete a property and trigger change if necessary.
+ */
+function del(target, key) {
+  if (Array.isArray(target) && isValidArrayIndex(key)) {
+    target.splice(key, 1);
+    return;
+  }
+
+  var ob = target.__ob__;
+  if (target._isVue || (ob && ob.vmCount)) {
+    "development" !== 'production' &&
+      warn('Avoid deleting properties on a Vue instance or its root $data ' + '- just set it to null.');
+    return;
+  }
+
+  if (!hasOwn(target, key)) {
+    return;
+  }
+
+  // set $dirty
+  target[key] = null;
+  delete target[key];
+  if (!ob) {
+    return;
+  }
+  ob.dep.notify();
+}
+
+/**
+ * Collect dependencies on array elements when the array is touched, since
+ * we cannot intercept array element access like property getters.
+ */
+function dependArray(value) {
+  for (var e = (void 0), i = 0, l = value.length; i < l; i++) {
+    e = value[i];
+    e && e.__ob__ && e.__ob__.dep.depend();
+    if (Array.isArray(e)) {
+      dependArray(e);
+    }
+  }
+}
+
+var Base = function Base() {
+  this._events = {};
+  this._watchers = [];
+};
+
+Base.prototype.$set = function $set (target, key, val) {
+  return set(this, target, key, val);
+};
+
+Base.prototype.$delete = function $delete (target, key) {
+  return del(target, key);
+};
+
+Base.prototype.$on = function $on (event, fn) {
+    var this$1 = this;
+
+  if (isArr(event)) {
+    event.forEach(function (item) {
+      if (isStr(item)) {
+        this$1.$on(item, fn);
+      } else if (isObj(item)) {
+        this$1.$on(item.event, item.fn);
+      }
+    });
+  } else {
+    (this._events[event] || (this._events[event] = [])).push(fn);
+  }
+  return this;
+};
+
+Base.prototype.$once = function $once () {};
+
+Base.prototype.$off = function $off (event, fn) {
+    var this$1 = this;
+
+  if (!event && !fn) {
+    this._events = Object.create(null);
+    return this;
+  }
+
+  if (isArr(event)) {
+    event.forEach(function (item) {
+      if (isStr(item)) {
+        this$1.$off(item, fn);
+      } else if (isObj(item)) {
+        this$1.$off(item.event, item.fn);
+      }
+    });
+    return this;
+  }
+  if (!this._events[event]) { return this; }
+
+  if (!fn) {
+    this._events[event] = null;
+    return this;
+  }
+
+  if (fn) {
+    var fns = this._events[event];
+    var i = fns.length;
+    while (i--) {
+      var tmp = fns[i];
+      if (tmp === fn || tmp.fn === fn) {
+        fns.splice(i, 1);
+        break;
+      }
+    }
+  }
+  return this;
+};
+
+Base.prototype.$emit = function $emit (event) {
+    var this$1 = this;
+
+  var vm = this;
+  var lowerCaseEvent = event.toLowerCase();
+  var fns = this._events[event] || [];
+  if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {
+    // TODO: handler warn
+  }
+  var args = toArray(arguments, 1);
+  fns.forEach(function (fn) {
+    try {
+      fn.apply(this$1, args);
+    } catch (e) {
+      handleError(e, vm, ("event handler for \"" + event + "\""));
+    }
+  });
+  return this;
+};
+
+var seenObjects = new _Set();
+
+/**
+ * Recursively traverse an object to evoke all converted
+ * getters, so that every nested property inside the object
+ * is collected as a "deep" dependency.
+ */
+function traverse(val) {
+  _traverse(val, seenObjects);
+  seenObjects.clear();
+}
+
+function _traverse(val, seen) {
+  var i, keys;
+  var isA = Array.isArray(val);
+  if ((!isA && !isObject(val)) || Object.isFrozen(val)) {
+    return;
+  }
+  if (val.__ob__) {
+    var depId = val.__ob__.dep.id;
+    if (seen.has(depId)) {
+      return;
+    }
+    seen.add(depId);
+  }
+  if (isA) {
+    i = val.length;
+    while (i--) { _traverse(val[i], seen); }
+  } else {
+    keys = Object.keys(val);
+    i = keys.length;
+    while (i--) { _traverse(val[keys[i]], seen); }
+  }
+}
+
+//import { callHook, activateChildComponent } from '../instance/lifecycle';
+
+var MAX_UPDATE_COUNT = 100;
+
+var queue = [];
+var activatedChildren = [];
+var has = {};
+var circular = {};
+var waiting = false;
+var flushing = false;
+var index = 0;
+
+/**
+ * Reset the scheduler's state.
+ */
+function resetSchedulerState() {
+  index = queue.length = activatedChildren.length = 0;
+  has = {};
+  {
+    circular = {};
+  }
+  waiting = flushing = false;
+}
+
+/**
+ * Flush both queues and run the watchers.
+ */
+function flushSchedulerQueue(times) {
+  if ( times === void 0 ) times = 0;
+
+  flushing = true;
+  var watcher, id;
+
+  // Sort queue before flush.
+  // This ensures that:
+  // 1. Components are updated from parent to child. (because parent is always
+  //    created before the child)
+  // 2. A component's user watchers are run before its render watcher (because
+  //    user watchers are created before the render watcher)
+  // 3. If a component is destroyed during a parent component's watcher run,
+  //    its watchers can be skipped.
+  times === 0 && queue.sort(function (a, b) { return a.id - b.id; });
+
+  // do not cache length because more watchers might be pushed
+  // as we run existing watchers
+  // there would be mutilple renderWatcher in the queue.
+  var renderWatcher = [];
+  if (times === 0) {
+    index = 0;
+  }
+  for (; index < queue.length; index++) {
+    // if it's renderWatcher, run it in the end
+    watcher = queue[index];
+    if (watcher && watcher.isRenderWatcher) {
+      renderWatcher.push(watcher);
+      continue;
+    }
+    id = watcher.id;
+    has[id] = null;
+    watcher.run();
+    // in dev build, check and stop circular updates.
+    // eslint-disable-next-line
+    if ("development" !== 'production' && has[id] != null) {
+      circular[id] = (circular[id] || 0) + 1;
+      if (circular[id] > MAX_UPDATE_COUNT) {
+        warn(
+          'You may have an infinite update loop ' +
+            (watcher.user ? ("in watcher with expression \"" + (watcher.expression) + "\"") : "in a component render function."),
+          watcher.vm
+        );
+        resetSchedulerState();
+        return;
+      }
+    }
+  }
+  // Run renderWatcher in the end.
+  if (renderWatcher.length) {
+    renderWatcher.forEach(function (watcher) {
+      has[watcher.id] = null;
+      watcher.run();
+    });
+  }
+
+  // It may added new watcher to the queue in render watcher
+  var pendingQueue = queue.slice(index);
+
+  if (pendingQueue.length) {
+    flushSchedulerQueue(times + 1);
+  } else {
+    // keep copies of post queues before resetting state
+    // const activatedQueue = activatedChildren.slice()
+    // const updatedQueue = queue.slice()
+
+    resetSchedulerState();
+
+    // call component updated and activated hooks
+    // callActivatedHooks(activatedQueue)
+    // callUpdatedHooks(updatedQueue)
+
+    // devtool hook
+    /* istanbul ignore if */
+    /*
+    if (devtools && config.devtools) {
+      devtools.emit('flush')
+    }*/
+  }
+}
+
+/*
+function callActivatedHooks(queue) {
+  for (let i = 0; i < queue.length; i++) {
+    queue[i]._inactive = true;
+    activateChildComponent(queue[i], true);
+  }
+}
+*/
+
+/**
+ * Push a watcher into the watcher queue.
+ * Jobs with duplicate IDs will be skipped unless it's
+ * pushed when the queue is being flushed.
+ */
+function queueWatcher(watcher) {
+  var id = watcher.id;
+  // eslint-disable-next-line
+  if (has[id] == null) {
+    has[id] = true;
+    if (!flushing) {
+      queue.push(watcher);
+    } else {
+      // if already flushing, splice the watcher based on its id
+      // if already past its id, it will be run next immediately.
+      var i = queue.length - 1;
+      while (i > index && queue[i].id > watcher.id) {
+        i--;
+      }
+      queue.splice(i + 1, 0, watcher);
+    }
+    // queue the flush
+    if (!waiting) {
+      waiting = true;
+      nextTick(flushSchedulerQueue);
+    }
+  }
+}
+
+//import { SimpleSet } from '../util/index';
+
+var uid$1 = 0;
+
+/**
+ * A watcher parses an expression, collects dependencies,
+ * and fires callback when the expression value changes.
+ * This is used for both the $watch() api and directives.
+ */
+var Watcher = function Watcher(vm, expOrFn, cb, options, isRenderWatcher) {
+  this.vm = vm;
+  if (isRenderWatcher) {
+    vm._watcher = this;
+  }
+  vm._watchers.push(this);
+  // options
+  if (options) {
+    this.deep = !!options.deep;
+    this.user = !!options.user;
+    this.computed = !!options.computed;
+    this.sync = !!options.sync;
+  } else {
+    this.deep = this.user = this.computed = this.sync = false;
+  }
+  this.cb = cb;
+  this.id = ++uid$1; // uid for batching
+  this.active = true;
+  this.dirty = this.computed; // for computed watchers
+  this.deps = [];
+  this.newDeps = [];
+  this.depIds = new _Set();
+  this.newDepIds = new _Set();
+  this.isRenderWatcher = isRenderWatcher;
+  this.expression = expOrFn.toString();
+  // parse expression for getter
+  if (typeof expOrFn === 'function') {
+    this.getter = expOrFn;
+  } else {
+    this.getter = parsePath(expOrFn);
+    if (!this.getter) {
+      this.getter = function() {};
+      "development" !== 'production' &&
+        warn(
+          "Failed watching path: \"" + expOrFn + "\" " +
+            'Watcher only accepts simple dot-delimited paths. ' +
+            'For full control, use a function instead.',
+          vm
+        );
+    }
+  }
+  this.value = this.computed ? undefined : this.get();
+};
+
+/**
+ * Evaluate the getter, and re-collect dependencies.
+ */
+Watcher.prototype.get = function get () {
+  pushTarget(this);
+  var value;
+  var vm = this.vm;
+  try {
+    value = this.getter.call(vm, vm);
+  } catch (e) {
+    if (this.user) {
+      handleError(e, vm, ("getter for watcher \"" + (this.expression) + "\""));
+    } else {
+      throw e;
+    }
+  } finally {
+    // "touch" every property so they are all tracked as
+    // dependencies for deep watching
+    if (this.deep) {
+      traverse(value);
+    }
+    popTarget();
+    if (!this.isRenderWatcher) { this.cleanupDeps(); }
+  }
+  return value;
+};
+
+/**
+ * Add a dependency to this directive.
+ */
+Watcher.prototype.addDep = function addDep (dep) {
+  var id = dep.id;
+  if (!this.newDepIds.has(id)) {
+    this.newDepIds.add(id);
+    this.newDeps.push(dep);
+    if (!this.depIds.has(id)) {
+      dep.addSub(this);
+    }
+  }
+};
+
+/**
+ * Clean up for dependency collection.
+ */
+Watcher.prototype.cleanupDeps = function cleanupDeps () {
+  var i = this.deps.length;
+  while (i--) {
+    var dep = this.deps[i];
+    if (!this.newDepIds.has(dep.id)) {
+      dep.removeSub(this);
+    }
+  }
+  var tmp = this.depIds;
+  this.depIds = this.newDepIds;
+  this.newDepIds = tmp;
+  this.newDepIds.clear();
+  tmp = this.deps;
+  this.deps = this.newDeps;
+  this.newDeps = tmp;
+  this.newDeps.length = 0;
+};
+
+/**
+ * Subscriber interface.
+ * Will be called when a dependency changes.
+ */
+Watcher.prototype.update = function update () {
+  /* istanbul ignore else */
+  if (this.computed) {
+    this.dirty = true;
+  } else if (this.sync) {
+    this.run();
+  } else {
+    queueWatcher(this);
+  }
+};
+
+/**
+ * Scheduler job interface.
+ * Will be called by the scheduler.
+ */
+Watcher.prototype.run = function run () {
+  if (this.active) {
+    var value = this.get();
+    if (
+      value !== this.value ||
+      // Deep watchers and watchers on Object/Arrays should fire even
+      // when the value is the same, because the value may
+      // have mutated.
+      isObject(value) ||
+      this.deep
+    ) {
+      // set new value
+      var oldValue = this.value;
+      this.value = value;
+      if (this.user) {
+        try {
+          this.cb.call(this.vm, value, oldValue);
+        } catch (e) {
+          handleError(e, this.vm, ("callback for watcher \"" + (this.expression) + "\""));
+        }
+      } else {
+        this.cb.call(this.vm, value, oldValue);
+      }
+    }
+  }
+};
+
+/**
+ * Evaluate the value of the watcher.
+ * This only gets called for computed watchers.
+ */
+Watcher.prototype.evaluate = function evaluate () {
+  this.value = this.get();
+  if (this.vm.$dirty) {
+    var keyVal =
+      this._computedWatchers && this._computedWatchers[this.key]
+        ? this.vm._computedWatchers[this.key].value
+        : this.value;
+    this.vm.$dirty.push(this.key, this.key, keyVal, this.value);
+  }
+  this.dirty = false;
+  return this.value;
+};
+
+/**
+ * Depend on all deps collected by this watcher.
+ */
+Watcher.prototype.depend = function depend () {
+  if (Dep.target) {
+    var i = this.deps.length;
+    while (i--) {
+      this.deps[i].depend();
+    }
+  }
+};
+
+/**
+ * Remove self from all dependencies' subscriber list.
+ */
+Watcher.prototype.teardown = function teardown () {
+  if (this.active) {
+    // remove self from vm's watcher list
+    // this is a somewhat expensive operation so we skip it
+    // if the vm is being destroyed.
+    if (!this.vm._isBeingDestroyed) {
+      remove(this.vm._watchers, this);
+    }
+    var i = this.deps.length;
+    while (i--) {
+      this.deps[i].removeSub(this);
+    }
+    this.active = false;
+  }
+};
+
+var WepyComponent = /*@__PURE__*/(function (Base$$1) {
+  function WepyComponent () {
+    Base$$1.apply(this, arguments);
+  }
+
+  if ( Base$$1 ) WepyComponent.__proto__ = Base$$1;
+  WepyComponent.prototype = Object.create( Base$$1 && Base$$1.prototype );
+  WepyComponent.prototype.constructor = WepyComponent;
+
+  WepyComponent.prototype.$watch = function $watch (expOrFn, cb, options) {
+    var this$1 = this;
+
+    var vm = this;
+    if (isArr(cb)) {
+      cb.forEach(function (handler) {
+        this$1.$watch(expOrFn, handler, options);
+      });
+    }
+    if (isPlainObject(cb)) {
+      var handler = cb;
+      options = handler;
+      handler = handler.handler;
+      if (typeof handler === 'string') { handler = this[handler]; }
+      return this.$watch(expOrFn, handler, options);
+    }
+
+    options = options || {};
+    options.user = true;
+    var watcher = new Watcher(vm, expOrFn, cb, options);
+    if (options.immediate) {
+      cb.call(vm, watcher.value);
+    }
+    return function unwatchFn() {
+      watcher.teardown();
+    };
+  };
+
+  WepyComponent.prototype.$forceUpdate = function $forceUpdate () {
+    if (this._watcher) {
+      this._watcher.update();
+    }
+  };
+
+  WepyComponent.prototype.$emit = function $emit (event) {
+    var args = [], len = arguments.length - 1;
+    while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
+
+    var fns = this._events[event];
+
+    if (fns) {
+      Base$$1.prototype.$emit.apply(this, arguments);
+    } else {
+      this.$wx.triggerEvent(event, { arguments: args });
+    }
+
+    return this;
+  };
+
+  WepyComponent.prototype.$trigger = function $trigger (event, data, option) {
+    this.$wx.triggerEvent(event, { arguments: [data] }, option);
+  };
+
+  return WepyComponent;
+}(Base));
+
+WepyComponent.prototype.$nextTick = renderNextTick;
+
+var sharedPropertyDefinition = {
+  enumerable: true,
+  configurable: true,
+  get: noop,
+  set: noop
+};
+
+function proxy(target, sourceKey, key) {
+  sharedPropertyDefinition.get = function proxyGetter() {
+    return this[sourceKey][key];
+  };
+  sharedPropertyDefinition.set = function proxySetter(val) {
+    this[sourceKey][key] = val;
+  };
+  Object.defineProperty(target, key, sharedPropertyDefinition);
+}
+
+/*
+ * patch data option
+ */
+function patchData(output, data) {
+  if (!data) {
+    data = {};
+  }
+  output.data = data;
+}
+
+/*
+ * init data
+ */
+function initData(vm, data) {
+  if (!data) {
+    data = {};
+  }
+  var _data;
+  if (typeof data === 'function') {
+    _data = data.call(vm);
+  } else {
+    _data = clone(data);
+  }
+  vm._data = _data;
+  Object.keys(_data).forEach(function (key) {
+    proxy(vm, '_data', key);
+  });
+
+  observe({
+    vm: vm,
+    key: '',
+    value: _data,
+    parent: '',
+    root: true
+  });
+  //observe(vm, _data, null, true);
+}
+
+function initWatch(vm, watch) {
+  if (watch) {
+    Object.keys(watch).forEach(function (key) {
+      vm.$watch(key, watch[key]);
+    });
+  }
+}
+
+function createComputedGetter(key) {
+  return function computedGetter() {
+    var watcher = this._computedWatchers && this._computedWatchers[key];
+    if (watcher) {
+      watcher.key = key;
+      if (watcher.dirty) {
+        watcher.evaluate();
+      }
+      if (Dep.target) {
+        watcher.depend();
+      }
+      return watcher.value;
+    }
+  };
+}
+
+/*
+ * init computed
+ */
+function initComputed(vm, computed) {
+  if (!computed) {
+    return;
+  }
+  var watchers = (vm._computedWatchers = Object.create(null));
+  var computedWatcherOptions = { computed: true };
+
+  Object.keys(computed).forEach(function (key) {
+    var def = computed[key];
+    var getter = typeof def === 'object' ? def.get : def;
+
+    if (!getter || typeof getter !== 'function') {
+      // eslint-disable-next-line
+      console.error(("Getter is missing for computed property \"" + key + "\""));
+    }
+
+    // push to dirty after dep called.
+    watchers[key] = new Watcher(
+      vm,
+      getter || function() {},
+      function() {
+        // evaluate will set dirty
+        // vm.$dirty.push(key, key, newv);
+      },
+      computedWatcherOptions
+    );
+
+    if (typeof def === 'function') {
+      sharedPropertyDefinition.get = createComputedGetter(key);
+      sharedPropertyDefinition.set = function() {};
+    } else {
+      sharedPropertyDefinition.get = def.cache !== false ? createComputedGetter(key) : def.get;
+      sharedPropertyDefinition.set = def.set;
+    }
+
+    Object.defineProperty(vm, key, sharedPropertyDefinition);
+  });
+}
+
+var WepyConstructor = /*@__PURE__*/(function (WepyComponent$$1) {
+  function WepyConstructor(opt) {
+    if ( opt === void 0 ) opt = {};
+
+    WepyComponent$$1.call(this);
+    var vm = new WepyComponent$$1();
+
+    // Only need data and watchers for a empty WepyComponent
+    if (opt.data) {
+      initData(vm, opt.data);
+    }
+    initWatch(vm);
+
+    initComputed(vm, opt.computed);
+    return vm;
+  }
+
+  if ( WepyComponent$$1 ) WepyConstructor.__proto__ = WepyComponent$$1;
+  WepyConstructor.prototype = Object.create( WepyComponent$$1 && WepyComponent$$1.prototype );
+  WepyConstructor.prototype.constructor = WepyConstructor;
+
+  return WepyConstructor;
+}(WepyComponent));
+
+var $global = Object.create(null);
+
+function use(plugin) {
+  var args = [], len = arguments.length - 1;
+  while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
+
+  if (plugin.installed) {
+    return this;
+  }
+
+  var install = plugin.install || plugin;
+
+  if (isFunc(install)) {
+    install.apply(plugin, [this].concat(args));
+  }
+
+  plugin.installed = 1;
+}
+
+function mixin(options) {
+  if ( options === void 0 ) options = {};
+
+  $global.mixin = ($global.mixin || []).concat(options);
+}
+
+var WepyApp = /*@__PURE__*/(function (Base$$1) {
+  function WepyApp() {
+    Base$$1.call(this);
+  }
+
+  if ( Base$$1 ) WepyApp.__proto__ = Base$$1;
+  WepyApp.prototype = Object.create( Base$$1 && Base$$1.prototype );
+  WepyApp.prototype.constructor = WepyApp;
+
+  return WepyApp;
+}(Base));
+
+var WepyPage = /*@__PURE__*/(function (WepyComponent$$1) {
+  function WepyPage () {
+    WepyComponent$$1.apply(this, arguments);
+  }
+
+  if ( WepyComponent$$1 ) WepyPage.__proto__ = WepyComponent$$1;
+  WepyPage.prototype = Object.create( WepyComponent$$1 && WepyComponent$$1.prototype );
+  WepyPage.prototype.constructor = WepyPage;
+
+  WepyPage.prototype.$launch = function $launch (url, params) {
+    this.$route('reLaunch', url, params);
+  };
+  WepyPage.prototype.$navigate = function $navigate (url, params) {
+    this.$route('navigate', url, params);
+  };
+
+  WepyPage.prototype.$redirect = function $redirect (url, params) {
+    this.$route('redirect', url, params);
+  };
+
+  WepyPage.prototype.$back = function $back (p) {
+    if ( p === void 0 ) p = {};
+
+    if (isNum(p)) { p = { delta: p }; }
+
+    if (!p.delta) { p.delta = 1; }
+
+    return wx.navigateBack(p);
+  };
+
+  WepyPage.prototype.$route = function $route (type, url, params) {
+    if ( params === void 0 ) params = {};
+
+    var wxparams;
+    if (isStr(url)) {
+      var paramsList = [];
+      if (isObj(params)) {
+        for (var k in params) {
+          if (!isUndef(params[k])) {
+            paramsList.push((k + "=" + (encodeURIComponent(params[k]))));
+          }
+        }
+      }
+      if (paramsList.length) { url = url + '?' + paramsList.join('&'); }
+
+      wxparams = { url: url };
+    } else {
+      wxparams = url;
+    }
+    var fn = wx[type] || wx[type + 'To'];
+    if (isFunc(fn)) {
+      return fn(wxparams);
+    }
+  };
+
+  return WepyPage;
+}(WepyComponent));
+
+function callUserHook(vm, hookName, arg) {
+  var pageHook = vm.hooks ? vm.hooks[hookName] : null;
+  var appHook = vm.$app && vm.$app.hooks ? vm.$app.hooks[hookName] : null;
+
+  if (!vm.$app) {
+    warn('$app is not initialized in this Component', vm);
+  }
+
+  var result = arg;
+
+  // First run page hook, and then run app hook
+  // Pass page hook result to app hook
+  // If return undefined, then return default argument
+  [pageHook, appHook].forEach(function (fn) {
+    if (isFunc(fn)) {
+      result = fn.call(vm, result);
+      if (isUndef(result)) {
+        result = arg;
+      }
+    }
+  });
+
+  return result;
+}
+
+function initHooks(vm, hooks) {
+  if ( hooks === void 0 ) hooks = {};
+
+  vm.hooks = hooks;
+}
+
+var AllowedTypes = [String, Number, Boolean, Object, Array, null];
+
+var observerFn = function() {
+  return function(newVal, oldVal, changedPaths) {
+    var vm = this.$wepy;
+
+    // changedPaths 长度大于 1，说明是由内部赋值改变的 prop
+    if (changedPaths.length > 1) {
+      return;
+    }
+    var _data = newVal;
+    if (typeof _data === 'function') {
+      _data = _data.call(vm);
+    }
+    vm[changedPaths[0]] = _data;
+  };
+};
+/*
+ * patch props option
+ */
+function patchProps(output, props) {
+  var newProps = {};
+  if (isStr(props)) {
+    newProps = [props];
+  }
+  if (isArr(props)) {
+    props.forEach(function (prop) {
+      newProps[prop] = {
+        type: null,
+        observer: observerFn(output, props, prop)
+      };
+    });
+  } else if (isObj(props)) {
+    for (var k in props) {
+      var prop = props[k];
+      var newProp = {};
+
+      // props.type
+      if (isUndef(prop.type)) {
+        newProp.type = null;
+      } else if (isArr(prop.type)) {
+        newProp.type = null;
+        // eslint-disable-next-line
+        console.warn(("In mini-app, mutiple type is not allowed. The type of \"" + k + "\" will changed to \"null\""));
+      } else if (AllowedTypes.indexOf(prop.type) === -1) {
+        newProp.type = null;
+        // eslint-disable-next-line
+        console.warn(
+          ("Type property of props \"" + k + "\" is invalid. Only String/Number/Boolean/Object/Array/null is allowed in weapp Component")
+        );
+      } else {
+        newProp.type = prop.type;
+      }
+
+      // props.default
+      if (!isUndef(prop.default)) {
+        if (isFunc(prop.default)) {
+          newProp.value = prop.default.call(output);
+        } else {
+          newProp.value = prop.default;
+        }
+      }
+      // TODO
+      // props.validator
+      // props.required
+
+      newProp.observer = observerFn(output, props, prop);
+
+      newProps[k] = newProp;
+    }
+  }
+
+  // eslint-disable-next-line
+  Object.keys(newProps).forEach(function (prop) {});
+
+  output.properties = newProps;
+}
+
+/*
+ * init props
+ */
+function initProps(vm, properties) {
+  vm._props = {};
+
+  if (!properties) {
+    return;
+  }
+
+  Object.keys(properties).forEach(function (key) {
+    vm._props[key] = properties[key].value;
+    proxy(vm, '_props', key);
+  });
+
+  observe({
+    vm: vm,
+    key: '',
+    value: vm._props,
+    root: true
+  });
+}
+
+function initRender(vm, keys, computedKeys) {
+  vm._init = false;
+  var dirtyFromAttach = null;
+  return new Watcher(
+    vm,
+    function() {
+      if (!vm._init) {
+        keys.forEach(function (key) { return clone(vm[key]); });
+      }
+
+      if (vm.$dirty.length() || dirtyFromAttach) {
+        var keys$1 = vm.$dirty.get('key');
+        computedKeys.forEach(function (key) { return vm[key]; });
+        var dirty = vm.$dirty.pop();
+
+        // TODO: reset subs
+        Object.keys(keys$1).forEach(function (key) { return clone(vm[key]); });
+
+        if (vm._init) {
+          dirty = callUserHook(vm, 'before-setData', dirty);
+        }
+
+        // vm._fromSelf = true;
+        if (dirty || dirtyFromAttach) {
+          // init render is in lifecycle, setData in lifecycle will not work, so cacheData is needed.
+          if (!vm._init) {
+            if (dirtyFromAttach === null) {
+              dirtyFromAttach = {};
+            }
+            Object.assign(dirtyFromAttach, dirty);
+          } else if (dirtyFromAttach) {
+            // setData in attached
+            vm.$wx.setData(Object.assign(dirtyFromAttach, dirty || {}), renderFlushCallbacks);
+            dirtyFromAttach = null;
+          } else {
+            vm.$wx.setData(dirty, renderFlushCallbacks);
+          }
+        }
+      }
+      vm._init = true;
+    },
+    function() {},
+    null,
+    true
+  );
+}
+
+var Event = function Event(e) {
+  var detail = e.detail;
+  var target = e.target;
+  var currentTarget = e.currentTarget;
+  this.$wx = e;
+  this.type = e.type;
+  this.timeStamp = e.timeStamp;
+  if (detail) {
+    this.x = detail.x;
+    this.y = detail.y;
+  }
+
+  this.target = target;
+  this.currentTarget = currentTarget;
+  this.touches = e.touches;
+  this.changedTouches = e.changedTouches;
+};
+
+/**
+ * Transform wxml data-xx params to an array
+ */
+function transformParams(dataset, type, hasModel) {
+  if ( hasModel === void 0 ) hasModel = false;
+
+  var i = 0;
+  var params = [];
+  var modelParams = [];
+
+  var noParams = false;
+  var noModelParams = !hasModel;
+
+  var camelizedType = camelize(type);
+  while (i++ < 26 && (!noParams || !noModelParams)) {
+    var alpha = String.fromCharCode(64 + i);
+    if (!noParams) {
+      var key = 'wpy' + camelizedType + alpha;
+      if (!(key in dataset)) {
+        // it can be undefined;
+        noParams = true;
+      } else {
+        params.push(dataset[key]);
+      }
+    }
+    if (!noModelParams && hasModel) {
+      var modelKey = 'model' + alpha;
+      if (!(modelKey in dataset)) {
+        noModelParams = true;
+      } else {
+        modelParams.push(dataset[modelKey]);
+      }
+    }
+  }
+
+  return {
+    handler: params,
+    model: modelParams
+  };
+}
+
+var dispatcher = function(e) {
+  var vm = this.$wepy;
+  var type = e.type;
+  // touchstart do not have currentTarget
+  var dataset = (e.currentTarget || e.target).dataset || {};
+  var evtid = dataset.wpyEvt;
+  var modelId = dataset.modelId;
+  var rel = vm.$rel || {};
+  var handler = rel.handlers && rel.handlers[evtid] && rel.handlers[evtid][type];
+  var model = rel.models && rel.models[modelId];
+
+  if (!handler && !model) {
+    return;
+  }
+
+  var params = transformParams(dataset, type, !!model);
+
+  // Call model method
+  if (model && type === model.type && isFunc(model.handler)) {
+    model.handler.call(vm, e.detail.value, params.model);
+  }
+
+  // Call handler method
+  if (isFunc(handler)) {
+    var $event = new Event(e);
+    var paramsWithEvent = params.handler.concat($event);
+    var args = (e.detail && e.detail.arguments) || [];
+
+    var hookRes = callUserHook(vm, 'before-event', {
+      event: $event,
+      params: paramsWithEvent,
+      args: args
+    });
+
+    if (hookRes === false) {
+      // Event cancelled.
+      return;
+    }
+    return handler.apply(vm, paramsWithEvent);
+  } else if (!model) {
+    throw new Error('Unrecognized event');
+  }
+};
+
+/*
+ * initialize page methods, also the app
+ */
+function initMethods(vm, methods) {
+  if (methods) {
+    Object.keys(methods).forEach(function (method) {
+      vm[method] = methods[method];
+    });
+  }
+}
+
+/*
+ * patch method option
+ */
+function patchMethods(output, methods) {
+  output.methods = {};
+  var target = output.methods;
+
+  target.__initComponent = function(e) {
+    var child = e.detail;
+    var ref$1 = e.target.dataset;
+    var ref = ref$1.ref;
+    var wpyEvt = ref$1.wpyEvt;
+    var vm = this.$wepy;
+    vm.$children.push(child);
+    if (ref) {
+      if (vm.$refs[ref]) {
+        warn('duplicate ref "' + ref + '" will be covered by the last instance.\n', vm);
+      }
+      vm.$refs[ref] = child;
+    }
+    child.$evtId = wpyEvt;
+    child.$parent = vm;
+    child.$app = vm.$app;
+    child.$root = vm.$root;
+    return vm;
+  };
+  target.__dispatcher = dispatcher;
+
+  // TODO: perf
+  // Only orginal component method goes to target. no need to add all methods.
+  if (methods) {
+    Object.keys(methods).forEach(function (method) {
+      target[method] = methods[method];
+    });
+  }
+}
+
+var Dirty = function Dirty(type) {
+  this.reset();
+
+  // path||key
+  this.type = type || 'path';
+};
+
+Dirty.prototype.push = function push (key, path, keyValue, pathValue) {
+  if (pathValue === undefined) {
+    return;
+  }
+  this._keys[key] = keyValue;
+  this._path[path] = pathValue;
+  this._length++;
+};
+
+Dirty.prototype.pop = function pop () {
+  var data = Object.create(null);
+  if (this.type === 'path') {
+    data = this._path;
+  } else if (this.type === 'key') {
+    data = this._keys;
+  }
+  this.reset();
+  return data;
+};
+
+Dirty.prototype.get = function get (type) {
+  return type === 'path' ? this._path : this._keys;
+};
+
+/**
+ * Set dirty from a ObserverPath
+ */
+Dirty.prototype.set = function set (op, key, value) {
+  var pathMap;
+  var pathKeys;
+  // eslint-disable-next-line eqeqeq
+  if (key != null) {
+    var ref = getPathMap(key, op.pathKeys, op.pathMap);
+      var combinePathKeys = ref.combinePathKeys;
+      var combinePathMap = ref.combinePathMap;
+    pathKeys = combinePathKeys;
+    pathMap = combinePathMap;
+  } else {
+    pathKeys = op.pathKeys;
+    pathMap = op.pathMap;
+  }
+  /**
+   * 出于性能考虑，使用 usingComponents 时， setData 内容不会被直接深复制，
+   * 即 this.setData({ field: obj }) 后 this.data.field === obj 。
+   * 因此不需要所有 path 都 setData 。
+   */
+  var ref$1 = pathMap[pathKeys[0]];
+    var root = ref$1.root;
+    var path = ref$1.path;
+  this.push(root, path, root === path ? value : op.ob.vm[root], value);
+};
+
+Dirty.prototype.reset = function reset () {
+  this._keys = {};
+  this._path = {};
+  this._length = 0;
+  return this;
+};
+
+Dirty.prototype.length = function length () {
+  return this._length;
+};
+
+var comid = 0;
+var app;
+
+var callUserMethod = function(vm, userOpt, method, args) {
+  var result;
+  var methods = userOpt[method];
+  if (isFunc(methods)) {
+    result = userOpt[method].apply(vm, args);
+  } else if (isArr(methods)) {
+    for (var i in methods) {
+      if (isFunc(methods[i])) {
+        result = methods[i].apply(vm, args);
+      }
+    }
+  }
+  return result;
+};
+
+var getLifeCycle = function (defaultLifecycle, rel, type) {
+  var lifecycle = defaultLifecycle.concat([]);
+  if (rel && rel.lifecycle && rel.lifecycle[type]) {
+    var userDefinedLifecycle = [];
+    if (isFunc(rel.lifecycle[type])) {
+      userDefinedLifecycle = rel.lifecycle[type].call(null, lifecycle);
+    }
+    userDefinedLifecycle.forEach(function (u) {
+      if (lifecycle.indexOf(u) > -1) {
+        warn(("'" + u + "' is already implemented in current version, please remove it from your lifecycel config"));
+      } else {
+        lifecycle.push(u);
+      }
+    });
+  }
+  return lifecycle;
+};
+
+/*
+ * patch app lifecyle
+ */
+function patchAppLifecycle(appConfig, options, rel) {
+  if ( rel === void 0 ) rel = {};
+
+  appConfig.onLaunch = function() {
+    var args = [], len = arguments.length;
+    while ( len-- ) args[ len ] = arguments[ len ];
+
+    var vm = new WepyApp();
+    app = vm;
+    vm.$options = options;
+    vm.$route = {};
+    vm.$rel = rel;
+
+    vm.$wx = this;
+    this.$wepy = vm;
+
+    initHooks(vm, options.hooks);
+
+    initMethods(vm, options.methods);
+
+    return callUserMethod(vm, vm.$options, 'onLaunch', args);
+  };
+
+  var lifecycle = getLifeCycle(WEAPP_APP_LIFECYCLE, rel, 'app');
+
+  lifecycle.forEach(function (k) {
+    // it's not defined aready && user defined it && it's an array or function
+    if (!appConfig[k] && options[k] && (isFunc(options[k]) || isArr(options[k]))) {
+      appConfig[k] = function() {
+        var args = [], len = arguments.length;
+        while ( len-- ) args[ len ] = arguments[ len ];
+
+        return callUserMethod(app, app.$options, k, args);
+      };
+    }
+  });
+}
+
+function patchLifecycle(output, options, rel, isComponent) {
+  var initClass = isComponent ? WepyComponent : WepyPage;
+  var initLifecycle = function() {
+    var args = [], len = arguments.length;
+    while ( len-- ) args[ len ] = arguments[ len ];
+
+    var vm = new initClass();
+
+    vm.$dirty = new Dirty('path');
+    vm.$children = [];
+    vm.$refs = {};
+
+    this.$wepy = vm;
+    vm.$wx = this;
+    vm.$is = this.is;
+    vm.$options = options;
+    vm.$rel = rel;
+    vm._watchers = [];
+    if (!isComponent) {
+      vm.$root = vm;
+    }
+    if (app) {
+      vm.$app = app;
+    }
+    if (this.is === 'custom-tab-bar/index') {
+      vm.$app = app;
+      vm.$parent = app;
+    }
+
+    vm.$id = ++comid + (isComponent ? '.1' : '.0');
+
+    callUserMethod(vm, vm.$options, 'beforeCreate', args);
+
+    initHooks(vm, options.hooks);
+
+    initProps(vm, output.properties);
+
+    initData(vm, output.data, isComponent);
+
+    initMethods(vm, options.methods);
+
+    initComputed(vm, options.computed, true);
+
+    initWatch(vm, options.watch);
+
+    // create render watcher
+    initRender(
+      vm,
+      Object.keys(vm._data)
+        .concat(Object.keys(vm._props))
+        .concat(Object.keys(vm._computedWatchers || {})),
+      Object.keys(vm._computedWatchers || {})
+    );
+
+    return callUserMethod(vm, vm.$options, 'created', args);
+  };
+
+  output.created = initLifecycle;
+  if (isComponent) {
+    output.attached = function() {
+      var args = [], len = arguments.length;
+      while ( len-- ) args[ len ] = arguments[ len ];
+
+      // Component attached
+      var outProps = output.properties || {};
+      // this.propperties are includes datas
+      var acceptProps = this.properties;
+      var vm = this.$wepy;
+
+      this.triggerEvent('_init', vm);
+
+      // created 不能调用 setData，如果有 dirty 在此更新
+      vm.$forceUpdate();
+
+      Object.keys(outProps).forEach(function (k) { return (vm[k] = acceptProps[k]); });
+
+      return callUserMethod(vm, vm.$options, 'attached', args);
+    };
+  } else {
+    output.attached = function() {
+      var args = [], len = arguments.length;
+      while ( len-- ) args[ len ] = arguments[ len ];
+
+      // Page attached
+      var vm = this.$wepy;
+      var app = vm.$app;
+      // eslint-disable-next-line
+      var pages = getCurrentPages();
+      var currentPage = pages[pages.length - 1];
+      var path = currentPage.__route__;
+      var webViewId = currentPage.__wxWebviewId__;
+
+      var refs = rel.refs || [];
+      var query = wx.createSelectorQuery();
+
+      refs.forEach(function (item) {
+        // {
+        //   id: { name: 'hello', bind: true },
+        //   ref: { name: 'value', bind: false }
+        // }
+        var idAttr = item.id;
+        var refAttr = item.ref;
+        var actualAttrIdName = idAttr.name;
+        var actualAttrRefName = refAttr.name;
+        var selector = "#" + actualAttrIdName;
+
+        if (idAttr.bind) {
+          // if id is a bind attr
+          actualAttrIdName = vm[idAttr.name];
+          selector = "#" + actualAttrIdName;
+          vm.$watch(idAttr.name, function(newAttrName) {
+            actualAttrIdName = newAttrName;
+            selector = "#" + actualAttrIdName;
+            vm.$refs[actualAttrRefName] = query.select(selector);
+          });
+        }
+
+        if (refAttr.bind) {
+          // if ref is a bind attr
+          actualAttrRefName = vm[refAttr.name];
+
+          vm.$watch(refAttr.name, function(newAttrName, oldAttrName) {
+            actualAttrRefName = newAttrName;
+            vm.$refs[oldAttrName] = null;
+            vm.$refs[newAttrName] = query.select(selector);
+          });
+        }
+        vm.$refs[actualAttrRefName] = query.select(selector);
+      });
+
+      // created 不能调用 setData，如果有 dirty 在此更新
+      vm.$forceUpdate();
+
+      if (app.$route.path !== path) {
+        app.$route.path = path;
+        app.$route.webViewId = webViewId;
+        vm.routed && vm.routed();
+      }
+
+      // TODO: page attached
+      return callUserMethod(vm, vm.$options, 'attached', args);
+    };
+    // Page lifecycle will be called under methods
+    // e.g:
+    // Component({
+    //   methods: {
+    //     onLoad () {
+    //       console.log('page onload')
+    //     }
+    //   }
+    // })
+
+    var lifecycle$1 = getLifeCycle(WEAPP_PAGE_LIFECYCLE, rel, 'page');
+
+    lifecycle$1.forEach(function (k) {
+      if (!output[k] && options[k] && (isFunc(options[k]) || isArr(options[k]))) {
+        output.methods[k] = function() {
+          var args = [], len = arguments.length;
+          while ( len-- ) args[ len ] = arguments[ len ];
+
+          return callUserMethod(this.$wepy, this.$wepy.$options, k, args);
+        };
+      }
+    });
+  }
+  var lifecycle = getLifeCycle(WEAPP_COMPONENT_LIFECYCLE, rel, 'component');
+
+  lifecycle.forEach(function (k) {
+    // beforeCreate is not a real lifecycle
+    if (!output[k] && k !== 'beforeCreate' && (isFunc(options[k]) || isArr(options[k]))) {
+      output[k] = function() {
+        var args = [], len = arguments.length;
+        while ( len-- ) args[ len ] = arguments[ len ];
+
+        return callUserMethod(this.$wepy, this.$wepy.$options, k, args);
+      };
+    }
+  });
+}
+
+var config$1 = {
+  optionMergeStrategies: {},
+  constants: {
+    WEAPP_LIFECYCLE: WEAPP_LIFECYCLE,
+    WEAPP_APP_LIFECYCLE: WEAPP_APP_LIFECYCLE,
+    WEAPP_PAGE_LIFECYCLE: WEAPP_PAGE_LIFECYCLE,
+    WEAPP_COMPONENT_LIFECYCLE: WEAPP_COMPONENT_LIFECYCLE
+  }
+};
+
+// [Default Strategy]
+// Update if it's not exist in output. Can be replaced by option[key].
+// e.g.
+// export default {
+//   myCustomMethod () {
+//     // doSomething
+//   }
+// }
+//
+// [Merge Strategy]
+// Replaced by the latest mixins property.
+// e.g.
+// export default {
+//   data: {
+//     a: 1
+//   }
+// }
+//
+// [Lifecycle Strategy]
+// Extend lifecycle. update lifecycle to an array.
+// e.g.
+// export default {
+//   onShow: {
+//     console.log('onShow');
+//   }
+// }
+var globalMixinPatched = false;
+
+var strats = null;
+
+function getStrategy(key) {
+  if (!strats) {
+    initStrats();
+  }
+  if (strats[key]) {
+    return strats[key];
+  } else {
+    return defaultStrat;
+  }
+}
+function defaultStrat(output, option, key, data) {
+  if (!output[key]) {
+    output[key] = data;
+  }
+}
+
+function simpleMerge(parentVal, childVal) {
+  return !parentVal || !childVal ? parentVal || childVal : Object.assign({}, parentVal, childVal);
+}
+
+function initStrats() {
+  if (strats) { return strats; }
+
+  strats = config$1.optionMergeStrategies;
+
+  strats.data = strats.props = strats.methods = strats.computed = strats.watch = strats.hooks = function mergeStrategy(
+    output,
+    option,
+    key,
+    data
+  ) {
+    option[key] = simpleMerge(option[key], data);
+  };
+
+  WEAPP_LIFECYCLE.forEach(function (lifecycle) {
+    if (!strats[lifecycle]) {
+      strats[lifecycle] = function lifeCycleStrategy(output, option, key, data) {
+        if (!option[key]) {
+          option[key] = isArr(data) ? data : [data];
+        } else {
+          option[key] = [data].concat(option[key]);
+        }
+      };
+    }
+  });
+}
+
+function patchMixins(output, option, mixins) {
+  if (!mixins && !$global.mixin) {
+    return;
+  }
+
+  if (!globalMixinPatched) {
+    var globalMixin = $global.mixin || [];
+
+    mixins = globalMixin.concat(mixins);
+    globalMixinPatched = true;
+  }
+
+  if (isArr(mixins)) {
+    mixins.forEach(function (mixin) { return patchMixins(output, option, mixin); });
+    globalMixinPatched = false;
+  } else {
+    if (!strats) {
+      initStrats();
+    }
+    for (var k in mixins) {
+      strat = getStrategy(k);
+      var strat = strats[k] || defaultStrat;
+      strat(output, option, k, mixins[k]);
+    }
+  }
+}
+
+function patchRelations(output, relations) {
+  if (!relations) {
+    relations = {};
+  }
+  output.relations = relations;
+}
+
+function app$1(option, rel) {
+  var appConfig = {};
+
+  patchMixins(appConfig, option, option.mixins);
+  patchAppLifecycle(appConfig, option, rel);
+
+  return App(appConfig);
+}
+
+function component(opt, rel) {
+  if ( opt === void 0 ) opt = {};
+
+  var compConfig = {
+    externalClasses: opt.externalClasses || [],
+    // support component options property
+    // example: options: {addGlobalClass:true}
+    options: opt.options || {}
+  };
+
+  patchMixins(compConfig, opt, opt.mixins);
+
+  if (opt.properties) {
+    compConfig.properties = opt.properties;
+    if (opt.props) {
+      // eslint-disable-next-line no-console
+      console.warn("props will be ignore, if properties is set");
+    }
+  } else if (opt.props) {
+    patchProps(compConfig, opt.props);
+  }
+
+  patchMethods(compConfig, opt.methods, true);
+
+  patchData(compConfig, opt.data, true);
+
+  patchRelations(compConfig, opt.relations);
+
+  patchLifecycle(compConfig, opt, rel, true);
+
+  return Component(compConfig);
+}
+
+function page(opt, rel) {
+  if ( opt === void 0 ) opt = {};
+
+  var pageConfig = {
+    externalClasses: opt.externalClasses || [],
+    // support component options property
+    // example: options: {addGlobalClass:true}
+    options: opt.options || {}
+  };
+
+  patchMixins(pageConfig, opt, opt.mixins);
+
+  if (opt.properties) {
+    pageConfig.properties = opt.properties;
+    if (opt.props) {
+      // eslint-disable-next-line
+      console.warn("props will be ignore, if properties is set");
+    }
+  } else if (opt.props) {
+    patchProps(pageConfig, opt.props);
+  }
+
+  patchMethods(pageConfig, opt.methods);
+
+  patchData(pageConfig, opt.data);
+
+  patchLifecycle(pageConfig, opt, rel);
+
+  return Component(pageConfig);
+}
+
+function initGlobalAPI(wepy) {
+  wepy.use = use;
+  wepy.mixin = mixin;
+
+  wepy.set = function(target, key, val) {
+    set.apply(wepy, [undefined, target, key, val]);
+  };
+
+  wepy.delete = del;
+
+  wepy.observe = observe;
+
+  wepy.nextTick = renderNextTick;
+
+  wepy.app = app$1;
+  wepy.page = page;
+  wepy.component = component;
+
+  return wepy;
+}
+
+var wepy = initGlobalAPI(WepyConstructor);
+
+wepy.config = config$1;
+wepy.global = $global;
+wepy.version = "2.0.0-alpha.16";
+
+module.exports = wepy;
diff --git a/packages/core/index.ant.js b/packages/core/index.ant.js
new file mode 100644
index 000000000..0b80f1e6c
--- /dev/null
+++ b/packages/core/index.ant.js
@@ -0,0 +1,3 @@
+import wepy from './ant/wepy';
+
+export default wepy;
diff --git a/packages/core/index.js b/packages/core/index.js
new file mode 100644
index 000000000..63761e1ac
--- /dev/null
+++ b/packages/core/index.js
@@ -0,0 +1,3 @@
+import wepy from './weapp/wepy';
+
+export default wepy;
diff --git a/packages/core/package-lock.json b/packages/core/package-lock.json
new file mode 100644
index 000000000..165fd7a47
--- /dev/null
+++ b/packages/core/package-lock.json
@@ -0,0 +1,1034 @@
+{
+	"name": "@wepy/core",
+	"version": "2.1.0",
+	"lockfileVersion": 1,
+	"requires": true,
+	"dependencies": {
+		"ansi-colors": {
+			"version": "4.1.1",
+			"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+			"integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+			"dev": true
+		},
+		"ansi-regex": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
+			"integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
+			"dev": true
+		},
+		"ansi-styles": {
+			"version": "3.2.1",
+			"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+			"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+			"dev": true,
+			"requires": {
+				"color-convert": "^1.9.0"
+			}
+		},
+		"anymatch": {
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+			"integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+			"dev": true,
+			"requires": {
+				"normalize-path": "^3.0.0",
+				"picomatch": "^2.0.4"
+			}
+		},
+		"argparse": {
+			"version": "1.0.10",
+			"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+			"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+			"dev": true,
+			"requires": {
+				"sprintf-js": "~1.0.2"
+			}
+		},
+		"array.prototype.map": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz",
+			"integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==",
+			"dev": true,
+			"requires": {
+				"define-properties": "^1.1.3",
+				"es-abstract": "^1.17.0-next.1",
+				"es-array-method-boxes-properly": "^1.0.0",
+				"is-string": "^1.0.4"
+			}
+		},
+		"balanced-match": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+			"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+			"dev": true
+		},
+		"binary-extensions": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
+			"integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
+			"dev": true
+		},
+		"brace-expansion": {
+			"version": "1.1.11",
+			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+			"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+			"dev": true,
+			"requires": {
+				"balanced-match": "^1.0.0",
+				"concat-map": "0.0.1"
+			}
+		},
+		"braces": {
+			"version": "3.0.2",
+			"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+			"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+			"dev": true,
+			"requires": {
+				"fill-range": "^7.0.1"
+			}
+		},
+		"browser-stdout": {
+			"version": "1.3.1",
+			"resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+			"integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+			"dev": true
+		},
+		"camelcase": {
+			"version": "5.3.1",
+			"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+			"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+			"dev": true
+		},
+		"chalk": {
+			"version": "2.4.2",
+			"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+			"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+			"dev": true,
+			"requires": {
+				"ansi-styles": "^3.2.1",
+				"escape-string-regexp": "^1.0.5",
+				"supports-color": "^5.3.0"
+			},
+			"dependencies": {
+				"supports-color": {
+					"version": "5.5.0",
+					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+					"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+					"dev": true,
+					"requires": {
+						"has-flag": "^3.0.0"
+					}
+				}
+			}
+		},
+		"chokidar": {
+			"version": "3.3.1",
+			"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz",
+			"integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==",
+			"dev": true,
+			"requires": {
+				"anymatch": "~3.1.1",
+				"braces": "~3.0.2",
+				"fsevents": "~2.1.2",
+				"glob-parent": "~5.1.0",
+				"is-binary-path": "~2.1.0",
+				"is-glob": "~4.0.1",
+				"normalize-path": "~3.0.0",
+				"readdirp": "~3.3.0"
+			}
+		},
+		"cliui": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+			"integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+			"dev": true,
+			"requires": {
+				"string-width": "^3.1.0",
+				"strip-ansi": "^5.2.0",
+				"wrap-ansi": "^5.1.0"
+			},
+			"dependencies": {
+				"ansi-regex": {
+					"version": "4.1.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+					"integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+					"dev": true
+				},
+				"string-width": {
+					"version": "3.1.0",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+					"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+					"dev": true,
+					"requires": {
+						"emoji-regex": "^7.0.1",
+						"is-fullwidth-code-point": "^2.0.0",
+						"strip-ansi": "^5.1.0"
+					}
+				},
+				"strip-ansi": {
+					"version": "5.2.0",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+					"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+					"dev": true,
+					"requires": {
+						"ansi-regex": "^4.1.0"
+					}
+				}
+			}
+		},
+		"color-convert": {
+			"version": "1.9.3",
+			"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+			"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+			"dev": true,
+			"requires": {
+				"color-name": "1.1.3"
+			}
+		},
+		"color-name": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+			"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+			"dev": true
+		},
+		"concat-map": {
+			"version": "0.0.1",
+			"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+			"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+			"dev": true
+		},
+		"debug": {
+			"version": "3.2.6",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+			"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+			"dev": true,
+			"requires": {
+				"ms": "^2.1.1"
+			}
+		},
+		"decamelize": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+			"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+			"dev": true
+		},
+		"define-properties": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+			"integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+			"dev": true,
+			"requires": {
+				"object-keys": "^1.0.12"
+			}
+		},
+		"diff": {
+			"version": "4.0.2",
+			"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+			"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+			"dev": true
+		},
+		"emoji-regex": {
+			"version": "7.0.3",
+			"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+			"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+			"dev": true
+		},
+		"es-abstract": {
+			"version": "1.17.6",
+			"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
+			"integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
+			"dev": true,
+			"requires": {
+				"es-to-primitive": "^1.2.1",
+				"function-bind": "^1.1.1",
+				"has": "^1.0.3",
+				"has-symbols": "^1.0.1",
+				"is-callable": "^1.2.0",
+				"is-regex": "^1.1.0",
+				"object-inspect": "^1.7.0",
+				"object-keys": "^1.1.1",
+				"object.assign": "^4.1.0",
+				"string.prototype.trimend": "^1.0.1",
+				"string.prototype.trimstart": "^1.0.1"
+			}
+		},
+		"es-array-method-boxes-properly": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
+			"integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
+			"dev": true
+		},
+		"es-get-iterator": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz",
+			"integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==",
+			"dev": true,
+			"requires": {
+				"es-abstract": "^1.17.4",
+				"has-symbols": "^1.0.1",
+				"is-arguments": "^1.0.4",
+				"is-map": "^2.0.1",
+				"is-set": "^2.0.1",
+				"is-string": "^1.0.5",
+				"isarray": "^2.0.5"
+			}
+		},
+		"es-to-primitive": {
+			"version": "1.2.1",
+			"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+			"integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+			"dev": true,
+			"requires": {
+				"is-callable": "^1.1.4",
+				"is-date-object": "^1.0.1",
+				"is-symbol": "^1.0.2"
+			}
+		},
+		"escape-string-regexp": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+			"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+			"dev": true
+		},
+		"esm": {
+			"version": "3.2.25",
+			"resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+			"integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
+			"dev": true
+		},
+		"esprima": {
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+			"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+			"dev": true
+		},
+		"fill-range": {
+			"version": "7.0.1",
+			"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+			"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+			"dev": true,
+			"requires": {
+				"to-regex-range": "^5.0.1"
+			}
+		},
+		"find-up": {
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+			"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+			"dev": true,
+			"requires": {
+				"locate-path": "^5.0.0",
+				"path-exists": "^4.0.0"
+			}
+		},
+		"flat": {
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
+			"integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
+			"dev": true,
+			"requires": {
+				"is-buffer": "~2.0.3"
+			}
+		},
+		"fs.realpath": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+			"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+			"dev": true
+		},
+		"fsevents": {
+			"version": "2.1.3",
+			"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+			"integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+			"dev": true,
+			"optional": true
+		},
+		"function-bind": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+			"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+			"dev": true
+		},
+		"get-caller-file": {
+			"version": "2.0.5",
+			"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+			"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+			"dev": true
+		},
+		"glob": {
+			"version": "7.1.6",
+			"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+			"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+			"dev": true,
+			"requires": {
+				"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"
+			}
+		},
+		"glob-parent": {
+			"version": "5.1.2",
+			"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+			"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+			"dev": true,
+			"requires": {
+				"is-glob": "^4.0.1"
+			}
+		},
+		"growl": {
+			"version": "1.10.5",
+			"resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
+			"integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
+			"dev": true
+		},
+		"has": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+			"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+			"dev": true,
+			"requires": {
+				"function-bind": "^1.1.1"
+			}
+		},
+		"has-flag": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+			"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+			"dev": true
+		},
+		"has-symbols": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+			"integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+			"dev": true
+		},
+		"he": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+			"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+			"dev": true
+		},
+		"inflight": {
+			"version": "1.0.6",
+			"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+			"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+			"dev": true,
+			"requires": {
+				"once": "^1.3.0",
+				"wrappy": "1"
+			}
+		},
+		"inherits": {
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+			"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+			"dev": true
+		},
+		"is-arguments": {
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
+			"integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
+			"dev": true
+		},
+		"is-binary-path": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+			"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+			"dev": true,
+			"requires": {
+				"binary-extensions": "^2.0.0"
+			}
+		},
+		"is-buffer": {
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
+			"integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
+			"dev": true
+		},
+		"is-callable": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
+			"integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
+			"dev": true
+		},
+		"is-date-object": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+			"integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+			"dev": true
+		},
+		"is-extglob": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+			"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+			"dev": true
+		},
+		"is-fullwidth-code-point": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+			"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+			"dev": true
+		},
+		"is-glob": {
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+			"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+			"dev": true,
+			"requires": {
+				"is-extglob": "^2.1.1"
+			}
+		},
+		"is-map": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz",
+			"integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==",
+			"dev": true
+		},
+		"is-number": {
+			"version": "7.0.0",
+			"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+			"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+			"dev": true
+		},
+		"is-regex": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz",
+			"integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==",
+			"dev": true,
+			"requires": {
+				"has-symbols": "^1.0.1"
+			}
+		},
+		"is-set": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz",
+			"integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==",
+			"dev": true
+		},
+		"is-string": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
+			"integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
+			"dev": true
+		},
+		"is-symbol": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+			"integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+			"dev": true,
+			"requires": {
+				"has-symbols": "^1.0.1"
+			}
+		},
+		"isarray": {
+			"version": "2.0.5",
+			"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+			"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+			"dev": true
+		},
+		"isexe": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+			"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+			"dev": true
+		},
+		"iterate-iterator": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz",
+			"integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==",
+			"dev": true
+		},
+		"iterate-value": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz",
+			"integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==",
+			"dev": true,
+			"requires": {
+				"es-get-iterator": "^1.0.2",
+				"iterate-iterator": "^1.0.1"
+			}
+		},
+		"js-yaml": {
+			"version": "3.13.1",
+			"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+			"integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+			"dev": true,
+			"requires": {
+				"argparse": "^1.0.7",
+				"esprima": "^4.0.0"
+			}
+		},
+		"locate-path": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+			"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+			"dev": true,
+			"requires": {
+				"p-locate": "^4.1.0"
+			}
+		},
+		"lodash": {
+			"version": "4.17.21",
+			"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+			"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+			"dev": true
+		},
+		"log-symbols": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
+			"integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
+			"dev": true,
+			"requires": {
+				"chalk": "^2.4.2"
+			}
+		},
+		"minimatch": {
+			"version": "3.0.4",
+			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+			"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+			"dev": true,
+			"requires": {
+				"brace-expansion": "^1.1.7"
+			}
+		},
+		"miniprogram-api-typings": {
+			"version": "2.10.3-1",
+			"resolved": "https://registry.npmjs.org/miniprogram-api-typings/-/miniprogram-api-typings-2.10.3-1.tgz",
+			"integrity": "sha512-s5xJzJQMeK2WibXJX/tOG5RqthBE6qXCN1gW/Bk7UQkLzE18+Iws/Lpd9TkH73DEQ/fhLXdJrIJjtTuFDlhT8w=="
+		},
+		"mocha": {
+			"version": "8.0.1",
+			"resolved": "https://registry.npmjs.org/mocha/-/mocha-8.0.1.tgz",
+			"integrity": "sha512-vefaXfdYI8+Yo8nPZQQi0QO2o+5q9UIMX1jZ1XMmK3+4+CQjc7+B0hPdUeglXiTlr8IHMVRo63IhO9Mzt6fxOg==",
+			"dev": true,
+			"requires": {
+				"ansi-colors": "4.1.1",
+				"browser-stdout": "1.3.1",
+				"chokidar": "3.3.1",
+				"debug": "3.2.6",
+				"diff": "4.0.2",
+				"escape-string-regexp": "1.0.5",
+				"find-up": "4.1.0",
+				"glob": "7.1.6",
+				"growl": "1.10.5",
+				"he": "1.2.0",
+				"js-yaml": "3.13.1",
+				"log-symbols": "3.0.0",
+				"minimatch": "3.0.4",
+				"ms": "2.1.2",
+				"object.assign": "4.1.0",
+				"promise.allsettled": "1.0.2",
+				"serialize-javascript": "3.0.0",
+				"strip-json-comments": "3.0.1",
+				"supports-color": "7.1.0",
+				"which": "2.0.2",
+				"wide-align": "1.1.3",
+				"workerpool": "6.0.0",
+				"yargs": "13.3.2",
+				"yargs-parser": "13.1.2",
+				"yargs-unparser": "1.6.0"
+			}
+		},
+		"ms": {
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+			"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+			"dev": true
+		},
+		"normalize-path": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+			"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+			"dev": true
+		},
+		"object-inspect": {
+			"version": "1.8.0",
+			"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+			"integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+			"dev": true
+		},
+		"object-keys": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+			"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+			"dev": true
+		},
+		"object.assign": {
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+			"integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+			"dev": true,
+			"requires": {
+				"define-properties": "^1.1.2",
+				"function-bind": "^1.1.1",
+				"has-symbols": "^1.0.0",
+				"object-keys": "^1.0.11"
+			}
+		},
+		"once": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+			"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+			"dev": true,
+			"requires": {
+				"wrappy": "1"
+			}
+		},
+		"p-limit": {
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+			"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+			"dev": true,
+			"requires": {
+				"p-try": "^2.0.0"
+			}
+		},
+		"p-locate": {
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+			"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+			"dev": true,
+			"requires": {
+				"p-limit": "^2.2.0"
+			}
+		},
+		"p-try": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+			"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+			"dev": true
+		},
+		"path-exists": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+			"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+			"dev": true
+		},
+		"path-is-absolute": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+			"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+			"dev": true
+		},
+		"picomatch": {
+			"version": "2.2.2",
+			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+			"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+			"dev": true
+		},
+		"promise.allsettled": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz",
+			"integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==",
+			"dev": true,
+			"requires": {
+				"array.prototype.map": "^1.0.1",
+				"define-properties": "^1.1.3",
+				"es-abstract": "^1.17.0-next.1",
+				"function-bind": "^1.1.1",
+				"iterate-value": "^1.0.0"
+			}
+		},
+		"readdirp": {
+			"version": "3.3.0",
+			"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz",
+			"integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==",
+			"dev": true,
+			"requires": {
+				"picomatch": "^2.0.7"
+			}
+		},
+		"require-directory": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+			"integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+			"dev": true
+		},
+		"require-main-filename": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+			"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+			"dev": true
+		},
+		"serialize-javascript": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.0.0.tgz",
+			"integrity": "sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==",
+			"dev": true
+		},
+		"set-blocking": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+			"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+			"dev": true
+		},
+		"sprintf-js": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+			"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+			"dev": true
+		},
+		"string-width": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+			"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+			"dev": true,
+			"requires": {
+				"is-fullwidth-code-point": "^2.0.0",
+				"strip-ansi": "^4.0.0"
+			}
+		},
+		"string.prototype.trimend": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
+			"integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
+			"dev": true,
+			"requires": {
+				"define-properties": "^1.1.3",
+				"es-abstract": "^1.17.5"
+			}
+		},
+		"string.prototype.trimstart": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
+			"integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
+			"dev": true,
+			"requires": {
+				"define-properties": "^1.1.3",
+				"es-abstract": "^1.17.5"
+			}
+		},
+		"strip-ansi": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+			"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+			"dev": true,
+			"requires": {
+				"ansi-regex": "^3.0.0"
+			}
+		},
+		"strip-json-comments": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
+			"integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==",
+			"dev": true
+		},
+		"supports-color": {
+			"version": "7.1.0",
+			"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+			"integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+			"dev": true,
+			"requires": {
+				"has-flag": "^4.0.0"
+			},
+			"dependencies": {
+				"has-flag": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+					"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+					"dev": true
+				}
+			}
+		},
+		"to-regex-range": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+			"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+			"dev": true,
+			"requires": {
+				"is-number": "^7.0.0"
+			}
+		},
+		"typescript": {
+			"version": "3.8.3",
+			"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz",
+			"integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==",
+			"dev": true
+		},
+		"which": {
+			"version": "2.0.2",
+			"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+			"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+			"dev": true,
+			"requires": {
+				"isexe": "^2.0.0"
+			}
+		},
+		"which-module": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+			"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+			"dev": true
+		},
+		"wide-align": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+			"integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+			"dev": true,
+			"requires": {
+				"string-width": "^1.0.2 || 2"
+			}
+		},
+		"workerpool": {
+			"version": "6.0.0",
+			"resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz",
+			"integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==",
+			"dev": true
+		},
+		"wrap-ansi": {
+			"version": "5.1.0",
+			"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+			"integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+			"dev": true,
+			"requires": {
+				"ansi-styles": "^3.2.0",
+				"string-width": "^3.0.0",
+				"strip-ansi": "^5.0.0"
+			},
+			"dependencies": {
+				"ansi-regex": {
+					"version": "4.1.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+					"integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+					"dev": true
+				},
+				"string-width": {
+					"version": "3.1.0",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+					"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+					"dev": true,
+					"requires": {
+						"emoji-regex": "^7.0.1",
+						"is-fullwidth-code-point": "^2.0.0",
+						"strip-ansi": "^5.1.0"
+					}
+				},
+				"strip-ansi": {
+					"version": "5.2.0",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+					"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+					"dev": true,
+					"requires": {
+						"ansi-regex": "^4.1.0"
+					}
+				}
+			}
+		},
+		"wrappy": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+			"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+			"dev": true
+		},
+		"y18n": {
+			"version": "4.0.3",
+			"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+			"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+			"dev": true
+		},
+		"yargs": {
+			"version": "13.3.2",
+			"resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+			"integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+			"dev": true,
+			"requires": {
+				"cliui": "^5.0.0",
+				"find-up": "^3.0.0",
+				"get-caller-file": "^2.0.1",
+				"require-directory": "^2.1.1",
+				"require-main-filename": "^2.0.0",
+				"set-blocking": "^2.0.0",
+				"string-width": "^3.0.0",
+				"which-module": "^2.0.0",
+				"y18n": "^4.0.0",
+				"yargs-parser": "^13.1.2"
+			},
+			"dependencies": {
+				"ansi-regex": {
+					"version": "4.1.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+					"integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+					"dev": true
+				},
+				"find-up": {
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+					"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+					"dev": true,
+					"requires": {
+						"locate-path": "^3.0.0"
+					}
+				},
+				"locate-path": {
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+					"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+					"dev": true,
+					"requires": {
+						"p-locate": "^3.0.0",
+						"path-exists": "^3.0.0"
+					}
+				},
+				"p-locate": {
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+					"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+					"dev": true,
+					"requires": {
+						"p-limit": "^2.0.0"
+					}
+				},
+				"path-exists": {
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+					"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+					"dev": true
+				},
+				"string-width": {
+					"version": "3.1.0",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+					"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+					"dev": true,
+					"requires": {
+						"emoji-regex": "^7.0.1",
+						"is-fullwidth-code-point": "^2.0.0",
+						"strip-ansi": "^5.1.0"
+					}
+				},
+				"strip-ansi": {
+					"version": "5.2.0",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+					"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+					"dev": true,
+					"requires": {
+						"ansi-regex": "^4.1.0"
+					}
+				}
+			}
+		},
+		"yargs-parser": {
+			"version": "13.1.2",
+			"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+			"integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+			"dev": true,
+			"requires": {
+				"camelcase": "^5.0.0",
+				"decamelize": "^1.2.0"
+			}
+		},
+		"yargs-unparser": {
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
+			"integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
+			"dev": true,
+			"requires": {
+				"flat": "^4.1.0",
+				"lodash": "^4.17.15",
+				"yargs": "^13.3.0"
+			}
+		}
+	}
+}
diff --git a/packages/core/package.json b/packages/core/package.json
new file mode 100644
index 000000000..7e1f5f7cd
--- /dev/null
+++ b/packages/core/package.json
@@ -0,0 +1,27 @@
+{
+  "name": "@wepy/core",
+  "version": "2.1.0",
+  "main": "./dist/wepy.js",
+  "typings": "types/index.d.ts",
+  "scripts": {
+    "test:types": "tsc -p ./types/test/tsconfig.json",
+    "test": "_mocha --require esm --recursive"
+  },
+  "esm": {
+    "cjs": true
+  },
+  "author": "",
+  "license": "MIT",
+  "readme": "ERROR: No README data found!",
+  "_id": "@wepy/core@2.0.0-alpha.16",
+  "_commitid": "a78dcb6",
+  "devDependencies": {
+    "esm": "^3.2.25",
+    "mocha": "^8.0.1",
+    "typescript": "^3.3.3"
+  },
+  "dependencies": {
+    "miniprogram-api-typings": "^2.10.3-1"
+  },
+  "gitHead": "5a25776457360bbbbc54a4d059f6bc7c032d5df3"
+}
diff --git a/packages/core/shared/constants.js b/packages/core/shared/constants.js
new file mode 100644
index 000000000..eb0ebf5d6
--- /dev/null
+++ b/packages/core/shared/constants.js
@@ -0,0 +1,35 @@
+export const WEAPP_APP_LIFECYCLE = [
+  'onLaunch',
+  'onShow',
+  'onHide',
+  'onError',
+  'onPageNotFound',
+  'onUnhandledRejection',
+  'onThemeChange'
+];
+
+export const WEAPP_PAGE_LIFECYCLE = [
+  'onLoad',
+  'onShow',
+  'onReady',
+  'onHide',
+  'onUnload',
+  'onPullDownRefresh',
+  'onReachBottom',
+  'onShareAppMessage',
+  'onAddToFavorites',
+  'onPageScroll',
+  'onResize',
+  'onTabItemTap',
+  'onShareTimeline'
+];
+
+export const WEAPP_COMPONENT_LIFECYCLE = ['beforeCreate', 'created', 'attached', 'ready', 'moved', 'detached', 'error'];
+
+export const WEAPP_COMPONENT_PAGE_LIFECYCLE = ['show', 'hide', 'resize'];
+
+export const WEAPP_LIFECYCLE = []
+  .concat(WEAPP_APP_LIFECYCLE)
+  .concat(WEAPP_PAGE_LIFECYCLE)
+  .concat(WEAPP_COMPONENT_LIFECYCLE)
+  .concat(WEAPP_COMPONENT_PAGE_LIFECYCLE);
diff --git a/packages/core/shared/env.js b/packages/core/shared/env.js
new file mode 100644
index 000000000..81ec74f6d
--- /dev/null
+++ b/packages/core/shared/env.js
@@ -0,0 +1,41 @@
+// can we use __proto__?
+function getHasProto() {
+  let hasProto = false;
+  if ('__proto__' in {}) {
+    const fn = () => {};
+    const arr = [];
+    arr.__proto__ = { push: fn };
+    hasProto = fn === arr.push;
+  }
+  return hasProto;
+}
+export const hasProto = getHasProto();
+
+let _Set; // $flow-disable-line
+/* istanbul ignore if */ if (typeof Set !== 'undefined' && isNative(Set)) {
+  // use native Set when available.
+  _Set = Set;
+} else {
+  // a non-standard Set polyfill that only works with primitive keys.
+  _Set = class Set {
+    constructor() {
+      this.set = Object.create(null);
+    }
+    has(key) {
+      return this.set[key] === true;
+    }
+    add(key) {
+      this.set[key] = true;
+    }
+    clear() {
+      this.set = Object.create(null);
+    }
+  };
+}
+
+export { _Set };
+
+/* istanbul ignore next */
+export function isNative(Ctor) {
+  return typeof Ctor === 'function' && /native code/.test(Ctor.toString());
+}
diff --git a/packages/core/shared/extend.js b/packages/core/shared/extend.js
new file mode 100644
index 000000000..85e405d98
--- /dev/null
+++ b/packages/core/shared/extend.js
@@ -0,0 +1,95 @@
+import { isPlainObject, isArr } from './util';
+
+/*
+ * extend objects
+ * e.g.
+ * extend({}, {a: 1}) : extend {a: 1} to {}
+ * extend(true, [], [1,2,3]) : deep extend [1,2,3] to an empty array
+ * extend(true, {}, {a: 1}, {b: 2}) : deep extend two objects to {}
+ */
+export function extend() {
+  let options,
+    name,
+    src,
+    copy,
+    copyIsArray,
+    clone,
+    target = arguments[0] || {},
+    i = 1,
+    length = arguments.length,
+    deep = false;
+
+  // Handle a deep copy situation
+  if (typeof target === 'boolean') {
+    deep = target;
+
+    // Skip the boolean and the target
+    target = arguments[i] || {};
+    i++;
+  }
+
+  // Handle case when target is a string or something (possible in deep copy)
+  if (typeof target !== 'object' && !(typeof target === 'function')) {
+    target = {};
+  }
+
+  // Extend jQuery itself if only one argument is passed
+  if (i === length) {
+    target = this;
+    i--;
+  }
+
+  for (; i < length; i++) {
+    // Only deal with non-null/undefined values
+    if ((options = arguments[i])) {
+      // Extend the base object
+      for (name in options) {
+        src = target[name];
+        copy = options[name];
+
+        // Prevent never-ending loop
+        if (target === copy) {
+          continue;
+        }
+
+        // Recurse if we're merging plain objects or arrays
+        if (deep && copy && (isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) {
+          if (copyIsArray) {
+            copyIsArray = false;
+            clone = src && Array.isArray(src) ? src : [];
+          } else {
+            clone = src && isPlainObject(src) ? src : {};
+          }
+
+          // Never move original objects, clone them
+          target[name] = extend(deep, clone, copy);
+
+          // Don't bring in undefined values => bring undefined values
+        } else {
+          target[name] = copy;
+        }
+      }
+    }
+  }
+
+  // Return the modified object
+  return target;
+}
+
+/*
+ * clone objects, return a cloned object default to use deep clone
+ * e.g.
+ * clone({a: 1})
+ * clone({a: b: {c : 1}}, false);
+ */
+export function clone(sth, deep = true) {
+  if (isArr(sth)) {
+    return extend(deep, [], sth);
+  } else if ('' + sth === 'null') {
+    return sth;
+  } else if (isPlainObject(sth)) {
+    return extend(deep, {}, sth);
+  } else {
+    return sth;
+  }
+}
diff --git a/packages/core/shared/index.js b/packages/core/shared/index.js
new file mode 100644
index 000000000..4af49cc4e
--- /dev/null
+++ b/packages/core/shared/index.js
@@ -0,0 +1,4 @@
+export * from './env';
+export * from './util';
+export * from './extend';
+export * from './constants';
diff --git a/packages/core/shared/util.js b/packages/core/shared/util.js
new file mode 100644
index 000000000..24b4fdd07
--- /dev/null
+++ b/packages/core/shared/util.js
@@ -0,0 +1,102 @@
+/**
+ * String type check
+ */
+export const isStr = v => typeof v === 'string';
+/**
+ * Number type check
+ */
+export const isNum = v => typeof v === 'number';
+/**
+ * Array type check
+ */
+export const isArr = Array.isArray;
+/**
+ * undefined type check
+ */
+export const isUndef = v => v === undefined;
+/**
+ * Function type check
+ */
+export const isFunc = v => typeof v === 'function';
+/**
+ * Quick object check - this is primarily used to tell
+ * Objects from primitive values when we know the value
+ * is a JSON-compliant type.
+ */
+export function isObject(obj) {
+  return obj !== null && typeof obj === 'object';
+}
+
+export const isObj = isObject;
+/**
+ * Strict object type check. Only returns true
+ * for plain JavaScript objects.
+ */
+const _toString = Object.prototype.toString;
+export function isPlainObject(obj) {
+  return _toString.call(obj) === '[object Object]';
+}
+
+/**
+ * Check whether the object has the property.
+ */
+const hasOwnProperty = Object.prototype.hasOwnProperty;
+export function hasOwn(obj, key) {
+  return hasOwnProperty.call(obj, key);
+}
+
+/**
+ * Perform no operation.
+ * Stubbing args to make Flow happy without leaving useless transpiled code
+ * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/)
+ */
+// eslint-disable-next-line
+export function noop(a, b, c) {}
+
+/**
+ * Check if val is a valid array index.
+ */
+export function isValidArrayIndex(val) {
+  const n = parseFloat(String(val));
+  return n >= 0 && Math.floor(n) === n && isFinite(val);
+}
+
+/**
+ * Convert an Array-lik object to a real Array
+ */
+export function toArray(list, start = 0) {
+  let i = list.length - start;
+  let rst = new Array(i);
+  while (i--) {
+    rst[i] = list[i + start];
+  }
+  return rst;
+}
+
+/**
+ * Cached simply key function return
+ */
+export const cached = fn => {
+  let cache = {};
+  return str => cache[str] || (cache[str] = fn(str));
+};
+
+const camelizeRE = /-(\w)/g;
+const hyphenateRE = /([^-])([A-Z])/g;
+
+/**
+ * hyphenate words
+ * e.g. myKey => my-key
+ */
+export const hyphenate = cached(str =>
+  str
+    .replace(hyphenateRE, '$1-$2')
+    .replace(hyphenateRE, '$1-$2')
+    .toLowerCase()
+);
+
+/**
+ * camelize words
+ * e.g. my-key => myKey
+ */
+export const camelize = cached(str => str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : '')));
diff --git a/packages/core/src/bar.js b/packages/core/src/bar.js
new file mode 100644
index 000000000..65ad02fcd
--- /dev/null
+++ b/packages/core/src/bar.js
@@ -0,0 +1,5 @@
+const bar = num => {
+  return num - 1;
+};
+
+export { bar };
diff --git a/packages/core/src/foo.js b/packages/core/src/foo.js
new file mode 100644
index 000000000..588748d32
--- /dev/null
+++ b/packages/core/src/foo.js
@@ -0,0 +1,11 @@
+import { bar } from './bar';
+
+const foo = num => {
+  return num + 1;
+};
+
+const foobar = num => {
+  return foo(bar(num));
+};
+
+export { foo, foobar };
diff --git a/packages/core/src/index.js b/packages/core/src/index.js
new file mode 100644
index 000000000..de89f2b76
--- /dev/null
+++ b/packages/core/src/index.js
@@ -0,0 +1 @@
+export { foo } from './foo';
diff --git a/packages/core/test/.istanbul.yml b/packages/core/test/.istanbul.yml
new file mode 100644
index 000000000..e69de29bb
diff --git a/packages/core/test/bar.spec.js b/packages/core/test/bar.spec.js
new file mode 100644
index 000000000..4531b9d1b
--- /dev/null
+++ b/packages/core/test/bar.spec.js
@@ -0,0 +1,11 @@
+import { bar } from '../src/bar';
+
+import { expect } from 'chai';
+
+describe('bar', function() {
+  describe('bar()', function() {
+    it('should return number minus one', function() {
+      expect(bar(1)).to.equal(0);
+    });
+  });
+});
diff --git a/packages/core/test/foo.spec.js b/packages/core/test/foo.spec.js
new file mode 100644
index 000000000..ea663b7ea
--- /dev/null
+++ b/packages/core/test/foo.spec.js
@@ -0,0 +1,17 @@
+import { foo, foobar } from '../src/foo';
+
+import { expect } from 'chai';
+
+describe('foo', function() {
+  describe('foo()', function() {
+    it('should return number plus one', function() {
+      expect(foo(1)).to.equal(2);
+    });
+  });
+
+  describe('foobar()', function() {
+    it('should return same number', function() {
+      expect(foobar(1)).to.equal(1);
+    });
+  });
+});
diff --git a/packages/core/test/index.test.js b/packages/core/test/index.test.js
new file mode 100644
index 000000000..e69de29bb
diff --git a/packages/core/test/mock/api/createSelectorQuery.js b/packages/core/test/mock/api/createSelectorQuery.js
new file mode 100644
index 000000000..eba4262fe
--- /dev/null
+++ b/packages/core/test/mock/api/createSelectorQuery.js
@@ -0,0 +1,10 @@
+module.exports = function createSelectorQuery() {
+  return {
+    query(selector) {
+      return {
+        mock: true,
+        selector
+      };
+    }
+  };
+};
diff --git a/packages/core/test/mock/wxapi.js b/packages/core/test/mock/wxapi.js
new file mode 100644
index 000000000..0ea59c204
--- /dev/null
+++ b/packages/core/test/mock/wxapi.js
@@ -0,0 +1,39 @@
+const fs = require('fs');
+const path = require('path');
+
+class MockWxAPI {
+  constructor() {
+    this._wx = {};
+    this.init();
+  }
+
+  init() {
+    const files = fs.readdirSync(path.join(__dirname, 'api'));
+    files.forEach(file => {
+      const api = file.replace('.js', '');
+      this._wx[api] = require('./api/' + api);
+    });
+    return this;
+  }
+
+  mock(api, fn) {
+    if (arguments.length === 2) {
+      this._wx[api] = fn;
+    }
+    global.wx = this._wx;
+    return this;
+  }
+
+  unmock(api) {
+    if (api) {
+      delete this._wx[api];
+      global.wx = this._wx;
+    } else {
+      this._wx = {};
+      delete global.wx;
+    }
+    return this;
+  }
+}
+
+module.exports = MockWxAPI;
diff --git a/packages/core/test/weapp/class/Dirty.js b/packages/core/test/weapp/class/Dirty.js
new file mode 100644
index 000000000..3ed7f28a3
--- /dev/null
+++ b/packages/core/test/weapp/class/Dirty.js
@@ -0,0 +1,74 @@
+import { initData } from '../../../weapp/init/data';
+import Dirty from '../../../weapp/class/Dirty';
+
+const expect = require('chai').expect;
+
+describe('weapp class Dirty', function() {
+  it('test dirty path', () => {
+    const vm = {};
+    vm.$dirty = new Dirty('path');
+
+    initData(vm, { list: [], num: 1, arr: [1, 2], complex: { a: 1, arr: [100, { x: [0, 1, { b: 1 }] }] } });
+
+    vm.num = 2;
+    expect(vm.$dirty.length()).to.be.equal(1);
+
+    let dirty;
+
+    dirty = vm.$dirty.pop();
+    expect(vm.$dirty.length()).to.be.equal(0);
+    expect(dirty).to.deep.equal({ num: 2 });
+
+    vm.num = 100;
+    vm.complex.arr[1].x[2].b = 2;
+
+    expect(vm.$dirty.length()).to.be.equal(2);
+    dirty = vm.$dirty.pop();
+    expect(vm.$dirty.length()).to.be.equal(0);
+    expect(dirty).to.be.deep.equal({ num: 100, 'complex.arr[1].x[2].b': 2 });
+
+    vm.list.push({ a: 1 });
+    dirty = vm.$dirty.pop();
+    expect(JSON.stringify(dirty)).to.be.equal('{"list[0]":{"a":1}}');
+
+    vm.list.push({ b: 1 });
+    dirty = vm.$dirty.pop();
+    expect(JSON.stringify(dirty)).to.be.equal('{"list[1]":{"b":1}}');
+
+    vm.complex.arr.push(200);
+    expect(vm.$dirty.length()).to.be.equal(1);
+    dirty = vm.$dirty.pop();
+    expect(vm.$dirty.length()).to.be.equal(0);
+    expect(dirty).to.be.deep.equal({ 'complex.arr[2]': 200 });
+
+    vm.complex.arr.splice(1, 1, 233);
+    expect(vm.$dirty.length()).to.be.equal(1);
+    dirty = vm.$dirty.pop();
+    expect(vm.$dirty.length()).to.be.equal(0);
+    expect(dirty).to.be.deep.equal({ 'complex.arr': [100, 233, 200] });
+  });
+
+  it('test dirty key', () => {
+    const vm = {};
+    vm.$dirty = new Dirty('key');
+
+    initData(vm, { num: 1, arr: [1, 2], complex: { a: 1, arr: [100, { x: [0, 1, { b: 1 }] }] } });
+
+    vm.num = 2;
+    expect(vm.$dirty.length()).to.be.equal(1);
+
+    let dirty;
+
+    dirty = vm.$dirty.pop();
+    expect(vm.$dirty.length()).to.be.equal(0);
+    expect(dirty).to.deep.equal({ num: 2 });
+
+    vm.num = 100;
+    vm.complex.arr[1].x[2].b = 2;
+
+    expect(vm.$dirty.length()).to.be.equal(2);
+    dirty = vm.$dirty.pop();
+    expect(vm.$dirty.length()).to.be.equal(0);
+    expect(dirty).to.be.deep.equal({ num: 100, complex: vm.complex });
+  });
+});
diff --git a/packages/core/test/weapp/dispatcher/index.test.js b/packages/core/test/weapp/dispatcher/index.test.js
new file mode 100644
index 000000000..a54a15d31
--- /dev/null
+++ b/packages/core/test/weapp/dispatcher/index.test.js
@@ -0,0 +1,21 @@
+import { expect } from 'chai';
+import { dispatcher } from '../../../weapp/dispatcher/index';
+import { addEventListener, createOriginalPage, simulateOriginalWePYEvent } from '../helper/index';
+
+describe('weapp dispatcher', function() {
+  it('Create Page', done => {
+    const page = createOriginalPage();
+
+    const params = [1, 2];
+
+    const evtid = addEventListener(page, 'tap', function(...args) {
+      expect(args[0]).is.equal(params[0]);
+      expect(args[1]).is.equal(params[1]);
+      expect(args[2].type).is.equal('tap');
+      done();
+    });
+
+    const e = simulateOriginalWePYEvent('tap', evtid, params);
+    dispatcher.call(page, e);
+  });
+});
diff --git a/packages/core/test/weapp/helper/index.js b/packages/core/test/weapp/helper/index.js
new file mode 100644
index 000000000..871ffc55a
--- /dev/null
+++ b/packages/core/test/weapp/helper/index.js
@@ -0,0 +1,77 @@
+import Page from './libs/Page';
+import WepyPage from '../../../weapp/class/WepyPage';
+import WepyApp from '../../../weapp/class/WepyApp';
+
+export function createApp(opt = {}) {
+  const wepyApp = new WepyApp(opt);
+  wepyApp.hooks = {};
+  return wepyApp;
+}
+export function createPage(opt = {}) {
+  const wepy = new WepyPage(opt);
+  wepy.__pageid = 1;
+  wepy.__events = 0;
+
+  wepy.$app = createApp({});
+  return wepy;
+}
+
+export function createOriginalApp(opt) {
+  const app = new App();
+  const wepyApp = createApp(opt);
+  app.$wepy = wepyApp;
+  return app;
+}
+
+export function createOriginalPage(opt) {
+  const wepy = createPage(opt);
+  const page = new Page();
+  page.$wepy = wepy;
+
+  return page;
+}
+
+export function simulateOriginalEvent(type, opt) {
+  if (!opt) {
+    opt = {};
+  }
+  if (!opt.currentTarget || !opt.currentTarget.dataset) {
+    opt.currentTarget = {
+      dataset: {}
+    };
+  }
+  if (!opt.detail) {
+    opt.detail = {};
+  }
+  opt.type = type;
+  return opt;
+}
+
+export function simulateOriginalWePYEvent(type, evtid, params) {
+  const e = simulateOriginalEvent(type);
+
+  params.forEach((p, i) => {
+    const key = 'wpy' + type.toLowerCase() + String.fromCharCode(97 + i).toUpperCase();
+    e.currentTarget.dataset[key] = p;
+  });
+
+  e.currentTarget.dataset.wpyEvt = evtid;
+  return e;
+}
+
+export function addEventListener(comp, type, handler) {
+  const wepy = comp.$wepy;
+  wepy.__events++;
+  const evtid = wepy.__pageid + '-' + wepy.__events;
+
+  if (!wepy.$rel) {
+    wepy.$rel = { handlers: {} };
+  }
+
+  const handlers = wepy.$rel.handlers;
+  if (!handlers[evtid]) {
+    handlers[evtid] = {};
+  }
+  handlers[evtid][type] = handler;
+  return evtid;
+}
diff --git a/packages/core/test/weapp/helper/libs/App.js b/packages/core/test/weapp/helper/libs/App.js
new file mode 100644
index 000000000..947f2d867
--- /dev/null
+++ b/packages/core/test/weapp/helper/libs/App.js
@@ -0,0 +1 @@
+export default class App {}
diff --git a/packages/core/test/weapp/helper/libs/Component.js b/packages/core/test/weapp/helper/libs/Component.js
new file mode 100644
index 000000000..e3c3f53ab
--- /dev/null
+++ b/packages/core/test/weapp/helper/libs/Component.js
@@ -0,0 +1,3 @@
+export default class Page {
+  setData() {}
+}
diff --git a/packages/core/test/weapp/helper/libs/Page.js b/packages/core/test/weapp/helper/libs/Page.js
new file mode 100644
index 000000000..e3c3f53ab
--- /dev/null
+++ b/packages/core/test/weapp/helper/libs/Page.js
@@ -0,0 +1,3 @@
+export default class Page {
+  setData() {}
+}
diff --git a/packages/core/test/weapp/init/data.js b/packages/core/test/weapp/init/data.js
new file mode 100644
index 000000000..2dc7077b9
--- /dev/null
+++ b/packages/core/test/weapp/init/data.js
@@ -0,0 +1,43 @@
+import { patchData, initData } from '../../../weapp/init/data';
+
+const expect = require('chai').expect;
+
+describe('weapp init data', function() {
+  it('patch data', () => {
+    const output = {};
+
+    patchData(output, false);
+
+    expect(output.data).to.be.an('object');
+
+    patchData(output, { a: 1 });
+
+    expect(output.data.a).to.equal(1);
+  });
+
+  it('init data', () => {
+    const vm = {};
+
+    initData(vm, { num: 1, str: 'string', arr: [1, 2], obj: { a: 1 }, deepobj: { node: { a: 1 } } });
+
+    expect(vm.num).to.be.equal(vm._data.num);
+    expect(vm.str).to.be.equal(vm._data.str);
+    expect(vm.arr).to.be.equal(vm._data.arr);
+    expect(vm.obj).to.be.equal(vm._data.obj);
+    expect(vm.deepobj).to.be.equal(vm._data.deepobj);
+    expect(vm.obj.__ob__).to.be.an('object');
+    expect(vm.deepobj.node.__ob__).to.be.an('object');
+  });
+
+  it('init data from function', () => {
+    const vm = {};
+
+    initData(vm, function() {
+      return {
+        a: 1
+      };
+    });
+
+    expect(vm.a).to.be.equal(1);
+  });
+});
diff --git a/packages/core/test/weapp/init/lifecycle.test.js b/packages/core/test/weapp/init/lifecycle.test.js
new file mode 100644
index 000000000..f16443aa7
--- /dev/null
+++ b/packages/core/test/weapp/init/lifecycle.test.js
@@ -0,0 +1,183 @@
+const expect = require('chai').expect;
+import { getLifeCycle, patchAppLifecycle, patchLifecycle } from '../../../weapp/init';
+import { WEAPP_APP_LIFECYCLE } from '../../../shared';
+
+import MockWxAPI from '../../mock/wxapi';
+
+const mockapi = new MockWxAPI();
+
+const allPages = [];
+const pageIndex = -1;
+
+describe('weapp life cycles', () => {
+  before(() => {
+    mockapi.mock();
+
+    global.getCurrentPages = function() {
+      return allPages;
+    };
+  });
+  after(() => {
+    mockapi.unmock();
+  });
+
+  it('should add wepy.app life cycles for string', () => {
+    const rel = {
+      lifecycle: {
+        app: 'onSomeNewFeature'
+      }
+    };
+    const lifeCycles = getLifeCycle(WEAPP_APP_LIFECYCLE, rel, 'app');
+    expect(lifeCycles).to.deep.equal([...WEAPP_APP_LIFECYCLE, 'onSomeNewFeature']);
+  });
+
+  it('should add wepy.app life cycles for array', () => {
+    const rel = {
+      lifecycle: {
+        app: ['onSomeNewFeature1', 'onSomeNewFeature2']
+      }
+    };
+    const lifeCycles = getLifeCycle(WEAPP_APP_LIFECYCLE, rel, 'app');
+    expect(lifeCycles).to.deep.equal([...WEAPP_APP_LIFECYCLE, 'onSomeNewFeature1', 'onSomeNewFeature2']);
+  });
+
+  it('should modify wepy.app life cycles for function', () => {
+    const rel = {
+      lifecycle: {
+        app: function(lifecycles) {
+          const newLifeCycles = lifecycles.filter(l => l !== 'onError');
+          return [...newLifeCycles, 'onSomeNewFeature'];
+        }
+      }
+    };
+    const lifeCycles = getLifeCycle(WEAPP_APP_LIFECYCLE, rel, 'app');
+    expect(lifeCycles).to.deep.equal([...WEAPP_APP_LIFECYCLE.filter(l => l !== 'onError'), 'onSomeNewFeature']);
+  });
+
+  it('patchAppLifecycle', () => {
+    const runState = {
+      onLaunch1: false,
+      onLaunch2: false,
+      onShow: false
+    };
+    const appInstance = {};
+    const appConfig = {};
+    const options = {
+      onShow() {
+        runState.onShow = true;
+      },
+      onLaunch: [
+        () => {
+          runState.onLaunch1 = true;
+        },
+        () => {
+          runState.onLaunch2 = true;
+        }
+      ]
+    };
+    const rel = {};
+
+    patchAppLifecycle(appConfig, options, rel);
+
+    expect(appConfig.onLaunch).is.a('function');
+    expect(appConfig.onShow).is.a('function');
+
+    expect(appConfig.onError).is.a('undefined');
+
+    appConfig.onLaunch.call(appInstance);
+
+    appConfig.onShow.call(appInstance);
+
+    for (const k in runState) {
+      expect(runState[k]).to.be.equal(true);
+    }
+  });
+
+  it('patchLifecycle componennt', () => {
+    const runState = {
+      ready: false
+    };
+    const compInstance = {};
+    const output = { methods: {} };
+    const options = {
+      ready() {
+        runState.ready = true;
+      }
+    };
+    const rel = {};
+
+    patchLifecycle(output, options, rel, true);
+
+    expect(output.created).is.a('function');
+
+    output.created.call(compInstance);
+
+    output.ready.call(compInstance);
+
+    expect(runState.ready).to.equal(true);
+  });
+
+  it('patchLifecycle page', () => {
+    const runState = {
+      routed: false,
+      testPageRouted: false
+    };
+    const indexPage = {
+      is: 'somepage',
+      route: 'pages/index',
+      __wxExparserNodeId__: '29d1dad1',
+      __wxWebviewId__: 1
+    };
+    const output = { methods: {} };
+    const options = {
+      routed(oldRoute, newRoute) {
+        expect(oldRoute).to.equal(null);
+        expect(newRoute.path).to.equal(indexPage.route);
+        runState.routed = true;
+      }
+    };
+    const rel = {};
+
+    patchLifecycle(output, options, rel, false);
+
+    expect(output.created).is.a('function');
+    expect(output.attached).is.a('function');
+
+    output.created.call(indexPage);
+    output.attached.call(indexPage);
+
+    allPages.push(indexPage);
+
+    output.methods.onShow.call(indexPage);
+
+    expect(runState.routed).to.equal(true);
+
+    const testPage = {
+      is: 'testpage',
+      route: 'pages/test',
+      __wxExparserNodeId__: '29d2dad2',
+      __wxWebviewId__: 2
+    };
+    const testOutput = { methods: {} };
+    const testOutputOptions = {
+      routed(oldRoute, newRoute) {
+        expect(oldRoute.path).to.equal(indexPage.route);
+        expect(newRoute.path).to.equal(testPage.route);
+        runState.testPageRouted = true;
+      }
+    };
+
+    patchLifecycle(testOutput, testOutputOptions, rel, false);
+
+    testOutput.created.call(testPage);
+    testOutput.attached.call(testPage);
+
+    allPages.push(testPage);
+
+    testOutput.methods.onShow.call(testPage);
+
+    for (const k in runState) {
+      expect(runState[k]).to.be.equal(true);
+    }
+  });
+});
diff --git a/packages/core/test/weapp/observer/index.test.js b/packages/core/test/weapp/observer/index.test.js
new file mode 100644
index 000000000..e69de29bb
diff --git a/packages/core/test/weapp/observer/observerPath.test.js b/packages/core/test/weapp/observer/observerPath.test.js
new file mode 100644
index 000000000..c2665e48e
--- /dev/null
+++ b/packages/core/test/weapp/observer/observerPath.test.js
@@ -0,0 +1,131 @@
+import { initData } from '../../../weapp/init/data';
+import { set } from '../../../weapp/observer';
+import { getPathMap } from '../../../weapp/observer/observerPath';
+
+const expect = require('chai').expect;
+const _getPathMap = (obj, key) =>
+  key !== undefined
+    ? getPathMap(key, obj.__ob__.op.pathKeys, obj.__ob__.op.pathMap).combinePathMap
+    : obj.__ob__.op.pathMap;
+
+describe('weapp observer observerPath', function() {
+  it('only path', function() {
+    const vm = {};
+
+    initData(vm, { num: 1, str: 'string', arr: [1, 2], obj: { a: 1 }, deepObj: { node: { a: 1 } } });
+
+    const data = vm._data;
+    expect(_getPathMap(data, 'num')).to.be.deep.equal({ num: { key: 'num', root: 'num', path: 'num' } });
+    expect(_getPathMap(data, 'str')).to.be.deep.equal({ str: { key: 'str', root: 'str', path: 'str' } });
+    expect(_getPathMap(data, 'arr')).to.be.deep.equal({ arr: { key: 'arr', root: 'arr', path: 'arr' } });
+    expect(_getPathMap(data, 'obj')).to.be.deep.equal({ obj: { key: 'obj', root: 'obj', path: 'obj' } });
+    expect(_getPathMap(data, 'deepObj')).to.be.deep.equal({
+      deepObj: {
+        key: 'deepObj',
+        root: 'deepObj',
+        path: 'deepObj'
+      }
+    });
+  });
+
+  it('only deep path', function() {
+    const vm = {};
+
+    initData(vm, { arr: [1, 2], obj: { a: 1 }, deepObj: { node: { a: 1 } } });
+
+    const data = vm._data;
+    expect(_getPathMap(data.arr, 0)).to.be.deep.equal({ 'arr[0]': { key: 0, root: 'arr', path: 'arr[0]' } });
+    expect(_getPathMap(data.obj, 'a')).to.be.deep.equal({ 'obj.a': { key: 'a', root: 'obj', path: 'obj.a' } });
+    expect(_getPathMap(data.deepObj.node, 'a')).to.be.deep.equal({
+      'deepObj.node.a': { key: 'a', root: 'deepObj', path: 'deepObj.node.a' }
+    });
+
+    set(vm, vm.deepObj, 'parent', { child: 233 });
+    expect(_getPathMap(data.deepObj, 'parent')).to.be.deep.equal({
+      'deepObj.parent': { key: 'parent', root: 'deepObj', path: 'deepObj.parent' }
+    });
+    expect(_getPathMap(data.deepObj.parent, 'child')).to.be.deep.equal({
+      'deepObj.parent.child': { key: 'child', root: 'deepObj', path: 'deepObj.parent.child' }
+    });
+  });
+
+  it('complex path: Object', function() {
+    const vm = {};
+
+    initData(vm, { a: { b: { c: { d: 123 } } }, x: {}, y: {} });
+
+    // eslint-disable-next-line
+    const data = vm._data;
+    data.x = data.a.b.c;
+    data.y = data.x;
+
+    expect(_getPathMap(data.a.b.c, 'd')).to.be.deep.equal({
+      'x.d': { key: 'd', root: 'x', path: 'x.d' },
+      'y.d': { key: 'd', root: 'y', path: 'y.d' },
+      'a.b.c.d': { key: 'd', root: 'a', path: 'a.b.c.d' }
+    });
+    expect(_getPathMap(data.x, 'd')).to.be.deep.equal({
+      'x.d': { key: 'd', root: 'x', path: 'x.d' },
+      'y.d': { key: 'd', root: 'y', path: 'y.d' },
+      'a.b.c.d': { key: 'd', root: 'a', path: 'a.b.c.d' }
+    });
+    expect(_getPathMap(data.y, 'd')).to.be.deep.equal({
+      'x.d': { key: 'd', root: 'x', path: 'x.d' },
+      'y.d': { key: 'd', root: 'y', path: 'y.d' },
+      'a.b.c.d': { key: 'd', root: 'a', path: 'a.b.c.d' }
+    });
+
+    data.x = { d: 123 };
+
+    expect(_getPathMap(data.a.b.c, 'd')).to.be.deep.equal({
+      'y.d': { key: 'd', root: 'y', path: 'y.d' },
+      'a.b.c.d': { key: 'd', root: 'a', path: 'a.b.c.d' }
+    });
+    expect(_getPathMap(data.x, 'd')).to.be.deep.equal({
+      'x.d': { key: 'd', root: 'x', path: 'x.d' }
+    });
+    expect(_getPathMap(data.y, 'd')).to.be.deep.equal({
+      'y.d': { key: 'd', root: 'y', path: 'y.d' },
+      'a.b.c.d': { key: 'd', root: 'a', path: 'a.b.c.d' }
+    });
+  });
+
+  it('complex path: Array', function() {
+    const vm = {};
+
+    initData(vm, { arr1: [], arr2: [], arr3: [] });
+
+    const data = vm._data;
+    const obj = { a: 123 };
+    data.arr1.push(obj);
+    data.arr2.splice(0, 0, obj);
+    data.arr3.unshift(obj);
+
+    expect(_getPathMap(data.arr1[0], 'a')).to.be.deep.equal({
+      'arr1[0].a': { key: 'a', root: 'arr1', path: 'arr1[0].a' },
+      'arr2[0].a': { key: 'a', root: 'arr2', path: 'arr2[0].a' },
+      'arr3[0].a': { key: 'a', root: 'arr3', path: 'arr3[0].a' }
+    });
+    expect(_getPathMap(data.arr2[0], 'a')).to.be.deep.equal({
+      'arr1[0].a': { key: 'a', root: 'arr1', path: 'arr1[0].a' },
+      'arr2[0].a': { key: 'a', root: 'arr2', path: 'arr2[0].a' },
+      'arr3[0].a': { key: 'a', root: 'arr3', path: 'arr3[0].a' }
+    });
+    expect(_getPathMap(data.arr3[0], 'a')).to.be.deep.equal({
+      'arr1[0].a': { key: 'a', root: 'arr1', path: 'arr1[0].a' },
+      'arr2[0].a': { key: 'a', root: 'arr2', path: 'arr2[0].a' },
+      'arr3[0].a': { key: 'a', root: 'arr3', path: 'arr3[0].a' }
+    });
+
+    data.arr2.splice(0, 1);
+
+    expect(_getPathMap(data.arr1[0], 'a')).to.be.deep.equal({
+      'arr1[0].a': { key: 'a', root: 'arr1', path: 'arr1[0].a' },
+      'arr3[0].a': { key: 'a', root: 'arr3', path: 'arr3[0].a' }
+    });
+    expect(_getPathMap(data.arr3[0], 'a')).to.be.deep.equal({
+      'arr1[0].a': { key: 'a', root: 'arr1', path: 'arr1[0].a' },
+      'arr3[0].a': { key: 'a', root: 'arr3', path: 'arr3[0].a' }
+    });
+  });
+});
diff --git a/packages/core/test/weapp/util/debug.test.js b/packages/core/test/weapp/util/debug.test.js
new file mode 100644
index 000000000..82717f2d1
--- /dev/null
+++ b/packages/core/test/weapp/util/debug.test.js
@@ -0,0 +1,21 @@
+import { warn, tip } from '../../../weapp/util/debug';
+const expect = require('chai').expect;
+
+describe('debug test', function () {
+    it('warn test', function () {
+        const app = {
+            data: 24
+        };
+        expect(warn('SyntaxError', app)).to.deep.equal(undefined);
+    });
+    
+    it('tip test', function () {
+        const app = {
+            data: 24
+        };
+        expect(tip('ReferenceError', app)).to.deep.equal(undefined);
+    })
+});
+/*
+*原文件中应该在 Found in component 之前加一个空格效果比较好？
+*/
\ No newline at end of file
diff --git a/packages/core/test/weapp/util/error.test.js b/packages/core/test/weapp/util/error.test.js
new file mode 100644
index 000000000..00ec8ee5a
--- /dev/null
+++ b/packages/core/test/weapp/util/error.test.js
@@ -0,0 +1,12 @@
+const expect = require('chai').expect;
+import { handleError } from '../../../weapp/util/error';
+
+describe('handleError test', () => {
+    it('error test', () => {
+        const app = {
+            data: 24
+        };
+        const func = handleError('ReferenceError', app, 'render');
+        expect(func).to.deep.equal(undefined)
+    });
+});
\ No newline at end of file
diff --git a/packages/core/test/weapp/util/index.test.js b/packages/core/test/weapp/util/index.test.js
new file mode 100644
index 000000000..55c562356
--- /dev/null
+++ b/packages/core/test/weapp/util/index.test.js
@@ -0,0 +1,86 @@
+
+const expect = require('chai').expect;
+//var remove = require('../../../weapp/util/index').remove;
+import { remove, isReserved, def, parsePath } from '../../../weapp/util/index';
+import { obj } from 'through2';
+
+describe('remove test', () => {
+    it('arr remove 2', () => {
+        const arr1 = [2, 3, 7, 5, 6, 7, 8, 1];
+        const removearr = remove(arr1, 2);
+        expect(removearr).to.deep.equal([2]);
+    });
+
+    it('arr remove 4', () => {
+        const arr2 = [2, 3, 7, 5, 6, 7, 8, 1];
+        expect(remove(arr2, 4)).to.deep.equal(undefined);
+    });
+
+    it('arr is null', () => {
+        const arr3 = [];
+        expect(remove(arr3, 2)).to.deep.equal(undefined);
+    })
+});
+
+describe('isReserved test', () => {
+    it('Check if a string starts with _', () => {
+        expect(isReserved('_static')).to.be.true;
+    });
+    it('Check if a string starts with $ ', () => {
+        expect(isReserved('$key')).to.be.true;
+    });
+    it('Check if a string starts without $ or _ ', () => {
+        expect(isReserved('dhdff')).to.be.false;
+    })
+});
+
+describe('def test', () => {
+    it('add property', () => {
+        const obj = {};
+        def(obj, 'color', 'white', true);
+        expect(obj).to.deep.equal({ color: 'white' });
+    });
+
+    it('modified property', () => {
+        const obj = {
+            eat: 'fish',
+            color: 'white'
+        };
+        def(obj, 'color', 'black', true);
+        expect(obj).to.deep.equal({
+            eat: 'fish',
+            color: 'black'
+        });
+    });
+});
+
+
+describe('parsePath test', () => {
+    it('parsePath test: return an property value', () => {
+        const path = 'wepy.test';
+        let a = parsePath(path);
+        const b = a({ wepy: { test: 1 } });
+        expect(b).to.deep.equal(1);
+    });
+
+    it('parsePath test: return an object', () => {
+        const path = 'wepy.test';
+        let a = parsePath(path);
+        const b = a({ wepy: { test: { test2: 'test3' } } });
+        expect(b).to.deep.equal({ test2: 'test3' });
+    });
+
+    it('parsePath test: Don\'t satisfy regular expression', () => {
+        const path = 'wepy.';
+        let a = parsePath(path);
+        const b = a({ wepy: { test: { test2: 'test3' } } });
+        expect(b).to.deep.equal(undefined);
+    });
+
+    it('parsePath test: Don\'t satisfy regular expression', () => {
+        const path = 'wepy.test';
+        let a = parsePath(path);
+        const b = a({ wepy1: { test1: { test2: 'test3' } } });
+        expect(b).to.deep.equal(undefined);
+    });
+});
diff --git a/packages/core/test/weapp/util/model.test.js b/packages/core/test/weapp/util/model.test.js
new file mode 100644
index 000000000..04033bfbf
--- /dev/null
+++ b/packages/core/test/weapp/util/model.test.js
@@ -0,0 +1,65 @@
+
+const expect = require('chai').expect;
+import { parseModel } from '../../../weapp/util/model';
+
+describe('parseModel test', () => {
+    it('there are no square brackets and dots :', () => {
+        var str = '  test  ';
+        expect(parseModel(str)).to.deep.equal({
+            expr: 'test',
+            key: null
+        })
+    });
+
+
+    it('there are only dots :', () => {
+        var str = ' test.key ';
+        expect(parseModel(str)).to.deep.equal({
+            expr: 'test',
+            key: 'key'
+        })
+    });
+
+    it(' there are only brackets :', () => {
+        var str = '  test[key]  ';
+        expect(parseModel(str)).to.deep.equal({
+            expr: 'test',
+            key: 'key'
+        })
+    });
+
+    it('there are multiple square brackets nesting :', () => {
+        var str = ' test[test1[key]]  ';
+        expect(parseModel(str)).to.deep.equal({
+            expr: 'test',
+            key: 'test1[key]'
+        })
+    });
+
+    it('there are double quotation marks ：', () => {
+        var str = ' test["a"][key]  ';
+        expect(parseModel(str)).to.deep.equal({
+            expr: 'test[\"a\"]',
+            key: 'key'
+        })
+    });
+
+    it('there are points and brackets nesting :', () => {
+        var str = ' xxx.test[a[a].test1[key]]  ';
+        expect(parseModel(str)).to.deep.equal({
+            expr: 'xxx.test',
+            key: 'a[a].test1[key]'
+        })
+    });
+
+    it('there are multiple dots and brackets :', () => {
+        var str = ' test.xxx.a["asa"][test1[key]]  ';
+        expect(parseModel(str)).to.deep.equal({
+            expr: 'test.xxx.a[\"asa\"]',
+            key: 'test1[key]'
+        })
+    });
+
+
+});
+
diff --git a/packages/core/test/weapp/util/next-tick.test.js b/packages/core/test/weapp/util/next-tick.test.js
new file mode 100644
index 000000000..306d0e230
--- /dev/null
+++ b/packages/core/test/weapp/util/next-tick.test.js
@@ -0,0 +1,9 @@
+import { withMacroTask, nextTick, renderFlushCallbacks, renderNextTick} from '../../../weapp/util/next-tick';
+const expect = require('chai').expect;
+
+describe('next-tick test', function () {
+  it('macro task with normal function', function () {
+    const fn = () => 1;
+    expect(withMacroTask(fn)).is.an('function');
+  });
+});
diff --git a/packages/core/types/index.d.ts b/packages/core/types/index.d.ts
new file mode 100644
index 000000000..495b1803e
--- /dev/null
+++ b/packages/core/types/index.d.ts
@@ -0,0 +1,27 @@
+/// <reference path="./wx/index.d.ts" />
+
+import { wepy } from './wepy';
+
+export default wepy;
+
+export as namespace wepy;
+
+export {
+  WepyConstructor
+} from './wepy';
+
+export {
+  ComponentOptions,
+  PropType,
+  PropOptions,
+  ComputedOptions,
+  WatchHandler,
+  WatchOptions,
+  WatchOptionsWithHandler,
+} from "./options";
+
+export {
+  PluginFunction,
+  PluginObject
+} from "./plugin";
+
diff --git a/packages/core/types/options.d.ts b/packages/core/types/options.d.ts
new file mode 100644
index 000000000..c519b1de1
--- /dev/null
+++ b/packages/core/types/options.d.ts
@@ -0,0 +1,125 @@
+import { wepy, CombineWepyInstance, WepyInstace, WepyApp } from "./wepy";
+
+
+type Constructor = {
+  new (...args: any[]): any;
+}
+
+/**
+ * When the `Computed` type parameter on `ComponentOptions` is inferred,
+ * it should have a property with the return type of every get-accessor.
+ * Since there isn't a way to query for the return type of a function, we allow TypeScript
+ * to infer from the shape of `Accessors<Computed>` and work backwards.
+ */
+export type Accessors<T> = {
+  [K in keyof T]: (() => T[K]) | ComputedOptions<T[K]>
+}
+
+type DataDef<Data, Props, V> = Data | ((this: Readonly<Props> & V) => Data)
+/**
+ * This type should be used when an array of strings is used for a component's `props` value.
+ */
+export type ThisTypedComponentOptionsWithArrayProps<V extends WepyInstace, Data, Methods, Hooks, Computed, PropNames extends string> =
+  object &
+  ComponentOptions<V, DataDef<Data, Record<PropNames, any>, V>, Methods, Hooks, Computed, PropNames[], Record<PropNames, any>> &
+  ThisType<CombineWepyInstance<V, Data, Methods, Hooks, Computed, Readonly<Record<PropNames, any>>>>;
+
+/**
+ * This type should be used when an object mapped to `PropOptions` is used for a component's `props` value.
+ */
+export type ThisTypedComponentOptionsWithRecordProps<V extends WepyInstace, Data, Methods, Hooks, Computed, Props> =
+  object &
+  ComponentOptions<V, DataDef<Data, Props, V>, Methods, Hooks, Computed, RecordPropsDefinition<Props>, Props> &
+  ThisType<CombineWepyInstance<V, Data, Methods, Hooks, Computed, Readonly<Props>>>;
+
+type DefaultData<V> =  object | ((this: V) => object);
+type DefaultProps = Record<string, any>;
+type DefaultMethods<V> =  { [key: string]: (this: V, ...args: any[]) => any };
+type DefaultHooks<V> =  { [key: string]: (this: V, ...args: any[]) => any };
+type DefaultComputed = { [key: string]: any };
+
+
+
+export interface AppOptions<
+  A extends WepyApp,
+  Hooks=DefaultHooks<A>> extends wepy.App.AppInstance {
+    hooks?: Hooks;
+}
+
+export interface ComponentOptions<
+  V extends WepyInstace,
+  Data=DefaultData<V>,
+  Methods=DefaultMethods<V>,
+  Hooks=DefaultHooks<V>,
+  Computed=DefaultComputed,
+  PropsDef=PropsDefinition<DefaultProps>,
+  Props=DefaultProps> extends wepy.Page.PageInstance {
+  data?: Data;
+  props?: PropsDef;
+  propsData?: object;
+  hooks?: Hooks;
+  computed?: Accessors<Computed>;
+  methods?: Methods;
+  watch?: Record<string, WatchOptionsWithHandler<any> | WatchHandler<any> | string>;
+
+  relations?: Record<string, any>;
+
+  el?: Element | string;
+  template?: string;
+  // hack is for functional component type inference, should not be used in user code
+
+  created?(): void;
+  attached?(): void;
+  ready?(): void;
+  moved?(): void;
+  detached?(): void;
+
+}
+
+export interface RenderContext<Props=DefaultProps> {
+  props: Props;
+  slots(): any;
+  listeners: { [key: string]: Function | Function[] };
+  injections: any
+}
+
+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 type RecordPropsDefinition<T> = {
+  [K in keyof T]: PropValidator<T[K]>
+}
+export type ArrayPropsDefinition<T> = (keyof T)[];
+export type PropsDefinition<T> = ArrayPropsDefinition<T> | RecordPropsDefinition<T>;
+
+export interface ComputedOptions<T> {
+  get?(): T;
+  set?(value: T): void;
+  cache?: boolean;
+}
+
+export type WatchHandler<T> = (val: T, oldVal: T) => void;
+
+export interface WatchOptions {
+  deep?: boolean;
+  immediate?: boolean;
+}
+
+export interface WatchOptionsWithHandler<T> extends WatchOptions {
+  handler: WatchHandler<T>;
+}
+export type InjectKey = string | symbol;
+
+export type InjectOptions = {
+  [key: string]: InjectKey | { from?: InjectKey, default?: any }
+} | string[];
diff --git a/packages/core/types/plugin.d.ts b/packages/core/types/plugin.d.ts
new file mode 100644
index 000000000..055c30cc8
--- /dev/null
+++ b/packages/core/types/plugin.d.ts
@@ -0,0 +1,8 @@
+import { wepy as _wepy } from './wepy';
+
+export type PluginFunction<T> = (wepy: typeof _wepy, options?: T) => void;
+
+export interface PluginObject<T> {
+  install: PluginFunction<T>;
+  [key: string]: any;
+}
diff --git a/packages/core/types/test/tsconfig.json b/packages/core/types/test/tsconfig.json
new file mode 100644
index 000000000..6efc0804b
--- /dev/null
+++ b/packages/core/types/test/tsconfig.json
@@ -0,0 +1,31 @@
+{
+  "compilerOptions": {
+    "target": "es5",
+    "experimentalDecorators": true,
+    "lib": [
+      "dom",
+      "es2015"
+    ],
+    "types": [
+      "miniprogram-api-typings"
+    ],
+    "module": "commonjs",
+    "strict": true,
+    "noEmit": true,
+    "baseUrl": ".",
+    "paths": {
+      "wepy": ["../index.d.ts"]
+    }
+  },
+  "files": [
+    "../index.d.ts",
+    "../options.d.ts",
+    "../plugin.d.ts",
+    "../wepy.d.ts",
+    "wepy.test.ts",
+    "wepy.app.test.ts",
+    "wepy.page.test.ts",
+    "wepy.component.test.ts"
+  ],
+  "compileOnSave": false
+}
diff --git a/packages/core/types/test/wepy.app.test.ts b/packages/core/types/test/wepy.app.test.ts
new file mode 100644
index 000000000..4996b8bf1
--- /dev/null
+++ b/packages/core/types/test/wepy.app.test.ts
@@ -0,0 +1,17 @@
+import wepy from '../index';
+
+wepy.app({
+  hooks: {
+    'before-setData': function (data) {
+      data.item = 1;
+      return data;
+    }
+  },
+  onLaunch(option) {
+    if (option)
+      console.log(option.query);
+  },
+  onError(e) {
+    console.log(e);
+  }
+})
\ No newline at end of file
diff --git a/packages/core/types/test/wepy.component.test.ts b/packages/core/types/test/wepy.component.test.ts
new file mode 100644
index 000000000..c277366cf
--- /dev/null
+++ b/packages/core/types/test/wepy.component.test.ts
@@ -0,0 +1,48 @@
+import wepy from '../index';
+
+
+wepy.component({
+
+  relations: {
+    './child': {
+      type: ''
+    }
+  },
+  hooks: {
+    'hi' : function (v: number) {
+      console.log(this);
+    },
+    'before-setData': function (dirty: object): object {
+      console.log('setData dirty: ', dirty);
+      return dirty;
+    }
+  },
+  
+  created() {
+    this.initData();
+  },
+
+  data: {
+    d: 'string'
+  },
+
+  onLoad (option) {
+    console.log(option);
+  },
+
+  onShow() {
+
+  }, 
+  
+  methods: {
+    bindtap () {
+    },
+
+    initData () {
+      wx.request({
+        method: 'POST',
+        url: 'http://www.baidu.com'
+      })
+    }
+  }
+});
\ No newline at end of file
diff --git a/packages/core/types/test/wepy.page.test.ts b/packages/core/types/test/wepy.page.test.ts
new file mode 100644
index 000000000..49efa9220
--- /dev/null
+++ b/packages/core/types/test/wepy.page.test.ts
@@ -0,0 +1,83 @@
+import wepy from '../index';
+
+
+wepy.page({
+  hooks: {
+    'hi' : function (v: number) {
+      console.log(this);
+    },
+    'before-setData': function (dirty: object): object {
+      console.log('setData dirty: ', dirty);
+      return dirty;
+    }
+  },
+  
+  created() {
+    console.log(this);
+  },
+
+  data: {
+    d: 'string'
+  },
+
+  onLoad (option) {
+    console.log(option);
+    this.sleep(10);
+  },
+
+  onShow() {
+
+  }, 
+  
+  onPageScroll () {
+
+  },
+
+  onReachBottom () {
+
+  },
+
+  onPullDownRefresh () {
+
+  },
+  onShareAppMessage (): Page.ICustomShareContent {
+    return <Page.ICustomShareContent>{
+      title: 'share title',
+      imageUrl: 'http://www.baidu.com',
+      path: '/a/b/c'
+    }
+  },
+  onShareTimeline (): Page.IAddToFavoritesContent {
+    return <Page.IAddToFavoritesContent>{
+      title: 'share title',
+      imageUrl: 'http://www.baidu.com',
+      query: '/a/b/c'
+    }
+  },
+  onAddToFavorites (): Page.IAddToFavoritesContent {
+    return <Page.IAddToFavoritesContent>{
+      title: 'share title',
+      imageUrl: 'http://www.baidu.com',
+      query: '/a/b/c'
+    }
+  },
+
+  methods: {
+    bindtap () {
+    },
+
+    sleep (s: number) {
+      console.log(this.testAsync);
+      return new Promise((resolve) => {
+        setTimeout(() => {
+          resolve('promise resolved')
+        }, s * 1000)
+      })
+    },
+
+    async testAsync () {
+      console.log(this);
+      let d = await this.sleep(3);
+    }
+  }
+});
\ No newline at end of file
diff --git a/packages/core/types/test/wepy.test.ts b/packages/core/types/test/wepy.test.ts
new file mode 100644
index 000000000..91d163068
--- /dev/null
+++ b/packages/core/types/test/wepy.test.ts
@@ -0,0 +1,47 @@
+import wepy from '../index';
+import { WepyInstace } from '../wepy';
+import { PluginObject, PluginFunction } from '../plugin';
+
+let eventBus = new wepy();
+
+eventBus.$on('test', function(a: any, b: any, c: any) {
+  console.log(a, b, c)
+});
+
+eventBus.$emit('test', 1, 2, 3);
+
+const installer: PluginFunction<Array<string>> = function (wepy, option) {
+  if (option) {
+    console.log(option.length);
+  }
+};
+
+const plugin: PluginObject<Array<string>> = {
+  install: installer,
+  useDefinedMethod (): string {
+    return '' + Math.random();
+  }
+}
+
+wepy.mixin({
+  data: {
+    a: 1
+  },
+  methods: {
+    commonFunc () {
+      console.log(this);
+    }
+  }
+});
+
+
+wepy.nextTick().then(res => {
+  console.log(res);
+});
+
+wepy.nextTick(function (): void {
+  console.log(this);
+})
+wepy.nextTick(function (): void {
+  console.log(this.ctx === 'efc');
+}, { ctx: 'abc'})
\ No newline at end of file
diff --git a/packages/core/types/tsconfig.json b/packages/core/types/tsconfig.json
new file mode 100644
index 000000000..e488a69a6
--- /dev/null
+++ b/packages/core/types/tsconfig.json
@@ -0,0 +1,14 @@
+{
+    "compilerOptions": {
+        "strict": true,
+        "lib": [
+            "es2015", "dom"
+        ],
+        "types": [
+            "miniprogram-api-typings"
+        ]
+    },
+    "include": [
+        "./*.ts"
+    ]
+}
\ No newline at end of file
diff --git a/packages/core/types/typings.json b/packages/core/types/typings.json
new file mode 100644
index 000000000..826877391
--- /dev/null
+++ b/packages/core/types/typings.json
@@ -0,0 +1,4 @@
+{
+  "name": "wepy",
+  "main": "index.d.ts"
+}
diff --git a/packages/core/types/wepy.d.ts b/packages/core/types/wepy.d.ts
new file mode 100644
index 000000000..5e65e3df6
--- /dev/null
+++ b/packages/core/types/wepy.d.ts
@@ -0,0 +1,125 @@
+import {
+  ComponentOptions,
+  WatchOptionsWithHandler,
+  WatchHandler,
+  RecordPropsDefinition,
+  ThisTypedComponentOptionsWithArrayProps,
+  ThisTypedComponentOptionsWithRecordProps,
+  WatchOptions,
+  AppOptions,
+} from "./options";
+import { PluginFunction, PluginObject } from "./plugin";
+
+export interface Base {
+  new (): Base;
+
+  $set: (target: string, key: string, value: string) => void;
+  $delete: (target: string, key: string) => void;
+  $on(event: string | string[] | Record<string, Function>, callback?: Function): this;
+  $off(event: string | string[] | Record<string, Function>, callback?: Function): this;
+  $emit(event: string, ...args: any[]): this;
+}
+
+export interface WepyApp extends Base {
+}
+
+export interface WepyComponent extends Base {
+  readonly $refs: { [ key: string ]: WepyComponent | WepyComponent[] };
+
+  $watch(
+    expOrFn: string,
+    callback: (this: this, n: any, o: any) => void,
+  ): (() => void);
+  $watch<T>(
+    expOrFn: (this: this) => T,
+    callback: (this: this, n: T, o: T) => void,
+  ): (() => void);
+  $trigger(event: string, data: any, option: object): this;
+}
+export interface WepyPage extends WepyComponent {
+  $launch(url: string, params: object): void;
+  $navigate(url: string, params: object): void;
+  $redirect(url: string, params: object): void;
+  $back(p: number | { delta: number }): void;
+  $route(type: string, url: string, params: object): void;
+}
+
+export type WepyInstace = WepyPage | WepyComponent;
+
+export interface Vue {
+  /*
+  readonly $options: ComponentOptions<Vue>;
+  readonly $parent: Vue;
+  readonly $root: Vue;
+  readonly $children: Vue[];
+  readonly $refs: { [key: string]: Vue | Element | Vue[] | Element[] };
+  */
+  readonly $data: Record<string, any>;
+  readonly $props: Record<string, any>;
+  readonly $ssrContext: any;
+  readonly $attrs: Record<string, string>;
+  readonly $listeners: Record<string, Function | Function[]>;
+
+  $mount(elementOrSelector?: Element | string, hydrating?: boolean): this;
+  $forceUpdate(): void;
+  $destroy(): void;
+  $set: (traget: object, key: string, value: string) => void;
+  $delete: (traget: object, key: string) => void;
+  $on(event: string | string[] | Record<string, Function>, callback?: Function): this;
+  $off(event: string | string[] | Record<string, Function>, callback?: Function): this;
+  $emit(event: string, ...args: any[]): this;
+  $watch(
+    expOrFn: string,
+    callback: (this: this, n: any, o: any) => void,
+    options?: WatchOptions
+  ): (() => void);
+  $watch<T>(
+    expOrFn: (this: this) => T,
+    callback: (this: this, n: T, o: T) => void,
+    options?: WatchOptions
+  ): (() => void);
+  $on(event: string | string[], callback: Function): this;
+  $once(event: string | string[], callback: Function): this;
+  $off(event?: string | string[], callback?: Function): this;
+  $emit(event: string, ...args: any[]): this;
+  $nextTick(callback: (this: this) => void): void;
+  $nextTick(): Promise<void>;
+}
+
+export type CombineWepyInstance<Instance extends WepyInstace, Data, Methods, Hooks, Computed, Props> =  Data & Methods & Hooks & Computed & Props & Instance;
+
+export interface WepyConfiguration {
+  silent: boolean;
+}
+
+export interface WepyConstructor<V extends WepyInstace = WepyInstace, P extends WepyPage = WepyPage, C extends WepyComponent = WepyComponent, A extends WepyApp = WepyApp> {
+  new (): Base;
+
+  app(options: AppOptions<WepyApp>): void;
+
+  page<Data, Methods, Hooks, Computed, PropNames extends string = never>(options?: ThisTypedComponentOptionsWithArrayProps<P, Data, Methods, Hooks, Computed, PropNames>): wepy.Page.PageInstance;
+  page<Data, Methods, Hooks, Computed, Props>(options?: ThisTypedComponentOptionsWithRecordProps<P, Data, Methods, Hooks, Computed, Props>): wepy.Page.PageInstance;
+  page(options?: ComponentOptions<P>): wepy.Page.PageInstance;
+
+  component<Data, Methods, Hooks, Computed, PropNames extends string = never>(options?: ThisTypedComponentOptionsWithArrayProps<C, Data, Methods, Hooks, Computed, PropNames>): wepy.Page.PageInstance;
+  component<Data, Methods, Hooks, Computed, Props>(options?: ThisTypedComponentOptionsWithRecordProps<C, Data, Methods, Hooks, Computed, Props>): wepy.Page.PageInstance;
+  component(options?: ComponentOptions<C>): wepy.Page.PageInstance;
+
+  nextTick<T>(callback: (this: T) => void, context?: T): void;
+  nextTick(): Promise<void>
+  set<T>(object: object, key: string | number, value: T): T;
+  set<T>(array: T[], key: number, value: T): T;
+  delete(object: object, key: string | number): void;
+  delete<T>(array: T[], key: number): void;
+
+  use<T>(plugin: PluginObject<T> | PluginFunction<T>, options?: T): WepyConstructor<V>;
+  use(plugin: PluginObject<any> | PluginFunction<any>, ...options: any[]): WepyConstructor<V>;
+  mixin(mixin: WepyConstructor | ComponentOptions<WepyPage>): WepyConstructor<V>;
+
+  observable<T>(obj: T): T;
+
+  config: WepyConfiguration;
+  version: string;
+}
+
+export const wepy: WepyConstructor;
diff --git a/packages/core/types/wx/index.d.ts b/packages/core/types/wx/index.d.ts
new file mode 100644
index 000000000..f48d7c3af
--- /dev/null
+++ b/packages/core/types/wx/index.d.ts
@@ -0,0 +1,16 @@
+/*! *****************************************************************************
+Copyright (c) 2018 Tencent, Inc. All rights reserved. 
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+***************************************************************************** */
+
+/// <reference path="lib.wx.api.d.ts" />
+/// <reference path="lib.wx.app.d.ts" />
+/// <reference path="lib.wx.behavior.d.ts" />
+/// <reference path="lib.wx.cloud.d.ts" />
+/// <reference path="lib.wx.component.d.ts" />
+/// <reference path="lib.wx.page.d.ts" />
\ No newline at end of file
diff --git a/packages/core/types/wx/lib.wx.api.d.ts b/packages/core/types/wx/lib.wx.api.d.ts
new file mode 100644
index 000000000..033dd7511
--- /dev/null
+++ b/packages/core/types/wx/lib.wx.api.d.ts
@@ -0,0 +1,14 @@
+/*! *****************************************************************************
+Copyright (c) 2018 Tencent, Inc. All rights reserved. 
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+***************************************************************************** */
+
+// @ts-ignore
+/// <reference path="../../node_modules/miniprogram-api-typings/types/wx/lib.wx.api.d.ts" />
+// @ts-ignore
+/// <reference path="../../../node_modules/miniprogram-api-typings/types/wx/lib.wx.api.d.ts" />
\ No newline at end of file
diff --git a/packages/core/types/wx/lib.wx.app.d.ts b/packages/core/types/wx/lib.wx.app.d.ts
new file mode 100644
index 000000000..3a224639e
--- /dev/null
+++ b/packages/core/types/wx/lib.wx.app.d.ts
@@ -0,0 +1,36 @@
+/*! *****************************************************************************
+Copyright (c) 2018 Tencent, Inc. All rights reserved. 
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+***************************************************************************** */
+
+// @ts-ignore
+/// <reference path="../../node_modules/miniprogram-api-typings/types/wx/lib.wx.app.d.ts" />
+// @ts-ignore
+/// <reference path="../../../node_modules/miniprogram-api-typings/types/wx/lib.wx.app.d.ts" />
+
+declare namespace wepy {
+  namespace App {
+    interface AppInstance<T extends WechatMiniprogram.IAnyObject = {}> {   
+      onLaunch?(options?: WechatMiniprogram.App.LaunchShowOption): void;
+    
+      onShow?(options?: WechatMiniprogram.App.LaunchShowOption): void;
+      
+      onHide?(): void;
+      
+      onError?(error?: string): void;
+
+      onPageNotFound?(options?: WechatMiniprogram.App.PageNotFoundOption): void;
+    }
+  
+    interface AppConstructor {
+      <T extends WechatMiniprogram.IAnyObject & AppInstance>(
+        options: AppInstance<T> & T
+      ): void
+    }
+  }
+}
\ No newline at end of file
diff --git a/packages/core/types/wx/lib.wx.behavior.d.ts b/packages/core/types/wx/lib.wx.behavior.d.ts
new file mode 100644
index 000000000..f584eb354
--- /dev/null
+++ b/packages/core/types/wx/lib.wx.behavior.d.ts
@@ -0,0 +1,4 @@
+// @ts-ignore
+/// <reference path="../../node_modules/miniprogram-api-typings/types/wx/lib.wx.behavior.d.ts" />
+// @ts-ignore
+/// <reference path="../../../node_modules/miniprogram-api-typings/types/wx/lib.wx.app.d.ts" />
\ No newline at end of file
diff --git a/packages/core/types/wx/lib.wx.cloud.d.ts b/packages/core/types/wx/lib.wx.cloud.d.ts
new file mode 100644
index 000000000..5e06ffeef
--- /dev/null
+++ b/packages/core/types/wx/lib.wx.cloud.d.ts
@@ -0,0 +1,14 @@
+/*! *****************************************************************************
+Copyright (c) 2018 Tencent, Inc. All rights reserved. 
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+***************************************************************************** */
+
+// @ts-ignore
+/// <reference path="../../node_modules/miniprogram-api-typings/types/wx/lib.wx.cloud.d.ts" />
+// @ts-ignore
+/// <reference path="../../../node_modules/miniprogram-api-typings/types/wx/lib.wx.cloud.d.ts" />
\ No newline at end of file
diff --git a/packages/core/types/wx/lib.wx.component.d.ts b/packages/core/types/wx/lib.wx.component.d.ts
new file mode 100644
index 000000000..12cbd698c
--- /dev/null
+++ b/packages/core/types/wx/lib.wx.component.d.ts
@@ -0,0 +1,4 @@
+// @ts-ignore
+/// <reference path="../../node_modules/miniprogram-api-typings/types/wx/lib.wx.component.d.ts" />
+// @ts-ignore
+/// <reference path="../../node_modules/miniprogram-api-typings/types/wx/lib.wx.component.d.ts" />
\ No newline at end of file
diff --git a/packages/core/types/wx/lib.wx.page.d.ts b/packages/core/types/wx/lib.wx.page.d.ts
new file mode 100644
index 000000000..cd7ea4bbb
--- /dev/null
+++ b/packages/core/types/wx/lib.wx.page.d.ts
@@ -0,0 +1,91 @@
+/*! *****************************************************************************
+Copyright (c) 2018 Tencent, Inc. All rights reserved. 
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+***************************************************************************** */
+
+// @ts-ignore
+/// <reference path="../../node_modules/miniprogram-api-typings/types/wx/lib.wx.page.d.ts" />
+// @ts-ignore
+/// <reference path="../../../node_modules/miniprogram-api-typings/types/wx/lib.wx.page.d.ts" />
+
+declare namespace wepy {
+  namespace Page {
+    interface PageInstanceBaseProps<D extends WechatMiniprogram.IAnyObject = any> {
+    /** 页面的初始数据
+     * 
+     * `data` 是页面第一次渲染使用的**初始数据**。
+     * 
+     * 页面加载时，`data` 将会以`JSON`字符串的形式由逻辑层传至渲染层，因此`data`中的数据必须是可以转成`JSON`的类型：字符串，数字，布尔值，对象，数组。
+     * 
+     * 渲染层可以通过 `WXML` 对数据进行绑定。
+    */
+    data?: D
+
+    /** `setData` 函数用于将数据从逻辑层发送到视图层（异步），同时改变对应的 `this.data` 的值（同步）。
+     *
+     * **注意：**
+     *
+     * 1. **直接修改 this.data 而不调用 this.setData 是无法改变页面的状态的，还会造成数据不一致**。
+     * 1. 仅支持设置可 JSON 化的数据。
+     * 1. 单次设置的数据不能超过1024kB，请尽量避免一次设置过多的数据。
+     * 1. 请不要把 data 中任何一项的 value 设为 `undefined` ，否则这一项将不被设置并可能遗留一些潜在问题。
+     */
+
+    setData?<K extends keyof D>(
+      /** 这次要改变的数据
+       *
+       * 以 `key: value` 的形式表示，将 `this.data` 中的 `key` 对应的值改变成 `value`。
+       *
+       * 其中 `key` 可以以数据路径的形式给出，支持改变数组中的某一项或对象的某个属性，如 `array[2].message`，`a.b.c.d`，并且不需要在 this.data 中预先定义。
+       */
+      data: D | Pick<D, K> | WechatMiniprogram.IAnyObject,
+      /** setData引起的界面更新渲染完毕后的回调函数，最低基础库： `1.5.0` */
+      callback?: () => void
+    ): void
+
+    /** 到当前页面的路径，类型为`String`。最低基础库： `1.2.0` */
+    route?: string
+    }
+  
+    interface PageInstance<D extends WechatMiniprogram.IAnyObject = any, T extends WechatMiniprogram.IAnyObject = any> extends PageInstanceBaseProps<D> {
+      onLoad?(query?: { [queryKey: string]: string }): void;
+      
+      onShow?(): void;
+      
+      onReady?(): void;
+      
+      onHide?(): void;
+
+      onUnload?(): void;
+
+      onPullDownRefresh?(): void;
+      
+      onReachBottom?(): void
+      
+      onShareAppMessage?(options?: WechatMiniprogram.Page.IShareAppMessageOption): WechatMiniprogram.Page.ICustomShareContent
+
+      onShareTimeline?(): WechatMiniprogram.Page.IAddToFavoritesContent
+
+      onAddToFavorites?(): WechatMiniprogram.Page.IAddToFavoritesContent
+      
+      onPageScroll?(options?: WechatMiniprogram.Page.IPageScrollOption): void
+  
+      onTabItemTap?(options?: WechatMiniprogram.Page.ITabItemTapOption): void
+    }
+  
+    interface PageConstructor {
+      <D extends WechatMiniprogram.IAnyObject, T extends WechatMiniprogram.IAnyObject & PageInstance>(
+        options: PageInstance<D, T> & T
+      ): void
+    }
+  
+    interface GetCurrentPages {
+      <D extends WechatMiniprogram.IAnyObject = {}, T extends WechatMiniprogram.IAnyObject = {}>(): (PageInstance<D, T> & T)[]
+    }
+  }
+}
\ No newline at end of file
diff --git a/packages/core/weapp/apis/index.js b/packages/core/weapp/apis/index.js
new file mode 100644
index 000000000..8fb334b17
--- /dev/null
+++ b/packages/core/weapp/apis/index.js
@@ -0,0 +1,26 @@
+import { use } from './use';
+import { mixin } from './mixin';
+import { set, del, observe } from '../observer/index';
+import { renderNextTick } from '../util/next-tick';
+import { app, page, component } from '../native/index';
+
+export function initGlobalAPI(wepy) {
+  wepy.use = use;
+  wepy.mixin = mixin;
+
+  wepy.set = function(target, key, val) {
+    set.apply(wepy, [undefined, target, key, val]);
+  };
+
+  wepy.delete = del;
+
+  wepy.observe = observe;
+
+  wepy.nextTick = renderNextTick;
+
+  wepy.app = app;
+  wepy.page = page;
+  wepy.component = component;
+
+  return wepy;
+}
diff --git a/packages/core/weapp/apis/mixin.js b/packages/core/weapp/apis/mixin.js
new file mode 100644
index 000000000..421b1e421
--- /dev/null
+++ b/packages/core/weapp/apis/mixin.js
@@ -0,0 +1,5 @@
+import $global from '../global';
+
+export function mixin(options = {}) {
+  $global.mixin = ($global.mixin || []).concat(options);
+}
diff --git a/packages/core/weapp/apis/use.js b/packages/core/weapp/apis/use.js
new file mode 100644
index 000000000..e4393fc5e
--- /dev/null
+++ b/packages/core/weapp/apis/use.js
@@ -0,0 +1,15 @@
+import { isFunc } from '../../shared/index';
+
+export function use(plugin, ...args) {
+  if (plugin.installed) {
+    return this;
+  }
+
+  let install = plugin.install || plugin;
+
+  if (isFunc(install)) {
+    install.apply(plugin, [this].concat(args));
+  }
+
+  plugin.installed = 1;
+}
diff --git a/packages/core/weapp/class/Base.js b/packages/core/weapp/class/Base.js
new file mode 100644
index 000000000..8a99fa0e1
--- /dev/null
+++ b/packages/core/weapp/class/Base.js
@@ -0,0 +1,89 @@
+import { isArr, isStr, isObj, toArray, handleError } from './../util/index';
+import { set, del } from '../observer/index';
+
+export default class Base {
+  constructor() {
+    this._events = {};
+    this._watchers = [];
+  }
+
+  $set(target, key, val) {
+    return set(this, target, key, val);
+  }
+
+  $delete(target, key) {
+    return del(target, key);
+  }
+
+  $on(event, fn) {
+    if (isArr(event)) {
+      event.forEach(item => {
+        if (isStr(item)) {
+          this.$on(item, fn);
+        } else if (isObj(item)) {
+          this.$on(item.event, item.fn);
+        }
+      });
+    } else {
+      (this._events[event] || (this._events[event] = [])).push(fn);
+    }
+    return this;
+  }
+
+  $once() {}
+
+  $off(event, fn) {
+    if (!event && !fn) {
+      this._events = Object.create(null);
+      return this;
+    }
+
+    if (isArr(event)) {
+      event.forEach(item => {
+        if (isStr(item)) {
+          this.$off(item, fn);
+        } else if (isObj(item)) {
+          this.$off(item.event, item.fn);
+        }
+      });
+      return this;
+    }
+    if (!this._events[event]) return this;
+
+    if (!fn) {
+      this._events[event] = null;
+      return this;
+    }
+
+    if (fn) {
+      let fns = this._events[event];
+      let i = fns.length;
+      while (i--) {
+        let tmp = fns[i];
+        if (tmp === fn || tmp.fn === fn) {
+          fns.splice(i, 1);
+          break;
+        }
+      }
+    }
+    return this;
+  }
+
+  $emit(event) {
+    let vm = this;
+    let lowerCaseEvent = event.toLowerCase();
+    let fns = this._events[event] || [];
+    if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {
+      // TODO: handler warn
+    }
+    let args = toArray(arguments, 1);
+    fns.forEach(fn => {
+      try {
+        fn.apply(this, args);
+      } catch (e) {
+        handleError(e, vm, `event handler for "${event}"`);
+      }
+    });
+    return this;
+  }
+}
diff --git a/packages/core/weapp/class/Dirty.js b/packages/core/weapp/class/Dirty.js
new file mode 100644
index 000000000..c315e7c2e
--- /dev/null
+++ b/packages/core/weapp/class/Dirty.js
@@ -0,0 +1,69 @@
+import { getPathMap } from '../observer/observerPath';
+
+export default class Dirty {
+  constructor(type) {
+    this.reset();
+
+    // path||key
+    this.type = type || 'path';
+  }
+
+  push(key, path, keyValue, pathValue) {
+    if (pathValue === undefined) {
+      return;
+    }
+    this._keys[key] = keyValue;
+    this._path[path] = pathValue;
+    this._length++;
+  }
+
+  pop() {
+    let data = Object.create(null);
+    if (this.type === 'path') {
+      data = this._path;
+    } else if (this.type === 'key') {
+      data = this._keys;
+    }
+    this.reset();
+    return data;
+  }
+
+  get(type) {
+    return type === 'path' ? this._path : this._keys;
+  }
+
+  /**
+   * Set dirty from a ObserverPath
+   */
+  set(op, key, value) {
+    let pathMap;
+    let pathKeys;
+    // eslint-disable-next-line eqeqeq
+    if (key != null) {
+      const { combinePathKeys, combinePathMap } = getPathMap(key, op.pathKeys, op.pathMap);
+      pathKeys = combinePathKeys;
+      pathMap = combinePathMap;
+    } else {
+      pathKeys = op.pathKeys;
+      pathMap = op.pathMap;
+    }
+    /**
+     * 出于性能考虑，使用 usingComponents 时， setData 内容不会被直接深复制，
+     * 即 this.setData({ field: obj }) 后 this.data.field === obj 。
+     * 因此不需要所有 path 都 setData 。
+     */
+    const { root, path } = pathMap[pathKeys[0]];
+    this.push(root, path, root === path ? value : op.ob.vm[root], value);
+  }
+
+  reset() {
+    this._keys = {};
+    this._path = {};
+    this._length = 0;
+    return this;
+  }
+
+  length() {
+    return this._length;
+  }
+}
diff --git a/packages/core/weapp/class/Event.js b/packages/core/weapp/class/Event.js
new file mode 100644
index 000000000..a7d812723
--- /dev/null
+++ b/packages/core/weapp/class/Event.js
@@ -0,0 +1,17 @@
+export default class Event {
+  constructor(e) {
+    const { detail, target, currentTarget } = e;
+    this.$wx = e;
+    this.type = e.type;
+    this.timeStamp = e.timeStamp;
+    if (detail) {
+      this.x = detail.x;
+      this.y = detail.y;
+    }
+
+    this.target = target;
+    this.currentTarget = currentTarget;
+    this.touches = e.touches;
+    this.changedTouches = e.changedTouches;
+  }
+}
diff --git a/packages/core/weapp/class/WepyApp.js b/packages/core/weapp/class/WepyApp.js
new file mode 100644
index 000000000..aed0d7e88
--- /dev/null
+++ b/packages/core/weapp/class/WepyApp.js
@@ -0,0 +1,7 @@
+import Base from './Base';
+
+export default class WepyApp extends Base {
+  constructor() {
+    super();
+  }
+}
diff --git a/packages/core/weapp/class/WepyComponent.js b/packages/core/weapp/class/WepyComponent.js
new file mode 100644
index 000000000..21034f77f
--- /dev/null
+++ b/packages/core/weapp/class/WepyComponent.js
@@ -0,0 +1,57 @@
+import Base from './Base';
+import Watcher from '../observer/watcher';
+import { isArr, isPlainObject } from '../../shared/index';
+
+import { renderNextTick } from '../util/next-tick';
+
+export default class WepyComponent extends Base {
+  $watch(expOrFn, cb, options) {
+    let vm = this;
+    if (isArr(cb)) {
+      cb.forEach(handler => {
+        this.$watch(expOrFn, handler, options);
+      });
+    }
+    if (isPlainObject(cb)) {
+      let handler = cb;
+      options = handler;
+      handler = handler.handler;
+      if (typeof handler === 'string') handler = this[handler];
+      return this.$watch(expOrFn, handler, options);
+    }
+
+    options = options || {};
+    options.user = true;
+    let watcher = new Watcher(vm, expOrFn, cb, options);
+    if (options.immediate) {
+      cb.call(vm, watcher.value);
+    }
+    return function unwatchFn() {
+      watcher.teardown();
+    };
+  }
+
+  $forceUpdate() {
+    if (this._watcher) {
+      this._watcher.update();
+    }
+  }
+
+  $emit(event, ...args) {
+    const fns = this._events[event];
+
+    if (fns) {
+      super.$emit.apply(this, arguments);
+    } else {
+      this.$wx.triggerEvent(event, { arguments: args });
+    }
+
+    return this;
+  }
+
+  $trigger(event, data, option) {
+    this.$wx.triggerEvent(event, { arguments: [data] }, option);
+  }
+}
+
+WepyComponent.prototype.$nextTick = renderNextTick;
diff --git a/packages/core/weapp/class/WepyConstructor.js b/packages/core/weapp/class/WepyConstructor.js
new file mode 100644
index 000000000..b58d38007
--- /dev/null
+++ b/packages/core/weapp/class/WepyConstructor.js
@@ -0,0 +1,20 @@
+import WepyComponent from './WepyComponent';
+import { initData } from '../init/data';
+import { initWatch } from '../init/watch';
+import { initComputed } from '../init/computed';
+
+export default class WepyConstructor extends WepyComponent {
+  constructor(opt = {}) {
+    super();
+    let vm = new WepyComponent();
+
+    // Only need data and watchers for a empty WepyComponent
+    if (opt.data) {
+      initData(vm, opt.data);
+    }
+    initWatch(vm);
+
+    initComputed(vm, opt.computed);
+    return vm;
+  }
+}
diff --git a/packages/core/weapp/class/WepyPage.js b/packages/core/weapp/class/WepyPage.js
new file mode 100644
index 000000000..829384396
--- /dev/null
+++ b/packages/core/weapp/class/WepyPage.js
@@ -0,0 +1,46 @@
+import WepyComponent from './WepyComponent';
+import { isStr, isNum, isObj, isUndef, isFunc } from '../../shared/index';
+
+export default class WepyPage extends WepyComponent {
+  $launch(url, params) {
+    this.$route('reLaunch', url, params);
+  }
+  $navigate(url, params) {
+    this.$route('navigate', url, params);
+  }
+
+  $redirect(url, params) {
+    this.$route('redirect', url, params);
+  }
+
+  $back(p = {}) {
+    if (isNum(p)) p = { delta: p };
+
+    if (!p.delta) p.delta = 1;
+
+    return wx.navigateBack(p);
+  }
+
+  $route(type, url, params = {}) {
+    let wxparams;
+    if (isStr(url)) {
+      let paramsList = [];
+      if (isObj(params)) {
+        for (let k in params) {
+          if (!isUndef(params[k])) {
+            paramsList.push(`${k}=${encodeURIComponent(params[k])}`);
+          }
+        }
+      }
+      if (paramsList.length) url = url + '?' + paramsList.join('&');
+
+      wxparams = { url: url };
+    } else {
+      wxparams = url;
+    }
+    let fn = wx[type] || wx[type + 'To'];
+    if (isFunc(fn)) {
+      return fn(wxparams);
+    }
+  }
+}
diff --git a/packages/core/weapp/config.js b/packages/core/weapp/config.js
new file mode 100644
index 000000000..772d2f5ba
--- /dev/null
+++ b/packages/core/weapp/config.js
@@ -0,0 +1,16 @@
+import {
+  WEAPP_LIFECYCLE,
+  WEAPP_APP_LIFECYCLE,
+  WEAPP_PAGE_LIFECYCLE,
+  WEAPP_COMPONENT_LIFECYCLE
+} from '../shared/constants';
+
+export const config = {
+  optionMergeStrategies: {},
+  constants: {
+    WEAPP_LIFECYCLE,
+    WEAPP_APP_LIFECYCLE,
+    WEAPP_PAGE_LIFECYCLE,
+    WEAPP_COMPONENT_LIFECYCLE
+  }
+};
diff --git a/packages/core/weapp/dispatcher/index.js b/packages/core/weapp/dispatcher/index.js
new file mode 100644
index 000000000..02a240fd3
--- /dev/null
+++ b/packages/core/weapp/dispatcher/index.js
@@ -0,0 +1,86 @@
+import Event from '../class/Event';
+import { callUserHook } from '../init/hooks';
+import { isFunc, camelize } from './../util/index';
+
+/**
+ * Transform wxml data-xx params to an array
+ */
+function transformParams(dataset, type, hasModel = false) {
+  let i = 0;
+  let params = [];
+  let modelParams = [];
+
+  let noParams = false;
+  let noModelParams = !hasModel;
+
+  const camelizedType = camelize(type);
+  while (i++ < 26 && (!noParams || !noModelParams)) {
+    let alpha = String.fromCharCode(64 + i);
+    if (!noParams) {
+      let key = 'wpy' + camelizedType + alpha;
+      if (!(key in dataset)) {
+        // it can be undefined;
+        noParams = true;
+      } else {
+        params.push(dataset[key]);
+      }
+    }
+    if (!noModelParams && hasModel) {
+      let modelKey = 'model' + alpha;
+      if (!(modelKey in dataset)) {
+        noModelParams = true;
+      } else {
+        modelParams.push(dataset[modelKey]);
+      }
+    }
+  }
+
+  return {
+    handler: params,
+    model: modelParams
+  };
+}
+
+export const dispatcher = function(e) {
+  const vm = this.$wepy;
+  const type = e.type;
+  // touchstart do not have currentTarget
+  const dataset = (e.currentTarget || e.target).dataset || {};
+  const evtid = dataset.wpyEvt;
+  const modelId = dataset.modelId;
+  const rel = vm.$rel || {};
+  const handler = rel.handlers && rel.handlers[evtid] && rel.handlers[evtid][type];
+  const model = rel.models && rel.models[modelId];
+
+  if (!handler && !model) {
+    return;
+  }
+
+  const params = transformParams(dataset, type, !!model);
+
+  // Call model method
+  if (model && type === model.type && isFunc(model.handler)) {
+    model.handler.call(vm, e.detail.value, params.model);
+  }
+
+  // Call handler method
+  if (isFunc(handler)) {
+    const $event = new Event(e);
+    const paramsWithEvent = params.handler.concat($event);
+    let args = (e.detail && e.detail.arguments) || [];
+
+    const hookRes = callUserHook(vm, 'before-event', {
+      event: $event,
+      params: paramsWithEvent,
+      args: args
+    });
+
+    if (hookRes === false) {
+      // Event cancelled.
+      return;
+    }
+    return handler.apply(vm, paramsWithEvent);
+  } else if (!model) {
+    throw new Error('Unrecognized event');
+  }
+};
diff --git a/packages/core/weapp/global.js b/packages/core/weapp/global.js
new file mode 100644
index 000000000..727ede2b8
--- /dev/null
+++ b/packages/core/weapp/global.js
@@ -0,0 +1 @@
+export default Object.create(null);
diff --git a/packages/core/weapp/init/computed.js b/packages/core/weapp/init/computed.js
new file mode 100644
index 000000000..47bdf83b7
--- /dev/null
+++ b/packages/core/weapp/init/computed.js
@@ -0,0 +1,61 @@
+import Watcher from './../observer/watcher';
+import Dep from './../observer/dep';
+import { sharedPropertyDefinition } from './data';
+
+function createComputedGetter(key) {
+  return function computedGetter() {
+    let watcher = this._computedWatchers && this._computedWatchers[key];
+    if (watcher) {
+      watcher.key = key;
+      if (watcher.dirty) {
+        watcher.evaluate();
+      }
+      if (Dep.target) {
+        watcher.depend();
+      }
+      return watcher.value;
+    }
+  };
+}
+
+/*
+ * init computed
+ */
+export function initComputed(vm, computed) {
+  if (!computed) {
+    return;
+  }
+  let watchers = (vm._computedWatchers = Object.create(null));
+  let computedWatcherOptions = { computed: true };
+
+  Object.keys(computed).forEach(key => {
+    let def = computed[key];
+    let getter = typeof def === 'object' ? def.get : def;
+
+    if (!getter || typeof getter !== 'function') {
+      // eslint-disable-next-line
+      console.error(`Getter is missing for computed property "${key}"`);
+    }
+
+    // push to dirty after dep called.
+    watchers[key] = new Watcher(
+      vm,
+      getter || function() {},
+      function() {
+        // evaluate will set dirty
+        // vm.$dirty.push(key, key, newv);
+      },
+      computedWatcherOptions
+    );
+
+    if (typeof def === 'function') {
+      sharedPropertyDefinition.get = createComputedGetter(key);
+      sharedPropertyDefinition.set = function() {};
+    } else {
+      sharedPropertyDefinition.get = def.cache !== false ? createComputedGetter(key) : def.get;
+      sharedPropertyDefinition.set = def.set;
+    }
+
+    Object.defineProperty(vm, key, sharedPropertyDefinition);
+  });
+}
diff --git a/packages/core/weapp/init/data.js b/packages/core/weapp/init/data.js
new file mode 100644
index 000000000..ec352e2e0
--- /dev/null
+++ b/packages/core/weapp/init/data.js
@@ -0,0 +1,57 @@
+import { observe } from './../observer/index';
+import { noop, clone } from './../../shared/index';
+
+export const sharedPropertyDefinition = {
+  enumerable: true,
+  configurable: true,
+  get: noop,
+  set: noop
+};
+
+export function proxy(target, sourceKey, key) {
+  sharedPropertyDefinition.get = function proxyGetter() {
+    return this[sourceKey][key];
+  };
+  sharedPropertyDefinition.set = function proxySetter(val) {
+    this[sourceKey][key] = val;
+  };
+  Object.defineProperty(target, key, sharedPropertyDefinition);
+}
+
+/*
+ * patch data option
+ */
+export function patchData(output, data) {
+  if (!data) {
+    data = {};
+  }
+  output.data = data;
+}
+
+/*
+ * init data
+ */
+export function initData(vm, data) {
+  if (!data) {
+    data = {};
+  }
+  let _data;
+  if (typeof data === 'function') {
+    _data = data.call(vm);
+  } else {
+    _data = clone(data);
+  }
+  vm._data = _data;
+  Object.keys(_data).forEach(key => {
+    proxy(vm, '_data', key);
+  });
+
+  observe({
+    vm: vm,
+    key: '',
+    value: _data,
+    parent: '',
+    root: true
+  });
+  //observe(vm, _data, null, true);
+}
diff --git a/packages/core/weapp/init/hooks.js b/packages/core/weapp/init/hooks.js
new file mode 100644
index 000000000..57333005a
--- /dev/null
+++ b/packages/core/weapp/init/hooks.js
@@ -0,0 +1,30 @@
+import { isFunc, isUndef, warn } from './../util/index';
+
+export function callUserHook(vm, hookName, arg) {
+  const pageHook = vm.hooks ? vm.hooks[hookName] : null;
+  const appHook = vm.$app && vm.$app.hooks ? vm.$app.hooks[hookName] : null;
+
+  if (!vm.$app) {
+    warn('$app is not initialized in this Component', vm);
+  }
+
+  let result = arg;
+
+  // First run page hook, and then run app hook
+  // Pass page hook result to app hook
+  // If return undefined, then return default argument
+  [pageHook, appHook].forEach(fn => {
+    if (isFunc(fn)) {
+      result = fn.call(vm, result);
+      if (isUndef(result)) {
+        result = arg;
+      }
+    }
+  });
+
+  return result;
+}
+
+export function initHooks(vm, hooks = {}) {
+  vm.hooks = hooks;
+}
diff --git a/packages/core/weapp/init/index.js b/packages/core/weapp/init/index.js
new file mode 100644
index 000000000..8d4098556
--- /dev/null
+++ b/packages/core/weapp/init/index.js
@@ -0,0 +1,9 @@
+export * from './data';
+export * from './computed';
+export * from './lifecycle';
+export * from './methods';
+export * from './watch';
+export * from './props';
+export * from './mixins';
+export * from './hooks';
+export * from './relations';
diff --git a/packages/core/weapp/init/lifecycle.js b/packages/core/weapp/init/lifecycle.js
new file mode 100644
index 000000000..6602bf9c2
--- /dev/null
+++ b/packages/core/weapp/init/lifecycle.js
@@ -0,0 +1,317 @@
+import WepyApp from '../class/WepyApp';
+import WepyPage from '../class/WepyPage';
+import WepyComponent from '../class/WepyComponent';
+import { initHooks } from './hooks';
+import { initProps } from './props';
+import { initWatch } from './watch';
+import { initRender } from './render';
+import { initData } from './data';
+import { initComputed } from './computed';
+import { initMethods } from './methods';
+import { isArr, isFunc, isStr } from '../../shared/index';
+import Dirty from '../class/Dirty';
+import {
+  WEAPP_APP_LIFECYCLE,
+  WEAPP_PAGE_LIFECYCLE,
+  WEAPP_COMPONENT_LIFECYCLE,
+  WEAPP_COMPONENT_PAGE_LIFECYCLE
+} from '../../shared/index';
+import { warn } from '../util/index';
+
+let comid = 0;
+let app;
+
+const callUserMethod = function(vm, userOpt, method, args) {
+  let result;
+  let methods = userOpt[method];
+  if (isFunc(methods)) {
+    result = userOpt[method].apply(vm, args);
+  } else if (isArr(methods)) {
+    for (let i in methods) {
+      if (isFunc(methods[i])) {
+        result = methods[i].apply(vm, args);
+      }
+    }
+  }
+  return result;
+};
+
+export const getLifeCycle = (defaultLifecycle, rel, type) => {
+  let lifecycle = defaultLifecycle.concat([]);
+  if (rel && rel.lifecycle && rel.lifecycle[type]) {
+    let userDefinedLifecycle = [];
+    const modifiedLifeCycles = rel.lifecycle[type];
+
+    if (isStr(modifiedLifeCycles) || isArr(modifiedLifeCycles)) {
+      userDefinedLifecycle = userDefinedLifecycle.concat(modifiedLifeCycles);
+      userDefinedLifecycle.forEach(u => {
+        if (lifecycle.indexOf(u) > -1) {
+          warn(`'${u}' is already implemented in current version, please remove it from your lifecycle config`);
+        } else {
+          lifecycle.push(u);
+        }
+      });
+    } else if (isFunc(modifiedLifeCycles)) {
+      lifecycle = modifiedLifeCycles.call(null, lifecycle);
+    }
+  }
+  return lifecycle;
+};
+
+/*
+ * patch app lifecyle
+ */
+export function patchAppLifecycle(appConfig, options, rel = {}) {
+  appConfig.onLaunch = function(...args) {
+    let vm = new WepyApp();
+    app = vm;
+    vm.$options = options;
+    vm.$route = null; // default route is null
+    vm.$rel = rel;
+
+    vm.$wx = this;
+    this.$wepy = vm;
+
+    initHooks(vm, options.hooks);
+
+    initMethods(vm, options.methods);
+
+    return callUserMethod(vm, vm.$options, 'onLaunch', args);
+  };
+
+  let lifecycle = getLifeCycle(WEAPP_APP_LIFECYCLE, rel, 'app');
+
+  lifecycle.forEach(k => {
+    // it's not defined already && user defined it && it's an array or function
+    if (!appConfig[k] && options[k] && (isFunc(options[k]) || isArr(options[k]))) {
+      appConfig[k] = function(...args) {
+        return callUserMethod(app, app.$options, k, args);
+      };
+    }
+  });
+}
+
+export function patchLifecycle(output, options, rel, isComponent) {
+  const initClass = isComponent ? WepyComponent : WepyPage;
+  const initLifecycle = function(...args) {
+    let vm = new initClass();
+
+    vm.$dirty = new Dirty('path');
+    vm.$children = [];
+    vm.$refs = {};
+
+    this.$wepy = vm;
+    vm.$wx = this;
+    vm.$is = this.is;
+    vm.$options = options;
+    vm.$rel = rel;
+    vm._watchers = [];
+    if (!isComponent) {
+      vm.$root = vm;
+    }
+    if (app) {
+      vm.$app = app;
+    }
+    if (this.is === 'custom-tab-bar/index') {
+      vm.$app = app;
+      vm.$parent = app;
+    }
+
+    vm.$id = ++comid + (isComponent ? '.1' : '.0');
+    if (!vm.$app) {
+      // vm.$app = $global.$app;
+    }
+
+    callUserMethod(vm, vm.$options, 'beforeCreate', args);
+
+    initHooks(vm, options.hooks);
+
+    initProps(vm, output.properties);
+
+    initData(vm, output.data, isComponent);
+
+    initMethods(vm, options.methods);
+
+    initComputed(vm, options.computed, true);
+
+    initWatch(vm, options.watch);
+
+    // create render watcher
+    initRender(
+      vm,
+      Object.keys(vm._data)
+        .concat(Object.keys(vm._props))
+        .concat(Object.keys(vm._computedWatchers || {})),
+      Object.keys(vm._computedWatchers || {})
+    );
+
+    return callUserMethod(vm, vm.$options, 'created', args);
+  };
+
+  output.created = initLifecycle;
+  if (isComponent) {
+    patchComponentLifecycle(output, options, rel);
+  } else {
+    patchPageLifecycle(output, options, rel);
+  }
+
+  // Common patch
+  let lifecycle = getLifeCycle(WEAPP_COMPONENT_LIFECYCLE, rel, 'component');
+
+  lifecycle.forEach(k => {
+    // beforeCreate is not a real lifecycle
+    if (!output[k] && k !== 'beforeCreate' && (isFunc(options[k]) || isArr(options[k]))) {
+      output[k] = function(...args) {
+        return callUserMethod(this.$wepy, this.$wepy.$options, k, args);
+      };
+    }
+  });
+}
+
+/**
+ * Patch component life cycle
+ * @param {*} output patch output
+ * @param {*} options patch options
+ * @param {*} rel patch rel
+ */
+function patchComponentLifecycle(output, options, rel) {
+  output.attached = function(...args) {
+    // Component attached
+    let outProps = output.properties || {};
+    // this.propperties are includes datas
+    let acceptProps = this.properties;
+    let vm = this.$wepy;
+
+    this.triggerEvent('_init', vm);
+
+    // created 不能调用 setData，如果有 dirty 在此更新
+    vm.$forceUpdate();
+
+    Object.keys(outProps).forEach(k => (vm[k] = acceptProps[k]));
+
+    return callUserMethod(vm, vm.$options, 'attached', args);
+  };
+
+  // 增加组件页面声明周期
+  output.pageLifetimes = {};
+  const lifecycle = getLifeCycle(WEAPP_COMPONENT_PAGE_LIFECYCLE, rel, 'component');
+
+  lifecycle.forEach(function(k) {
+    if (!output.pageLifetimes[k] && options[k] && (isFunc(options[k]) || isArr(options[k]))) {
+      output.pageLifetimes[k] = function(...args) {
+        return callUserMethod(this.$wepy, this.$wepy.$options, k, args);
+      };
+    }
+  });
+}
+
+/**
+ * Patch Page Life cycle
+ * @param {*} output patch output
+ * @param {*} options patch options
+ * @param {*} rel rel
+ */
+function patchPageLifecycle(output, options, rel) {
+  output.attached = function(...args) {
+    // Page attached
+    let vm = this.$wepy;
+    let app = vm.$app;
+
+    let refs = rel.refs || [];
+    let query = wx.createSelectorQuery();
+
+    refs.forEach(item => {
+      // {
+      //   id: { name: 'hello', bind: true },
+      //   ref: { name: 'value', bind: false }
+      // }
+      let idAttr = item.id;
+      let refAttr = item.ref;
+      let actualAttrIdName = idAttr.name;
+      let actualAttrRefName = refAttr.name;
+      let selector = `#${actualAttrIdName}`;
+
+      if (idAttr.bind) {
+        // if id is a bind attr
+        actualAttrIdName = vm[idAttr.name];
+        selector = `#${actualAttrIdName}`;
+        vm.$watch(idAttr.name, function(newAttrName) {
+          actualAttrIdName = newAttrName;
+          selector = `#${actualAttrIdName}`;
+          vm.$refs[actualAttrRefName] = query.select(selector);
+        });
+      }
+
+      if (refAttr.bind) {
+        // if ref is a bind attr
+        actualAttrRefName = vm[refAttr.name];
+
+        vm.$watch(refAttr.name, function(newAttrName, oldAttrName) {
+          actualAttrRefName = newAttrName;
+          vm.$refs[oldAttrName] = null;
+          vm.$refs[newAttrName] = query.select(selector);
+        });
+      }
+      vm.$refs[actualAttrRefName] = query.select(selector);
+    });
+
+    // created 不能调用 setData，如果有 dirty 在此更新
+    vm.$forceUpdate();
+
+    // TODO: page attached
+    return callUserMethod(vm, vm.$options, 'attached', args);
+  };
+  // Page lifecycle will be called under methods
+  // e.g:
+  // Component({
+  //   methods: {
+  //     onLoad () {
+  //       console.log('page onload')
+  //     }
+  //   }
+  // })
+
+  // Patch routed method
+  patchRouted(output);
+
+  let lifecycle = getLifeCycle(WEAPP_PAGE_LIFECYCLE, rel, 'page');
+
+  lifecycle.forEach(k => {
+    if (!output[k] && options[k] && (isFunc(options[k]) || isArr(options[k]))) {
+      // onShow is patched in routed method
+      if (k !== 'onShow') {
+        output.methods[k] = function(...args) {
+          return callUserMethod(this.$wepy, this.$wepy.$options, k, args);
+        };
+      }
+    }
+  });
+}
+/**
+ * Add routed method for user.
+ * @param {*} output patch output
+ */
+function patchRouted(output) {
+  output.methods.onShow = function(...args) {
+    // Page attached
+    let vm = this.$wepy;
+    let app = vm.$app;
+    // eslint-disable-next-line
+    const pages = getCurrentPages();
+    const currentPage = pages[pages.length - 1];
+    const path = currentPage.__route__ || currentPage.route;
+    const webViewId = currentPage.__wxWebviewId__;
+
+    if (!app.$route || app.$route.path !== path) {
+      const oldRoute = app.$route;
+      const newRoute = {
+        path,
+        webViewId,
+        page: currentPage,
+        query: currentPage.options
+      };
+      app.$route = newRoute;
+      callUserMethod(vm, vm.$options, 'routed', [oldRoute, newRoute]);
+    }
+  };
+}
diff --git a/packages/core/weapp/init/methods.js b/packages/core/weapp/init/methods.js
new file mode 100644
index 000000000..26bc9571e
--- /dev/null
+++ b/packages/core/weapp/init/methods.js
@@ -0,0 +1,48 @@
+import { warn } from './../util/index';
+import { dispatcher } from '../dispatcher/index';
+
+/*
+ * initialize page methods, also the app
+ */
+export function initMethods(vm, methods) {
+  if (methods) {
+    Object.keys(methods).forEach(method => {
+      vm[method] = methods[method];
+    });
+  }
+}
+
+/*
+ * patch method option
+ */
+export function patchMethods(output, methods) {
+  output.methods = {};
+  let target = output.methods;
+
+  target.__initComponent = function(e) {
+    let child = e.detail;
+    let { ref, wpyEvt } = e.target.dataset;
+    let vm = this.$wepy;
+    vm.$children.push(child);
+    if (ref) {
+      if (vm.$refs[ref]) {
+        warn('duplicate ref "' + ref + '" will be covered by the last instance.\n', vm);
+      }
+      vm.$refs[ref] = child;
+    }
+    child.$evtId = wpyEvt;
+    child.$parent = vm;
+    child.$app = vm.$app;
+    child.$root = vm.$root;
+    return vm;
+  };
+  target.__dispatcher = dispatcher;
+
+  // TODO: perf
+  // Only orginal component method goes to target. no need to add all methods.
+  if (methods) {
+    Object.keys(methods).forEach(method => {
+      target[method] = methods[method];
+    });
+  }
+}
diff --git a/packages/core/weapp/init/mixins.js b/packages/core/weapp/init/mixins.js
new file mode 100644
index 000000000..52fa60ead
--- /dev/null
+++ b/packages/core/weapp/init/mixins.js
@@ -0,0 +1,108 @@
+import { isArr } from '../../shared/index';
+import { WEAPP_LIFECYCLE } from '../../shared/index';
+import { config } from '../config';
+import $global from '../global';
+
+// [Default Strategy]
+// Update if it's not exist in output. Can be replaced by option[key].
+// e.g.
+// export default {
+//   myCustomMethod () {
+//     // doSomething
+//   }
+// }
+//
+// [Merge Strategy]
+// Replaced by the latest mixins property.
+// e.g.
+// export default {
+//   data: {
+//     a: 1
+//   }
+// }
+//
+// [Lifecycle Strategy]
+// Extend lifecycle. update lifecycle to an array.
+// e.g.
+// export default {
+//   onShow: {
+//     console.log('onShow');
+//   }
+// }
+let globalMixinPatched = false;
+
+let strats = null;
+
+function getStrategy(key) {
+  if (!strats) {
+    initStrats();
+  }
+  if (strats[key]) {
+    return strats[key];
+  } else {
+    return defaultStrat;
+  }
+}
+function defaultStrat(output, option, key, data) {
+  if (!output[key]) {
+    output[key] = data;
+  }
+}
+
+function simpleMerge(parentVal, childVal) {
+  return !parentVal || !childVal ? parentVal || childVal : Object.assign({}, parentVal, childVal);
+}
+
+function initStrats() {
+  if (strats) return strats;
+
+  strats = config.optionMergeStrategies;
+
+  strats.data = strats.props = strats.methods = strats.computed = strats.watch = strats.hooks = function mergeStrategy(
+    output,
+    option,
+    key,
+    data
+  ) {
+    option[key] = simpleMerge(option[key], data);
+  };
+
+  WEAPP_LIFECYCLE.forEach(lifecycle => {
+    if (!strats[lifecycle]) {
+      strats[lifecycle] = function lifeCycleStrategy(output, option, key, data) {
+        if (!option[key]) {
+          option[key] = isArr(data) ? data : [data];
+        } else {
+          option[key] = [data].concat(option[key]);
+        }
+      };
+    }
+  });
+}
+
+export function patchMixins(output, option, mixins) {
+  if (!mixins && !$global.mixin) {
+    return;
+  }
+
+  if (!globalMixinPatched) {
+    let globalMixin = $global.mixin || [];
+
+    mixins = globalMixin.concat(mixins);
+    globalMixinPatched = true;
+  }
+
+  if (isArr(mixins)) {
+    mixins.forEach(mixin => patchMixins(output, option, mixin));
+    globalMixinPatched = false;
+  } else {
+    if (!strats) {
+      initStrats();
+    }
+    for (let k in mixins) {
+      strat = getStrategy(k);
+      let strat = strats[k] || defaultStrat;
+      strat(output, option, k, mixins[k]);
+    }
+  }
+}
diff --git a/packages/core/weapp/init/props.js b/packages/core/weapp/init/props.js
new file mode 100644
index 000000000..35bbeefec
--- /dev/null
+++ b/packages/core/weapp/init/props.js
@@ -0,0 +1,109 @@
+import { observe } from './../observer/index';
+import { proxy } from './data';
+import { isFunc, isArr, isStr, isObj, isUndef } from './../util/index';
+
+const AllowedTypes = [String, Number, Boolean, Object, Array, null];
+
+const observerFn = function() {
+  return function(newVal, oldVal, changedPaths) {
+    let vm = this.$wepy;
+
+    // changedPaths 长度大于 1，说明是由内部赋值改变的 prop
+    if (changedPaths.length > 1) {
+      return;
+    }
+    let _data = newVal;
+    if (typeof _data === 'function') {
+      _data = _data.call(vm);
+    }
+    vm[changedPaths[0]] = _data;
+  };
+};
+/*
+ * patch props option
+ */
+export function patchProps(output, props) {
+  let newProps = {};
+  if (isStr(props)) {
+    newProps = [props];
+  }
+  if (isArr(props)) {
+    props.forEach(prop => {
+      newProps[prop] = {
+        type: null,
+        observer: observerFn(output, props, prop)
+      };
+    });
+  } else if (isObj(props)) {
+    for (let k in props) {
+      let prop = props[k];
+      let newProp = {};
+
+      // props.type
+      if (isUndef(prop.type)) {
+        newProp.type = null;
+      } else if (isArr(prop.type)) {
+        newProp.optionalTypes = prop.type;
+        newProp.type = prop.type[0];
+      } else if (AllowedTypes.indexOf(prop.type) === -1) {
+        newProp.type = null;
+        // eslint-disable-next-line
+        console.warn(
+          `Type property of props "${k}" is invalid. Only String/Number/Boolean/Object/Array/null is allowed in weapp Component`
+        );
+      } else {
+        newProp.type = prop.type;
+      }
+
+      // props.default
+      if (!isUndef(prop.default)) {
+        if (isFunc(prop.default)) {
+          newProp.value = prop.default.call(output);
+        } else {
+          newProp.value = prop.default;
+        }
+      }
+      // props.optionalTypes
+      if (!isUndef(prop.optionalTypes)) {
+        if (isArr(prop.optionalTypes)) {
+          newProp.optionalTypes = prop.optionalTypes;
+        }
+      }
+      // TODO
+      // props.validator
+      // props.required
+
+      newProp.observer = observerFn(output, props, prop);
+
+      newProps[k] = newProp;
+    }
+  }
+
+  // eslint-disable-next-line
+  Object.keys(newProps).forEach(prop => {});
+
+  output.properties = newProps;
+}
+
+/*
+ * init props
+ */
+export function initProps(vm, properties) {
+  vm._props = {};
+
+  if (!properties) {
+    return;
+  }
+
+  Object.keys(properties).forEach(key => {
+    vm._props[key] = properties[key].value;
+    proxy(vm, '_props', key);
+  });
+
+  observe({
+    vm: vm,
+    key: '',
+    value: vm._props,
+    root: true
+  });
+}
diff --git a/packages/core/weapp/init/relations.js b/packages/core/weapp/init/relations.js
new file mode 100644
index 000000000..69aaed740
--- /dev/null
+++ b/packages/core/weapp/init/relations.js
@@ -0,0 +1,6 @@
+export function patchRelations(output, relations) {
+  if (!relations) {
+    relations = {};
+  }
+  output.relations = relations;
+}
diff --git a/packages/core/weapp/init/render.js b/packages/core/weapp/init/render.js
new file mode 100644
index 000000000..fae84b3dd
--- /dev/null
+++ b/packages/core/weapp/init/render.js
@@ -0,0 +1,56 @@
+import Watcher from './../observer/watcher';
+import { callUserHook } from './hooks';
+import { clone } from './../util/index';
+import { renderFlushCallbacks } from './../util/next-tick';
+
+export function resetDirty(vm) {
+  vm.$dirtyKey = {};
+  vm.$dirtyPath = {};
+}
+
+export function initRender(vm, keys, computedKeys) {
+  vm._init = false;
+  let dirtyFromAttach = null;
+  return new Watcher(
+    vm,
+    function() {
+      if (!vm._init) {
+        keys.forEach(key => clone(vm[key]));
+      }
+
+      if (vm.$dirty.length() || dirtyFromAttach) {
+        let keys = vm.$dirty.get('key');
+        computedKeys.forEach(key => vm[key]);
+        let dirty = vm.$dirty.pop();
+
+        // TODO: reset subs
+        Object.keys(keys).forEach(key => clone(vm[key]));
+
+        if (vm._init) {
+          dirty = callUserHook(vm, 'before-setData', dirty);
+        }
+
+        // vm._fromSelf = true;
+        if (dirty || dirtyFromAttach) {
+          // init render is in lifecycle, setData in lifecycle will not work, so cacheData is needed.
+          if (!vm._init) {
+            if (dirtyFromAttach === null) {
+              dirtyFromAttach = {};
+            }
+            Object.assign(dirtyFromAttach, dirty);
+          } else if (dirtyFromAttach) {
+            // setData in attached
+            vm.$wx.setData(Object.assign(dirtyFromAttach, dirty || {}), renderFlushCallbacks);
+            dirtyFromAttach = null;
+          } else {
+            vm.$wx.setData(dirty, renderFlushCallbacks);
+          }
+        }
+      }
+      vm._init = true;
+    },
+    function() {},
+    null,
+    true
+  );
+}
diff --git a/packages/core/weapp/init/watch.js b/packages/core/weapp/init/watch.js
new file mode 100644
index 000000000..099e77c00
--- /dev/null
+++ b/packages/core/weapp/init/watch.js
@@ -0,0 +1,7 @@
+export function initWatch(vm, watch) {
+  if (watch) {
+    Object.keys(watch).forEach(key => {
+      vm.$watch(key, watch[key]);
+    });
+  }
+}
diff --git a/packages/core/weapp/native/app.js b/packages/core/weapp/native/app.js
new file mode 100644
index 000000000..66cb54559
--- /dev/null
+++ b/packages/core/weapp/native/app.js
@@ -0,0 +1,10 @@
+import { patchMixins, patchAppLifecycle } from '../init/index';
+
+export function app(option, rel) {
+  let appConfig = {};
+
+  patchMixins(appConfig, option, option.mixins);
+  patchAppLifecycle(appConfig, option, rel);
+
+  return App(appConfig);
+}
diff --git a/packages/core/weapp/native/component.js b/packages/core/weapp/native/component.js
new file mode 100644
index 000000000..b03fcffe3
--- /dev/null
+++ b/packages/core/weapp/native/component.js
@@ -0,0 +1,32 @@
+import { patchMixins, patchMethods, patchData, patchLifecycle, patchProps, patchRelations } from '../init/index';
+
+export function component(opt = {}, rel) {
+  let compConfig = {
+    externalClasses: opt.externalClasses || [],
+    // support component options property
+    // example: options: {addGlobalClass:true}
+    options: opt.options || {}
+  };
+
+  patchMixins(compConfig, opt, opt.mixins);
+
+  if (opt.properties) {
+    compConfig.properties = opt.properties;
+    if (opt.props) {
+      // eslint-disable-next-line no-console
+      console.warn(`props will be ignore, if properties is set`);
+    }
+  } else if (opt.props) {
+    patchProps(compConfig, opt.props);
+  }
+
+  patchMethods(compConfig, opt.methods, true);
+
+  patchData(compConfig, opt.data, true);
+
+  patchRelations(compConfig, opt.relations);
+
+  patchLifecycle(compConfig, opt, rel, true);
+
+  return Component(compConfig);
+}
diff --git a/packages/core/weapp/native/index.js b/packages/core/weapp/native/index.js
new file mode 100644
index 000000000..b5bce1f40
--- /dev/null
+++ b/packages/core/weapp/native/index.js
@@ -0,0 +1,3 @@
+export * from './app';
+export * from './component';
+export * from './page';
diff --git a/packages/core/weapp/native/page.js b/packages/core/weapp/native/page.js
new file mode 100644
index 000000000..01cf75d05
--- /dev/null
+++ b/packages/core/weapp/native/page.js
@@ -0,0 +1,30 @@
+import { patchMixins, patchData, patchMethods, patchLifecycle, patchProps } from '../init/index';
+
+export function page(opt = {}, rel) {
+  let pageConfig = {
+    externalClasses: opt.externalClasses || [],
+    // support component options property
+    // example: options: {addGlobalClass:true}
+    options: opt.options || {}
+  };
+
+  patchMixins(pageConfig, opt, opt.mixins);
+
+  if (opt.properties) {
+    pageConfig.properties = opt.properties;
+    if (opt.props) {
+      // eslint-disable-next-line
+      console.warn(`props will be ignore, if properties is set`);
+    }
+  } else if (opt.props) {
+    patchProps(pageConfig, opt.props);
+  }
+
+  patchMethods(pageConfig, opt.methods);
+
+  patchData(pageConfig, opt.data);
+
+  patchLifecycle(pageConfig, opt, rel);
+
+  return Component(pageConfig);
+}
diff --git a/packages/core/weapp/observer/array.js b/packages/core/weapp/observer/array.js
new file mode 100644
index 000000000..959e35d47
--- /dev/null
+++ b/packages/core/weapp/observer/array.js
@@ -0,0 +1,68 @@
+/*
+ * not type checking this file because flow doesn't play well with
+ * dynamically accessing methods on Array prototype
+ */
+
+import { def, hasOwn, isObject } from '../util/index';
+import { cleanPaths } from './observerPath';
+
+const arrayProto = Array.prototype;
+export const arrayMethods = Object.create(arrayProto);
+
+const methodsToPatch = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'];
+
+/**
+ * Intercept mutating methods and emit events
+ */
+methodsToPatch.forEach(function(method) {
+  // cache original method
+  const original = arrayProto[method];
+  def(arrayMethods, method, function mutator(...args) {
+    const len = this.length;
+    // 清除已经失效的 paths
+    if (len > 0) {
+      switch (method) {
+        case 'pop':
+          delInvalidPaths(len - 1, this[len - 1], this);
+          break;
+        case 'shift':
+          delInvalidPaths(0, this[0], this);
+          break;
+        case 'splice':
+        case 'sort':
+        case 'reverse':
+          for (let i = 0; i < this.length; i++) {
+            delInvalidPaths(i, this[i], this);
+          }
+      }
+    }
+
+    const result = original.apply(this, args);
+    const ob = this.__ob__;
+    const vm = ob.vm;
+
+    // push parent key to dirty, wait to setData
+    if (vm.$dirty) {
+      if (method === 'push') {
+        const lastIndex = ob.value.length - 1;
+        vm.$dirty.set(ob.op, lastIndex, ob.value[lastIndex]);
+      } else {
+        vm.$dirty.set(ob.op, null, ob.value);
+      }
+    }
+
+    // 这里和 vue 不一样，所有变异方法都需要更新 path
+    ob.observeArray(ob.key, ob.value);
+
+    // notify change
+    ob.dep.notify();
+    return result;
+  });
+});
+
+function delInvalidPaths(key, value, parent) {
+  if (isObject(value) && hasOwn(value, '__ob__')) {
+    // delete invalid paths
+    cleanPaths(key, value.__ob__.op, parent.__ob__.op);
+  }
+}
diff --git a/packages/core/weapp/observer/dep.js b/packages/core/weapp/observer/dep.js
new file mode 100644
index 000000000..34e6799f1
--- /dev/null
+++ b/packages/core/weapp/observer/dep.js
@@ -0,0 +1,52 @@
+// import type Watcher from './watcher'
+import { remove } from '../util/index';
+
+let uid = 0;
+
+/**
+ * A dep is an observable that can have multiple
+ * directives subscribing to it.
+ */
+export default class Dep {
+  constructor() {
+    this.id = uid++;
+    this.subs = [];
+  }
+
+  addSub(sub) {
+    this.subs.push(sub);
+  }
+
+  removeSub(sub) {
+    remove(this.subs, sub);
+  }
+
+  depend() {
+    if (Dep.target) {
+      Dep.target.addDep(this);
+    }
+  }
+
+  notify() {
+    // stabilize the subscriber list first
+    const subs = this.subs.slice();
+    for (let i = 0, l = subs.length; i < l; i++) {
+      subs[i].update();
+    }
+  }
+}
+
+// the current target watcher being evaluated.
+// this is globally unique because there could be only one
+// watcher being evaluated at any time.
+Dep.target = null;
+const targetStack = [];
+
+export function pushTarget(_target) {
+  if (Dep.target) targetStack.push(Dep.target);
+  Dep.target = _target;
+}
+
+export function popTarget() {
+  Dep.target = targetStack.pop();
+}
diff --git a/packages/core/weapp/observer/index.js b/packages/core/weapp/observer/index.js
new file mode 100644
index 000000000..729e16e62
--- /dev/null
+++ b/packages/core/weapp/observer/index.js
@@ -0,0 +1,325 @@
+import Dep from './dep';
+import ObserverPath, { addPaths, cleanPaths } from './observerPath';
+import { arrayMethods } from './array';
+import { def, warn, hasOwn, hasProto, isObject, isPlainObject, isValidArrayIndex } from '../util/index';
+
+const arrayKeys = Object.getOwnPropertyNames(arrayMethods);
+
+/**
+ * By default, when a reactive property is set, the new value is
+ * also converted to become reactive. However when passing down props,
+ * we don't want to force conversion because the value may be a nested value
+ * under a frozen data structure. Converting it would defeat the optimization.
+ */
+export const observerState = {
+  shouldConvert: true
+};
+
+/**
+ * Observer class that are attached to each observed
+ * object. Once attached, the observer converts target
+ * object's property keys into getter/setters that
+ * collect dependencies and dispatches updates.
+ */
+export class Observer {
+  constructor({ vm, key, value, parent }) {
+    this.value = value;
+    this.dep = new Dep();
+    this.vmCount = 0;
+    this.vm = vm;
+    this.op = new ObserverPath(key, this, parent && parent.__ob__ && parent.__ob__.op);
+
+    def(value, '__ob__', this);
+    if (Array.isArray(value)) {
+      const augment = hasProto ? protoAugment : copyAugment;
+      augment(value, arrayMethods, arrayKeys);
+      this.observeArray(key, value);
+    } else {
+      this.walk(key, value);
+    }
+  }
+
+  /**
+   * Walk through each property and convert them into
+   * getter/setters. This method should only be called when
+   * value type is Object.
+   */
+  walk(key, obj) {
+    const keys = Object.keys(obj);
+    for (let i = 0; i < keys.length; i++) {
+      defineReactive({ vm: this.vm, obj: obj, key: keys[i], value: obj[keys[i]], parent: obj });
+      //defineReactive(this.vm, obj, keys[i], obj[keys[i]]);
+    }
+  }
+
+  /**
+   * Observe a list of Array items.
+   */
+  observeArray(key, items) {
+    for (let i = 0, l = items.length; i < l; i++) {
+      observe({ vm: this.vm, key: i, value: items[i], parent: items });
+    }
+  }
+
+  /**
+   * Check if path exsit in vm
+   */
+  hasPath(path) {
+    let value = this.vm;
+    let key = '';
+    let i = 0;
+    while (i < path.length) {
+      if (path[i] !== '.' && path[i] !== '[' && path[i] !== ']') {
+        key += path[i];
+      } else if (key.length !== 0) {
+        value = value[key];
+        key = '';
+        if (!isObject(value)) {
+          return false;
+        }
+      }
+      i++;
+    }
+    return true;
+  }
+
+  /**
+   * Is this path value equal
+   */
+  isPathEq(path, value) {
+    let objValue = this.vm;
+    let key = '';
+    let i = 0;
+    while (i < path.length) {
+      if (path[i] !== '.' && path[i] !== '[' && path[i] !== ']') {
+        key += path[i];
+      } else if (key.length !== 0) {
+        objValue = objValue[key];
+        key = '';
+        if (!isObject(objValue)) {
+          return false;
+        }
+      }
+      i++;
+    }
+    if (key.length !== 0) {
+      objValue = objValue[key];
+    }
+    return value === objValue;
+  }
+}
+
+// helpers
+
+/**
+ * Augment an target Object or Array by intercepting
+ * the prototype chain using __proto__
+ */
+function protoAugment(target, src) {
+  /* eslint-disable no-proto */
+  target.__proto__ = src;
+  /* eslint-enable no-proto */
+}
+
+/**
+ * Augment an target Object or Array by defining
+ * hidden properties.
+ */
+/* istanbul ignore next */
+function copyAugment(target, src, keys) {
+  for (let i = 0, l = keys.length; i < l; i++) {
+    const key = keys[i];
+    def(target, key, src[key]);
+  }
+}
+
+/**
+ * Attempt to create an observer instance for a value,
+ * returns the new observer if successfully observed,
+ * or the existing observer if the value already has one.
+ */
+export function observe({ vm, key, value, parent, root }) {
+  if (!isObject(value)) {
+    return;
+  }
+  let ob;
+  if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
+    ob = value.__ob__;
+    const op = ob.op;
+    addPaths(key, op, parent.__ob__.op);
+  } else if (
+    observerState.shouldConvert &&
+    (Array.isArray(value) || isPlainObject(value)) &&
+    Object.isExtensible(value) &&
+    !value._isVue
+  ) {
+    ob = new Observer({ vm: vm, key: key, value: value, parent: parent });
+  }
+  if (root && ob) {
+    ob.vmCount++;
+  }
+  return ob;
+}
+
+/**
+ * Define a reactive property on an Object.
+ */
+export function defineReactive({ vm, obj, key, value, parent, customSetter, shallow }) {
+  const dep = new Dep();
+
+  const property = Object.getOwnPropertyDescriptor(obj, key);
+  if (property && property.configurable === false) {
+    return;
+  }
+
+  // cater for pre-defined getter/setters
+  const getter = property && property.get;
+  if (!getter && arguments.length === 2) {
+    value = obj[key];
+  }
+  const setter = property && property.set;
+
+  let childOb = !shallow && observe({ vm: vm, key: key, value: value, parent: obj });
+  Object.defineProperty(obj, key, {
+    enumerable: true,
+    configurable: true,
+    get: function reactiveGetter() {
+      const val = getter ? getter.call(obj) : value;
+      if (Dep.target) {
+        dep.depend();
+        if (childOb) {
+          childOb.dep.depend();
+          if (Array.isArray(val)) {
+            dependArray(val);
+          }
+        }
+      }
+      return val;
+    },
+    set: function reactiveSetter(newVal) {
+      const val = getter ? getter.call(obj) : value;
+      /* eslint-disable no-self-compare */
+      if (newVal === val || (newVal !== newVal && val !== val)) {
+        return;
+      }
+
+      if (isObject(value) && hasOwn(value, '__ob__')) {
+        /**
+         * 删掉无效的 paths
+         * 注意：即使 path 只有一个也要删掉，因为其子节点可能有多个 path
+         */
+        cleanPaths(key, value.__ob__.op, parent.__ob__.op);
+      }
+
+      /* eslint-enable no-self-compare */
+      if (process.env.NODE_ENV !== 'production' && customSetter) {
+        customSetter();
+      }
+      if (setter) {
+        setter.call(obj, newVal);
+      } else {
+        value = newVal;
+      }
+
+      // Have to set dirty after value assigned, otherwise the dirty key is incrrect.
+      if (vm) {
+        // push parent key to dirty, wait to setData
+        if (vm.$dirty) {
+          vm.$dirty.set(obj.__ob__.op, key, newVal);
+        }
+      }
+      childOb = !shallow && observe({ vm: vm, key: key, value: newVal, parent: parent });
+      dep.notify();
+    }
+  });
+}
+
+/**
+ * Set a property on an object. Adds the new property and
+ * triggers change notification if the property doesn't
+ * already exist.
+ */
+export function set(vm, target, key, val) {
+  if (Array.isArray(target) && isValidArrayIndex(key)) {
+    target.length = Math.max(target.length, key);
+    target.splice(key, 1, val);
+    return val;
+  }
+
+  if (key in target && !(key in Object.prototype)) {
+    target[key] = val;
+    return val;
+  }
+
+  const ob = target.__ob__;
+  if (target._isVue || (ob && ob.vmCount)) {
+    process.env.NODE_ENV !== 'production' &&
+      warn(
+        'Avoid adding reactive properties to a Vue instance or its root $data ' +
+          'at runtime - declare it upfront in the data option.'
+      );
+    return val;
+  }
+
+  if (!ob) {
+    target[key] = val;
+    return val;
+  }
+
+  if (isObject(target[key]) && hasOwn(target[key], '__ob__')) {
+    // delete invalid paths
+    cleanPaths(key, target[key].__ob__.op, ob.op);
+  }
+  defineReactive({ vm: vm, obj: ob.value, key: key, value: val, parent: ob.value });
+  if (vm) {
+    // push parent key to dirty, wait to setData
+    if (vm.$dirty && hasOwn(target, '__ob__')) {
+      vm.$dirty.set(target.__ob__.op, key, val);
+    }
+  }
+  ob.dep.notify();
+  return val;
+}
+
+/**
+ * Delete a property and trigger change if necessary.
+ */
+export function del(target, key) {
+  if (Array.isArray(target) && isValidArrayIndex(key)) {
+    target.splice(key, 1);
+    return;
+  }
+
+  const ob = target.__ob__;
+  if (target._isVue || (ob && ob.vmCount)) {
+    process.env.NODE_ENV !== 'production' &&
+      warn('Avoid deleting properties on a Vue instance or its root $data ' + '- just set it to null.');
+    return;
+  }
+
+  if (!hasOwn(target, key)) {
+    return;
+  }
+
+  // set $dirty
+  target[key] = null;
+  delete target[key];
+  if (!ob) {
+    return;
+  }
+  ob.dep.notify();
+}
+
+/**
+ * Collect dependencies on array elements when the array is touched, since
+ * we cannot intercept array element access like property getters.
+ */
+function dependArray(value) {
+  for (let e, i = 0, l = value.length; i < l; i++) {
+    e = value[i];
+    e && e.__ob__ && e.__ob__.dep.depend();
+    if (Array.isArray(e)) {
+      dependArray(e);
+    }
+  }
+}
diff --git a/packages/core/weapp/observer/observerPath.js b/packages/core/weapp/observer/observerPath.js
new file mode 100644
index 000000000..adb165933
--- /dev/null
+++ b/packages/core/weapp/observer/observerPath.js
@@ -0,0 +1,137 @@
+/**
+ * @desc ObserverPath 类以及相关处理函数
+ * Observer 所在位置对应在整棵 data tree 的路径集合
+ * @createDate 2019-07-21
+ */
+import { hasOwn, isNum, isObject, remove } from '../util/index';
+
+/**
+ * 生成完整路径
+ * @param key  {String|Number} 当为字符串时，说明是属性名，当为数字时，说明是索引
+ * @param parentPath {String} 父路径
+ * @return {string}
+ */
+const setPath = (key, parentPath) => {
+  return isNum(key) ? `${parentPath}[${key}]` : `${parentPath}.${key}`;
+};
+
+/**
+ * 得到 ObserverPath
+ * @param value 被观察对象
+ * @return {ObserverPath|null}
+ */
+const pickOp = value => {
+  return isObject(value) && hasOwn(value, '__ob__') ? value.__ob__.op : null;
+};
+
+export default class ObserverPath {
+  constructor(key, ob, parentOp) {
+    this.ob = ob;
+    // eslint-disable-next-line eqeqeq
+    if (parentOp) {
+      const { combinePathKeys, combinePathMap } = getPathMap(key, parentOp.pathKeys, parentOp.pathMap);
+      this.pathKeys = combinePathKeys;
+      this.pathMap = combinePathMap;
+    } else {
+      this.pathKeys = null;
+      this.pathMap = null;
+    }
+  }
+
+  traverseOp(key, pathKeys, pathMap, handler) {
+    // 得到 newKey 和 pathMap 组合的路径集合
+    const { combinePathMap, combinePathKeys } = getPathMap(key, pathKeys, pathMap);
+    let handlePathKeys = [];
+    let handlePathMap = {};
+    let hasChange = false;
+
+    // 遍历 combinePathMap
+    for (let i = 0; i < combinePathKeys.length; i++) {
+      const pathObj = handler(combinePathMap[combinePathKeys[i]], this);
+      if (pathObj) {
+        hasChange = true;
+        handlePathKeys.push(pathObj.path);
+        handlePathMap[pathObj.path] = pathObj;
+      }
+    }
+
+    if (hasChange) {
+      const value = this.ob.value;
+      if (Array.isArray(value)) {
+        for (let i = 0; i < value.length; i++) {
+          const op = pickOp(value[i]);
+          op && op.traverseOp(i, handlePathKeys, handlePathMap, handler);
+        }
+      } else {
+        const keys = Object.keys(value);
+        for (let i = 0; i < keys.length; i++) {
+          const key = keys[i];
+          const op = pickOp(value[key]);
+          op && op.traverseOp(key, handlePathKeys, handlePathMap, handler);
+        }
+      }
+    }
+  }
+
+  addPath(pathObj) {
+    this.pathKeys.push(pathObj.path);
+    this.pathMap[pathObj.path] = pathObj;
+  }
+
+  delPath(path) {
+    remove(this.pathKeys, path);
+    delete this.pathMap[path];
+  }
+}
+
+/**
+ * 添加新的 __ob__ 的 path
+ */
+export function addPaths(newKey, op, parentOp) {
+  op.traverseOp(newKey, parentOp.pathKeys, parentOp.pathMap, handler);
+
+  function handler(pathObj, op) {
+    if (!(pathObj.path in op.pathMap)) {
+      // 新增一条 path
+      op.addPath(pathObj);
+      return pathObj;
+    } else {
+      return null;
+    }
+  }
+}
+
+/**
+ * 删除指定的 __ob__ 的 path
+ */
+export function cleanPaths(oldKey, op, parentOp) {
+  op.traverseOp(oldKey, parentOp.pathKeys, parentOp.pathMap, handler);
+
+  function handler(pathObj, op) {
+    // 删除一条 path
+    op.delPath(pathObj.path);
+    return pathObj;
+  }
+}
+
+/**
+ * 得到 pathMap 与 key 组合后的路径集合
+ */
+export function getPathMap(key, pathKeys, pathMap) {
+  if (pathMap) {
+    // console.log('pathMap', pathMap)
+    let combinePathKeys = [];
+    let combinePathMap = {};
+    for (let i = 0; i < pathKeys.length; i++) {
+      const path = setPath(key, pathMap[pathKeys[i]].path);
+      combinePathKeys.push(path);
+      combinePathMap[path] = { key, root: pathMap[pathKeys[i]].root, path };
+    }
+    return { combinePathKeys, combinePathMap };
+  } else {
+    return {
+      combinePathKeys: [key],
+      combinePathMap: { [key]: { key, root: key, path: key } }
+    };
+  }
+}
diff --git a/packages/core/weapp/observer/scheduler.js b/packages/core/weapp/observer/scheduler.js
new file mode 100644
index 000000000..d5d31e030
--- /dev/null
+++ b/packages/core/weapp/observer/scheduler.js
@@ -0,0 +1,168 @@
+//import { callHook, activateChildComponent } from '../instance/lifecycle';
+
+import { warn, nextTick } from '../util/index';
+
+export const MAX_UPDATE_COUNT = 100;
+
+const queue = [];
+const activatedChildren = [];
+let has = {};
+let circular = {};
+let waiting = false;
+let flushing = false;
+let index = 0;
+
+/**
+ * Reset the scheduler's state.
+ */
+function resetSchedulerState() {
+  index = queue.length = activatedChildren.length = 0;
+  has = {};
+  if (process.env.NODE_ENV !== 'production') {
+    circular = {};
+  }
+  waiting = flushing = false;
+}
+
+/**
+ * Flush both queues and run the watchers.
+ */
+function flushSchedulerQueue(times = 0) {
+  flushing = true;
+  let watcher, id;
+
+  // Sort queue before flush.
+  // This ensures that:
+  // 1. Components are updated from parent to child. (because parent is always
+  //    created before the child)
+  // 2. A component's user watchers are run before its render watcher (because
+  //    user watchers are created before the render watcher)
+  // 3. If a component is destroyed during a parent component's watcher run,
+  //    its watchers can be skipped.
+  times === 0 && queue.sort((a, b) => a.id - b.id);
+
+  // do not cache length because more watchers might be pushed
+  // as we run existing watchers
+  // there would be mutilple renderWatcher in the queue.
+  let renderWatcher = [];
+  if (times === 0) {
+    index = 0;
+  }
+  for (; index < queue.length; index++) {
+    // if it's renderWatcher, run it in the end
+    watcher = queue[index];
+    if (watcher && watcher.isRenderWatcher) {
+      renderWatcher.push(watcher);
+      continue;
+    }
+    id = watcher.id;
+    has[id] = null;
+    watcher.run();
+    // in dev build, check and stop circular updates.
+    // eslint-disable-next-line
+    if (process.env.NODE_ENV !== 'production' && has[id] != null) {
+      circular[id] = (circular[id] || 0) + 1;
+      if (circular[id] > MAX_UPDATE_COUNT) {
+        warn(
+          'You may have an infinite update loop ' +
+            (watcher.user ? `in watcher with expression "${watcher.expression}"` : `in a component render function.`),
+          watcher.vm
+        );
+        resetSchedulerState();
+        return;
+      }
+    }
+  }
+  // Run renderWatcher in the end.
+  if (renderWatcher.length) {
+    renderWatcher.forEach(watcher => {
+      has[watcher.id] = null;
+      watcher.run();
+    });
+  }
+
+  // It may added new watcher to the queue in render watcher
+  let pendingQueue = queue.slice(index);
+
+  if (pendingQueue.length) {
+    flushSchedulerQueue(times + 1);
+  } else {
+    // keep copies of post queues before resetting state
+    // const activatedQueue = activatedChildren.slice()
+    // const updatedQueue = queue.slice()
+
+    resetSchedulerState();
+
+    // call component updated and activated hooks
+    // callActivatedHooks(activatedQueue)
+    // callUpdatedHooks(updatedQueue)
+
+    // devtool hook
+    /* istanbul ignore if */
+    /*
+    if (devtools && config.devtools) {
+      devtools.emit('flush')
+    }*/
+  }
+}
+
+/*
+function callUpdatedHooks(queue) {
+  let i = queue.length;
+  while (i--) {
+    const watcher = queue[i];
+    const vm = watcher.vm;
+    if (vm._watcher === watcher && vm._isMounted) {
+      callHook(vm, 'updated');
+    }
+  }
+}*/
+
+/**
+ * Queue a kept-alive component that was activated during patch.
+ * The queue will be processed after the entire tree has been patched.
+ */
+export function queueActivatedComponent(vm) {
+  // setting _inactive to false here so that a render function can
+  // rely on checking whether it's in an inactive tree (e.g. router-view)
+  vm._inactive = false;
+  activatedChildren.push(vm);
+}
+
+/*
+function callActivatedHooks(queue) {
+  for (let i = 0; i < queue.length; i++) {
+    queue[i]._inactive = true;
+    activateChildComponent(queue[i], true);
+  }
+}
+*/
+
+/**
+ * Push a watcher into the watcher queue.
+ * Jobs with duplicate IDs will be skipped unless it's
+ * pushed when the queue is being flushed.
+ */
+export function queueWatcher(watcher) {
+  const id = watcher.id;
+  // eslint-disable-next-line
+  if (has[id] == null) {
+    has[id] = true;
+    if (!flushing) {
+      queue.push(watcher);
+    } else {
+      // if already flushing, splice the watcher based on its id
+      // if already past its id, it will be run next immediately.
+      let i = queue.length - 1;
+      while (i > index && queue[i].id > watcher.id) {
+        i--;
+      }
+      queue.splice(i + 1, 0, watcher);
+    }
+    // queue the flush
+    if (!waiting) {
+      waiting = true;
+      nextTick(flushSchedulerQueue);
+    }
+  }
+}
diff --git a/packages/core/weapp/observer/traverse.js b/packages/core/weapp/observer/traverse.js
new file mode 100644
index 000000000..d64fb009b
--- /dev/null
+++ b/packages/core/weapp/observer/traverse.js
@@ -0,0 +1,36 @@
+import { _Set as Set, isObject } from '../util/index';
+
+const seenObjects = new Set();
+
+/**
+ * Recursively traverse an object to evoke all converted
+ * getters, so that every nested property inside the object
+ * is collected as a "deep" dependency.
+ */
+export function traverse(val) {
+  _traverse(val, seenObjects);
+  seenObjects.clear();
+}
+
+function _traverse(val, seen) {
+  let i, keys;
+  const isA = Array.isArray(val);
+  if ((!isA && !isObject(val)) || Object.isFrozen(val)) {
+    return;
+  }
+  if (val.__ob__) {
+    const depId = val.__ob__.dep.id;
+    if (seen.has(depId)) {
+      return;
+    }
+    seen.add(depId);
+  }
+  if (isA) {
+    i = val.length;
+    while (i--) _traverse(val[i], seen);
+  } else {
+    keys = Object.keys(val);
+    i = keys.length;
+    while (i--) _traverse(val[keys[i]], seen);
+  }
+}
diff --git a/packages/core/weapp/observer/watcher.js b/packages/core/weapp/observer/watcher.js
new file mode 100644
index 000000000..37a3d162b
--- /dev/null
+++ b/packages/core/weapp/observer/watcher.js
@@ -0,0 +1,216 @@
+import { warn, remove, isObject, parsePath, _Set as Set, handleError } from '../util/index';
+
+import { traverse } from './traverse';
+import { queueWatcher } from './scheduler';
+import Dep, { pushTarget, popTarget } from './dep';
+
+//import { SimpleSet } from '../util/index';
+
+let uid = 0;
+
+/**
+ * A watcher parses an expression, collects dependencies,
+ * and fires callback when the expression value changes.
+ * This is used for both the $watch() api and directives.
+ */
+export default class Watcher {
+  constructor(vm, expOrFn, cb, options, isRenderWatcher) {
+    this.vm = vm;
+    if (isRenderWatcher) {
+      vm._watcher = this;
+    }
+    vm._watchers.push(this);
+    // options
+    if (options) {
+      this.deep = !!options.deep;
+      this.user = !!options.user;
+      this.computed = !!options.computed;
+      this.sync = !!options.sync;
+    } else {
+      this.deep = this.user = this.computed = this.sync = false;
+    }
+    this.cb = cb;
+    this.id = ++uid; // uid for batching
+    this.active = true;
+    this.dirty = this.computed; // for computed watchers
+    this.deps = [];
+    this.newDeps = [];
+    this.depIds = new Set();
+    this.newDepIds = new Set();
+    this.isRenderWatcher = isRenderWatcher;
+    this.expression = process.env.NODE_ENV !== 'production' ? expOrFn.toString() : '';
+    // parse expression for getter
+    if (typeof expOrFn === 'function') {
+      this.getter = expOrFn;
+    } else {
+      this.getter = parsePath(expOrFn);
+      if (!this.getter) {
+        this.getter = function() {};
+        process.env.NODE_ENV !== 'production' &&
+          warn(
+            `Failed watching path: "${expOrFn}" ` +
+              'Watcher only accepts simple dot-delimited paths. ' +
+              'For full control, use a function instead.',
+            vm
+          );
+      }
+    }
+    this.value = this.computed ? undefined : this.get();
+  }
+
+  /**
+   * Evaluate the getter, and re-collect dependencies.
+   */
+  get() {
+    pushTarget(this);
+    let value;
+    const vm = this.vm;
+    try {
+      value = this.getter.call(vm, vm);
+    } catch (e) {
+      if (this.user) {
+        handleError(e, vm, `getter for watcher "${this.expression}"`);
+      } else {
+        throw e;
+      }
+    } finally {
+      // "touch" every property so they are all tracked as
+      // dependencies for deep watching
+      if (this.deep) {
+        traverse(value);
+      }
+      popTarget();
+      if (!this.isRenderWatcher) this.cleanupDeps();
+    }
+    return value;
+  }
+
+  /**
+   * Add a dependency to this directive.
+   */
+  addDep(dep) {
+    const id = dep.id;
+    if (!this.newDepIds.has(id)) {
+      this.newDepIds.add(id);
+      this.newDeps.push(dep);
+      if (!this.depIds.has(id)) {
+        dep.addSub(this);
+      }
+    }
+  }
+
+  /**
+   * Clean up for dependency collection.
+   */
+  cleanupDeps() {
+    let i = this.deps.length;
+    while (i--) {
+      const dep = this.deps[i];
+      if (!this.newDepIds.has(dep.id)) {
+        dep.removeSub(this);
+      }
+    }
+    let tmp = this.depIds;
+    this.depIds = this.newDepIds;
+    this.newDepIds = tmp;
+    this.newDepIds.clear();
+    tmp = this.deps;
+    this.deps = this.newDeps;
+    this.newDeps = tmp;
+    this.newDeps.length = 0;
+  }
+
+  /**
+   * Subscriber interface.
+   * Will be called when a dependency changes.
+   */
+  update() {
+    /* istanbul ignore else */
+    if (this.computed) {
+      this.dirty = true;
+    } else if (this.sync) {
+      this.run();
+    } else {
+      queueWatcher(this);
+    }
+  }
+
+  /**
+   * Scheduler job interface.
+   * Will be called by the scheduler.
+   */
+  run() {
+    if (this.active) {
+      const value = this.get();
+      if (
+        value !== this.value ||
+        // Deep watchers and watchers on Object/Arrays should fire even
+        // when the value is the same, because the value may
+        // have mutated.
+        isObject(value) ||
+        this.deep
+      ) {
+        // set new value
+        const oldValue = this.value;
+        this.value = value;
+        if (this.user) {
+          try {
+            this.cb.call(this.vm, value, oldValue);
+          } catch (e) {
+            handleError(e, this.vm, `callback for watcher "${this.expression}"`);
+          }
+        } else {
+          this.cb.call(this.vm, value, oldValue);
+        }
+      }
+    }
+  }
+
+  /**
+   * Evaluate the value of the watcher.
+   * This only gets called for computed watchers.
+   */
+  evaluate() {
+    this.value = this.get();
+    if (this.vm.$dirty) {
+      let keyVal =
+        this._computedWatchers && this._computedWatchers[this.key]
+          ? this.vm._computedWatchers[this.key].value
+          : this.value;
+      this.vm.$dirty.push(this.key, this.key, keyVal, this.value);
+    }
+    this.dirty = false;
+    return this.value;
+  }
+
+  /**
+   * Depend on all deps collected by this watcher.
+   */
+  depend() {
+    if (Dep.target) {
+      let i = this.deps.length;
+      while (i--) {
+        this.deps[i].depend();
+      }
+    }
+  }
+
+  /**
+   * Remove self from all dependencies' subscriber list.
+   */
+  teardown() {
+    if (this.active) {
+      // remove self from vm's watcher list
+      // this is a somewhat expensive operation so we skip it
+      // if the vm is being destroyed.
+      if (!this.vm._isBeingDestroyed) {
+        remove(this.vm._watchers, this);
+      }
+      let i = this.deps.length;
+      while (i--) {
+        this.deps[i].removeSub(this);
+      }
+      this.active = false;
+    }
+  }
+}
diff --git a/packages/core/weapp/util/config.js b/packages/core/weapp/util/config.js
new file mode 100644
index 000000000..ff8b4c563
--- /dev/null
+++ b/packages/core/weapp/util/config.js
@@ -0,0 +1 @@
+export default {};
diff --git a/packages/core/weapp/util/debug.js b/packages/core/weapp/util/debug.js
new file mode 100644
index 000000000..31661e949
--- /dev/null
+++ b/packages/core/weapp/util/debug.js
@@ -0,0 +1,27 @@
+import config from './config';
+import { noop } from '../../shared/util';
+
+export let warn = noop;
+export let tip = noop;
+
+const generateComponentTrace = function(vm) {
+  return `Found in component: "${vm.$is}"`;
+};
+
+if (process.env.NODE_ENV !== 'production') {
+  const hasConsole = typeof console !== 'undefined';
+  // TODO
+  warn = (msg, vm) => {
+    if (hasConsole && !config.silent) {
+      // eslint-disable-next-line
+      console.error(`[WePY warn]: ${msg}` + (vm ? generateComponentTrace(vm) : ''));
+    }
+  };
+
+  tip = (msg, vm) => {
+    if (hasConsole && !config.silent) {
+      // eslint-disable-next-line
+      console.warn(`[WePY tip]: ${msg}` + (vm ? generateComponentTrace(vm) : ''));
+    }
+  };
+}
diff --git a/packages/core/weapp/util/error.js b/packages/core/weapp/util/error.js
new file mode 100644
index 000000000..5e8215bb5
--- /dev/null
+++ b/packages/core/weapp/util/error.js
@@ -0,0 +1,46 @@
+import config from './config';
+import { warn } from './debug';
+
+export function handleError(err, vm, info) {
+  if (vm) {
+    let cur = vm;
+    while ((cur = cur.$parent)) {
+      const hooks = cur.$options.errorCaptured;
+      if (hooks) {
+        for (let i = 0; i < hooks.length; i++) {
+          try {
+            const capture = hooks[i].call(cur, err, vm, info) === false;
+            if (capture) return;
+          } catch (e) {
+            globalHandleError(e, cur, 'errorCaptured hook');
+          }
+        }
+      }
+    }
+  }
+  globalHandleError(err, vm, info);
+}
+
+function globalHandleError(err, vm, info) {
+  if (config.errorHandler) {
+    try {
+      return config.errorHandler.call(null, err, vm, info);
+    } catch (e) {
+      logError(e, null, 'config.errorHandler');
+    }
+  }
+  logError(err, vm, info);
+}
+
+function logError(err, vm, info) {
+  if (process.env.NODE_ENV !== 'production') {
+    warn(`Error in ${info}: "${err.toString()}"`, vm);
+  }
+  /* istanbul ignore else */
+  if (typeof console !== 'undefined') {
+    // eslint-disable-next-line
+    console.error(err);
+  } else {
+    throw err;
+  }
+}
diff --git a/packages/core/weapp/util/index.js b/packages/core/weapp/util/index.js
new file mode 100644
index 000000000..b2f6d7710
--- /dev/null
+++ b/packages/core/weapp/util/index.js
@@ -0,0 +1,56 @@
+export * from './../../shared/index';
+
+export * from './debug';
+export * from './error';
+export * from './next-tick';
+export * from './model';
+
+/**
+ * Remove an item from an array
+ */
+export function remove(arr, item) {
+  if (arr.length) {
+    var index = arr.indexOf(item);
+    if (index > -1) {
+      return arr.splice(index, 1);
+    }
+  }
+}
+
+/**
+ * Check if a string starts with $ or _
+ */
+export function isReserved(str) {
+  const c = (str + '').charCodeAt(0);
+  return c === 0x24 || c === 0x5f;
+}
+
+/**
+ * Define a property.
+ */
+export function def(obj, key, val, enumerable) {
+  Object.defineProperty(obj, key, {
+    value: val,
+    enumerable: !!enumerable,
+    writable: true,
+    configurable: true
+  });
+}
+
+/**
+ * Parse simple path.
+ */
+const bailRE = /[^\w.$]/;
+export function parsePath(path) {
+  if (bailRE.test(path)) {
+    return;
+  }
+  const segments = path.split('.');
+  return function(obj) {
+    for (let i = 0; i < segments.length; i++) {
+      if (!obj) return;
+      obj = obj[segments[i]];
+    }
+    return obj;
+  };
+}
diff --git a/packages/core/weapp/util/model.js b/packages/core/weapp/util/model.js
new file mode 100644
index 000000000..2b4885b65
--- /dev/null
+++ b/packages/core/weapp/util/model.js
@@ -0,0 +1,86 @@
+/**
+ * Parse a v-model expression into a base path and a final key segment.
+ * Handles both dot-path and possible square brackets.
+ *
+ * Possible cases:
+ *
+ * - test
+ * - test[key]
+ * - test[test1[key]]
+ * - test["a"][key]
+ * - xxx.test[a[a].test1[key]]
+ * - test.xxx.a["asa"][test1[key]]
+ *
+ */
+export function parseModel(str) {
+  str = str.trim();
+  let len = str.length;
+
+  // e.g.
+  // test[0].a
+  // test.a.b
+  if (str.indexOf('[') < 0 || str.lastIndexOf(']') < len - 1) {
+    let dot = str.lastIndexOf('.');
+    if (dot > -1) {
+      return {
+        expr: str.slice(0, dot),
+        key: `${str.slice(dot + 1)}`
+      };
+    } else {
+      return {
+        expr: str,
+        key: null
+      };
+    }
+  }
+
+  /*
+   * e.g.
+   * test[a[b]]
+   */
+
+  let index = 0;
+  let exprStart = 0;
+  let exprEnd = 0;
+
+  let isQuoteStart = function(chr) {
+    return chr === 0x22 || chr === 0x27;
+  };
+
+  let parseString = function(chr) {
+    while (index < len && str.charCodeAt(++index) !== chr) {}
+  };
+
+  let parseBracket = function(chr) {
+    let inBracket = 1;
+    exprStart = index;
+    while (index < len) {
+      chr = str.charCodeAt(++index);
+      if (isQuoteStart(chr)) {
+        parseString(chr);
+        continue;
+      }
+      if (chr === 0x5b) inBracket++;
+      if (chr === 0x5d) inBracket--;
+
+      if (inBracket === 0) {
+        exprEnd = index;
+        break;
+      }
+    }
+  };
+
+  while (index < len) {
+    let chr = str.charCodeAt(++index);
+    if (isQuoteStart(chr)) {
+      parseString(chr);
+    } else if (chr === 0x5b) {
+      parseBracket(chr);
+    }
+  }
+
+  return {
+    expr: str.slice(0, exprStart),
+    key: str.slice(exprStart + 1, exprEnd)
+  };
+}
diff --git a/packages/core/weapp/util/next-tick.js b/packages/core/weapp/util/next-tick.js
new file mode 100644
index 000000000..c0342ed4d
--- /dev/null
+++ b/packages/core/weapp/util/next-tick.js
@@ -0,0 +1,153 @@
+import { handleError } from './error';
+import {
+  //isIOS,
+  isNative
+} from './../../shared/env';
+
+const callbacks = [];
+let pending = false;
+
+function flushCallbacks() {
+  pending = false;
+  const copies = callbacks.slice(0);
+  callbacks.length = 0;
+  for (let i = 0; i < copies.length; i++) {
+    copies[i]();
+  }
+}
+
+// Here we have async deferring wrappers using both micro and macro tasks.
+// In < 2.4 we used micro tasks everywhere, but there are some scenarios where
+// micro tasks have too high a priority and fires in between supposedly
+// sequential events (e.g. #4521, #6690) or even between bubbling of the same
+// event (#6566). However, using macro tasks everywhere also has subtle problems
+// when state is changed right before repaint (e.g. #6813, out-in transitions).
+// Here we use micro task by default, but expose a way to force macro task when
+// needed (e.g. in event handlers attached by v-on).
+let microTimerFunc;
+let macroTimerFunc;
+let useMacroTask = false;
+
+// Determine (macro) Task defer implementation.
+// Technically setImmediate should be the ideal choice, but it's only available
+// in IE. The only polyfill that consistently queues the callback after all DOM
+// events triggered in the same loop is by using MessageChannel.
+/* istanbul ignore if */
+if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
+  macroTimerFunc = () => {
+    setImmediate(flushCallbacks);
+  };
+} else if (
+  /* eslint-disable no-undef */
+  typeof MessageChannel !== 'undefined' &&
+  (isNative(MessageChannel) ||
+    // PhantomJS
+    MessageChannel.toString() === '[object MessageChannelConstructor]')
+) {
+  const channel = new MessageChannel();
+  const port = channel.port2;
+  channel.port1.onmessage = flushCallbacks;
+  macroTimerFunc = () => {
+    port.postMessage(1);
+  };
+  /* eslint-enable no-undef */
+} else {
+  /* istanbul ignore next */
+  macroTimerFunc = () => {
+    setTimeout(flushCallbacks, 0);
+  };
+}
+
+// Determine MicroTask defer implementation.
+/* istanbul ignore next, $flow-disable-line */
+if (typeof Promise !== 'undefined' && isNative(Promise)) {
+  const p = Promise.resolve();
+  microTimerFunc = () => {
+    p.then(flushCallbacks);
+    // in problematic UIWebViews, Promise.then doesn't completely break, but
+    // it can get stuck in a weird state where callbacks are pushed into the
+    // microtask queue but the queue isn't being flushed, until the browser
+    // needs to do some other work, e.g. handle a timer. Therefore we can
+    // "force" the microtask queue to be flushed by adding an empty timer.
+    // if (isIOS) setTimeout(noop)
+  };
+} else {
+  // fallback to macro
+  microTimerFunc = macroTimerFunc;
+}
+
+/**
+ * Wrap a function so that if any code inside triggers state change,
+ * the changes are queued using a Task instead of a MicroTask.
+ */
+export function withMacroTask(fn) {
+  return (
+    fn._withTask ||
+    (fn._withTask = function() {
+      useMacroTask = true;
+      const res = fn.apply(null, arguments);
+      useMacroTask = false;
+      return res;
+    })
+  );
+}
+
+export function nextTick(cb, ctx) {
+  let _resolve;
+  callbacks.push(() => {
+    if (cb) {
+      try {
+        cb.call(ctx);
+      } catch (e) {
+        handleError(e, ctx, 'nextTick');
+      }
+    } else if (_resolve) {
+      _resolve(ctx);
+    }
+  });
+  if (!pending) {
+    pending = true;
+    if (useMacroTask) {
+      macroTimerFunc();
+    } else {
+      microTimerFunc();
+    }
+  }
+  // $flow-disable-line
+  if (!cb && typeof Promise !== 'undefined') {
+    return new Promise(resolve => {
+      _resolve = resolve;
+    });
+  }
+}
+
+const renderCallbacks = [];
+
+export function renderFlushCallbacks() {
+  const copies = renderCallbacks.slice(0);
+  renderCallbacks.length = 0;
+  for (let i = 0; i < copies.length; i++) {
+    copies[i]();
+  }
+}
+
+export function renderNextTick(cb, ctx) {
+  let _resolve;
+  renderCallbacks.push(() => {
+    if (cb) {
+      try {
+        cb.call(ctx);
+      } catch (e) {
+        handleError(e, ctx, 'nextTick');
+      }
+    } else if (_resolve) {
+      _resolve(ctx);
+    }
+  });
+
+  if (!cb && typeof Promise !== 'undefined') {
+    return new Promise(resolve => {
+      _resolve = resolve;
+    });
+  }
+}
diff --git a/packages/core/weapp/wepy.js b/packages/core/weapp/wepy.js
new file mode 100644
index 000000000..231a7a95a
--- /dev/null
+++ b/packages/core/weapp/wepy.js
@@ -0,0 +1,12 @@
+import WepyConstructor from './class/WepyConstructor';
+import $global from './global';
+import { initGlobalAPI } from './apis/index';
+import { config } from './config';
+
+const wepy = initGlobalAPI(WepyConstructor);
+
+wepy.config = config;
+wepy.global = $global;
+wepy.version = __VERSION__;
+
+export default wepy;
diff --git a/packages/plugin-define/.npmignore b/packages/plugin-define/.npmignore
new file mode 100644
index 000000000..3c3629e64
--- /dev/null
+++ b/packages/plugin-define/.npmignore
@@ -0,0 +1 @@
+node_modules
diff --git a/packages/plugin-define/CHANGELOG.md b/packages/plugin-define/CHANGELOG.md
new file mode 100644
index 000000000..aa7e98a4a
--- /dev/null
+++ b/packages/plugin-define/CHANGELOG.md
@@ -0,0 +1,64 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# 2.1.0 (2020-07-04)
+
+**Note:** Version bump only for package @wepy/plugin-define
+
+
+
+
+
+# 2.1.0-alpha.10 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/plugin-define
+
+
+
+
+
+# 2.1.0-alpha.9 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/plugin-define
+
+
+
+
+
+# 2.1.0-alpha.8 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/plugin-define
+
+
+
+
+
+# 2.1.0-alpha.7 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/plugin-define
+
+
+
+
+
+# 2.1.0-alpha.6 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/plugin-define
+
+
+
+
+
+# 2.1.0-alpha.5 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/plugin-define
+
+
+
+
+
+# [2.1.0-alpha.4](https://github.com/Tencent/wepy/compare/v2.1.0-alpha.2...v2.1.0-alpha.4) (2020-06-20)
+
+**Note:** Version bump only for package @wepy/plugin-define
diff --git a/packages/plugin-define/README.md b/packages/plugin-define/README.md
new file mode 100644
index 000000000..b564eb9c1
--- /dev/null
+++ b/packages/plugin-define/README.md
@@ -0,0 +1,35 @@
+[English](./README_EN.md) | 简体中文
+
+# wepy define plugin
+
+## 安装
+
+```bash
+npm install @wepy/plugin-define --save-dev
+```
+
+## 配置方式
+
+**wepy.config.js**
+
+```javascript
+const DefinePlugin = require('@wepy/plugin-define');
+
+module.exports = {
+  plugins: [
+    DefinePlugin({
+      BASE_URL: JSON.stringify('http://foobar.com'),
+      'process.env.NODE_ENV': 'development',
+      'typeof window': JSON.stringify('undefined'),
+      DEV: true
+    })
+  ]
+};
+```
+
+## 参考网站
+
+[webpack.DefinePlugin](https://webpack.js.org/plugins/define-plugin/)
+
+
+
diff --git a/packages/plugin-define/README_EN.md b/packages/plugin-define/README_EN.md
new file mode 100644
index 000000000..1102f0de3
--- /dev/null
+++ b/packages/plugin-define/README_EN.md
@@ -0,0 +1,33 @@
+English | [简体中文](./README.md)
+
+# wepy define plugin
+
+## Install
+
+```bash
+npm install @wepy/plugin-define --save-dev
+```
+
+## Configration
+
+**wepy.config.js**
+```javascript
+const DefinePlugin = require('@wepy/plugin-define');
+
+module.exports = {
+  plugins: [
+    DefinePlugin({
+      BASE_URL: JSON.stringify('http://foobar.com'),
+      'process.env.NODE_ENV': 'development',
+      'typeof window': JSON.stringify('undefined'),
+      DEV: true
+    })
+  ]
+};
+```
+
+## Reference
+[webpack.DefinePlugin](https://webpack.js.org/plugins/define-plugin/)
+
+
+
diff --git a/packages/plugin-define/index.js b/packages/plugin-define/index.js
new file mode 100644
index 000000000..c39b7af5d
--- /dev/null
+++ b/packages/plugin-define/index.js
@@ -0,0 +1,72 @@
+/**
+ * Tencent is pleased to support the open source community by making WePY available.
+ * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
+ * http://opensource.org/licenses/MIT
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+
+const stringifyObj = obj => {
+  return (
+    'Object({' +
+    Object.keys(obj)
+      .map(key => {
+        const code = obj[key];
+        return JSON.stringify(key) + ':' + toCode(code);
+      })
+      .join(',') +
+    '})'
+  );
+};
+
+/**
+ * Convert code to a string that evaluates
+ * @param {CodeValue} code Code to evaluate
+ * @param {Parser} parser Parser
+ * @returns {string} code converted to string that evaluates
+ */
+const toCode = code => {
+  if (code === null) {
+    return 'null';
+  }
+  if (code === undefined) {
+    return 'undefined';
+  }
+  if (code instanceof RegExp && code.toString) {
+    return code.toString();
+  }
+  if (typeof code === 'function' && code.toString) {
+    return '(' + code.toString() + ')';
+  }
+  if (typeof code === 'object') {
+    return stringifyObj(code);
+  }
+  return code + '';
+};
+
+exports = module.exports = function DefinePlugin(options = {}) {
+  return function() {
+    this.register('walker-unary-expression-undefined', function(parser, expr, names) {
+      if (expr.operator === 'typeof') {
+        let v = options[`typeof ${names.name}`] || options[`typeof(${names.name})`];
+        if (v) {
+          parser.replacements.push({ expr, value: toCode(v) });
+        }
+      }
+      return [parser, expr, names];
+    });
+    this.register('walker-member-expression-undefined', function(parser, expr, names) {
+      if (options.hasOwnProperty(names.name)) {
+        parser.replacements.push({ expr, value: toCode(options[names.name]) });
+      }
+      return [parser, expr, names];
+    });
+    this.register('walker-identifier-undefined', function(parser, expr) {
+      if (options.hasOwnProperty(expr.name)) {
+        parser.replacements.push({ expr, value: toCode(options[expr.name]) });
+      }
+      return [parser, expr];
+    });
+  };
+};
diff --git a/packages/plugin-define/package.json b/packages/plugin-define/package.json
new file mode 100644
index 000000000..9df1af2d3
--- /dev/null
+++ b/packages/plugin-define/package.json
@@ -0,0 +1,26 @@
+{
+  "name": "@wepy/plugin-define",
+  "version": "2.1.0",
+  "description": "wepy define plugin",
+  "main": "index.js",
+  "scripts": {
+    "test": "npm run test:unit && npm run test:integration",
+    "test:unit": "mocha ./test/*.test.js",
+    "test:integration": "mocha ./test/*.integration.js"
+  },
+  "keywords": [
+    "wepy",
+    "DefinePlugin"
+  ],
+  "author": {
+    "name": "Gcaufy"
+  },
+  "license": "MIT",
+  "readme": "ERROR: No README data found!",
+  "_id": "@wepy/plugin-define@2.0.4",
+  "_commitid": "fb07fd4",
+  "devDependencies": {
+    "@wepy/cli": "^2.1.0"
+  },
+  "gitHead": "5a25776457360bbbbc54a4d059f6bc7c032d5df3"
+}
diff --git a/packages/plugin-define/test/fixtures/expected/app.js b/packages/plugin-define/test/fixtures/expected/app.js
new file mode 100644
index 000000000..4aa7161f7
--- /dev/null
+++ b/packages/plugin-define/test/fixtures/expected/app.js
@@ -0,0 +1,14 @@
+module.exports = {
+  definedVariable: 'http://www.foo.com',
+  inObjectProperty: { BASE_URL: 'http://foo.com' },
+  inString: 'BASE_URL',
+  inTemplateLiterals: 'http://www.bar.com/api/',
+
+  shouldReplaced: 'http://www.bar.com',
+  objectTest: 'development',
+
+  typeofTest: 'undefined',
+  typeofTest2: 'undefined',
+
+  builtinFuncValue: 666
+};
diff --git a/packages/plugin-define/test/fixtures/src/app.wpy b/packages/plugin-define/test/fixtures/src/app.wpy
new file mode 100644
index 000000000..7097ee5fc
--- /dev/null
+++ b/packages/plugin-define/test/fixtures/src/app.wpy
@@ -0,0 +1,40 @@
+<script lang="js">
+  function definedVariable() {
+    let BASE_URL = 'http://www.foo.com';
+    return BASE_URL;
+  }
+
+  const inObjectProperty = {
+    BASE_URL: 'http://foo.com'
+  };
+  const inString = 'BASE_URL';
+
+  function useBuiltinFunc() {
+    let obj = {};
+    let b = 1;
+
+    __defineSetter__.call(obj, 'a', function (val) {
+      b = val;
+    });
+    obj.a = 666;
+
+    return b;
+  }
+
+  module.exports = {
+    definedVariable: definedVariable(),
+    inObjectProperty,
+    inString,
+    inTemplateLiterals: `${BASE_URL}/api/`,
+
+    shouldReplaced: BASE_URL,
+
+    objectTest: process.env.NODE_ENV,
+
+    typeofTest: typeof window,
+    typeofTest2: typeof (window),
+
+    builtinFuncValue: useBuiltinFunc()
+  };
+
+</script>
diff --git a/packages/plugin-define/test/fixtures/weapp/.gitignore b/packages/plugin-define/test/fixtures/weapp/.gitignore
new file mode 100644
index 000000000..d6b7ef32c
--- /dev/null
+++ b/packages/plugin-define/test/fixtures/weapp/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/packages/plugin-define/test/fixtures/wepy.config.js b/packages/plugin-define/test/fixtures/wepy.config.js
new file mode 100644
index 000000000..939180059
--- /dev/null
+++ b/packages/plugin-define/test/fixtures/wepy.config.js
@@ -0,0 +1,13 @@
+const DefinePlugin = require('../../index');
+
+module.exports = {
+  plugins: [
+    DefinePlugin({
+      BASE_URL: JSON.stringify('http://www.bar.com')
+    }),
+    DefinePlugin({
+      'process.env.NODE_ENV': JSON.stringify('development'),
+      'typeof window': JSON.stringify('undefined'),
+    })
+  ],
+}
diff --git a/packages/plugin-define/test/index.integration.js b/packages/plugin-define/test/index.integration.js
new file mode 100644
index 000000000..eda3fb1d9
--- /dev/null
+++ b/packages/plugin-define/test/index.integration.js
@@ -0,0 +1,20 @@
+const path = require('path');
+const { exec } = require('child_process');
+const expect = require('chai').expect;
+
+describe('plugin-define integration', function() {
+  it('full build', function(done) {
+    this.timeout(10000);
+
+    let wepyPath = path.resolve(process.cwd(), '../cli/bin/wepy.js');
+
+    exec(`cd test/fixtures && node ${wepyPath} build`, function(error) {
+      if (error) {
+        throw error;
+      }
+
+      expect(require('./fixtures/weapp/app.js')).to.deep.equal(require('./fixtures/expected/app.js'));
+      done();
+    });
+  });
+});
diff --git a/packages/plugin-define/test/index.test.js b/packages/plugin-define/test/index.test.js
new file mode 100644
index 000000000..3fdbd2744
--- /dev/null
+++ b/packages/plugin-define/test/index.test.js
@@ -0,0 +1,193 @@
+const expect = require('chai').expect;
+const Hook = require('@wepy/cli/core/hook');
+const PluginDefine = require('../index');
+
+function createCompile(pluginOpt) {
+  let instance = new Hook();
+  PluginDefine(pluginOpt).call(instance);
+  instance.parser = {
+    replacements: []
+  };
+  return instance;
+}
+
+describe('plugin-define', function() {
+  it('walker-unary-expression-undefined', function() {
+    const names = {
+      name: 'window'
+    };
+    // typeof window generate the same ast with typeof(window)
+    // let a = typeof window;
+    const unaryExpr = {
+      type: 'UnaryExpression',
+      start: 8,
+      end: 21,
+      operator: 'typeof',
+      prefix: true,
+      argument: {
+        type: 'Identifier',
+        start: 15,
+        end: 21,
+        name: 'window'
+      }
+    };
+
+    let compile = createCompile();
+
+    let args = compile.hookSeq('walker-unary-expression-undefined', compile.parser, unaryExpr, names);
+    expect(args[0].replacements.length).to.equal(0);
+
+    compile = createCompile({
+      'typeof window': JSON.stringify('xyz')
+    });
+    args = compile.hookSeq('walker-unary-expression-undefined', compile.parser, unaryExpr, names);
+    expect(args[0].replacements[0].expr).to.equal(unaryExpr);
+    expect(args[0].replacements[0].value).to.equal('"xyz"');
+
+    // delete x.y
+    const deleteUnaryExpr = {
+      type: 'UnaryExpression',
+      start: 0,
+      end: 10,
+      operator: 'delete',
+      prefix: true,
+      argument: {
+        type: 'MemberExpression',
+        start: 7,
+        end: 10,
+        object: {
+          type: 'Identifier',
+          start: 7,
+          end: 8,
+          name: 'x'
+        },
+        property: {
+          type: 'Identifier',
+          start: 9,
+          end: 10,
+          name: 'y'
+        },
+        computed: false
+      }
+    };
+
+    compile = createCompile({
+      'x.y': JSON.stringify('xyz')
+    });
+    args = compile.hookSeq('walker-unary-expression-undefined', compile.parser, deleteUnaryExpr, { name: 'x.y' });
+    expect(args[0].replacements.length).to.equal(0);
+  });
+
+  it('walker-member-expression-undefined', function() {
+    const memberExpr = {
+      type: 'MemberExpression',
+      start: 8,
+      end: 28,
+      object: {
+        type: 'MemberExpression',
+        start: 8,
+        end: 19,
+        object: {
+          type: 'Identifier',
+          start: 8,
+          end: 15,
+          name: 'process'
+        },
+        property: {
+          type: 'Identifier',
+          start: 16,
+          end: 19,
+          name: 'env'
+        },
+        computed: false
+      },
+      property: {
+        type: 'Identifier',
+        start: 20,
+        end: 28,
+        name: 'NODE_ENV'
+      },
+      computed: false
+    };
+
+    const names = {
+      name: 'process.env.NODE_ENV'
+    };
+
+    let compile = createCompile();
+
+    let args = compile.hookSeq('walker-member-expression-undefined', compile.parser, memberExpr, names);
+    expect(args[0].replacements.length).to.equal(0);
+
+    compile = createCompile({
+      'process.env.NODE_ENV': JSON.stringify('dev')
+    });
+    args = compile.hookSeq('walker-member-expression-undefined', compile.parser, memberExpr, names);
+    expect(args[0].replacements[0].expr).to.equal(memberExpr);
+    expect(args[0].replacements[0].value).to.equal('"dev"');
+  });
+
+  it('walker-identifier-undefined', function() {
+    const memberExpr = {
+      type: 'Identifier',
+      start: 8,
+      end: 19,
+      name: 'DEFINED_VAR'
+    };
+
+    const names = {
+      name: 'DEFINED_VAR'
+    };
+
+    let compile = createCompile();
+
+    let args = compile.hookSeq('walker-identifier-undefined', compile.parser, memberExpr, names);
+    expect(args[0].replacements.length).to.equal(0);
+
+    compile = createCompile({
+      DEFINED_VAR: JSON.stringify('something')
+    });
+    args = compile.hookSeq('walker-identifier-undefined', compile.parser, memberExpr, names);
+    expect(args[0].replacements[0].expr).to.equal(memberExpr);
+    expect(args[0].replacements[0].value).to.equal('"something"');
+  });
+
+  it('test different values', function() {
+    let compile, args;
+
+    compile = createCompile({
+      V_NULL: null
+    });
+    args = compile.hookSeq('walker-member-expression-undefined', compile.parser, null, { name: 'V_NULL' });
+    expect(args[0].replacements[0].value).to.equal('null');
+
+    compile = createCompile({
+      V_UNDEFINED: undefined
+    });
+    args = compile.hookSeq('walker-member-expression-undefined', compile.parser, null, { name: 'V_UNDEFINED' });
+    expect(args[0].replacements[0].value).to.equal('undefined');
+
+    const reg = new RegExp('[0-9a-z]', 'ig');
+    compile = createCompile({
+      V_REGEXP: reg
+    });
+    args = compile.hookSeq('walker-member-expression-undefined', compile.parser, null, { name: 'V_REGEXP' });
+    expect(args[0].replacements[0].value).to.equal(reg.toString());
+
+    const func = () => func(1);
+    compile = createCompile({
+      V_FUNCTION: func
+    });
+    args = compile.hookSeq('walker-member-expression-undefined', compile.parser, null, { name: 'V_FUNCTION' });
+    expect(args[0].replacements[0].value).to.equal('(' + func.toString() + ')');
+
+    const obj = { a: 1, b: 4 };
+    compile = createCompile({
+      V_OBJECT: obj
+    });
+    args = compile.hookSeq('walker-member-expression-undefined', compile.parser, null, { name: 'V_OBJECT' });
+    const stringObj = args[0].replacements[0].value;
+    const toObj = new Function('return ' + stringObj)();
+    expect(JSON.stringify(obj)).to.equal(JSON.stringify(toObj));
+  });
+});
diff --git a/packages/plugin-eslint/.npmignore b/packages/plugin-eslint/.npmignore
new file mode 100644
index 000000000..3c3629e64
--- /dev/null
+++ b/packages/plugin-eslint/.npmignore
@@ -0,0 +1 @@
+node_modules
diff --git a/packages/plugin-eslint/CHANGELOG.md b/packages/plugin-eslint/CHANGELOG.md
new file mode 100644
index 000000000..c7c66c45d
--- /dev/null
+++ b/packages/plugin-eslint/CHANGELOG.md
@@ -0,0 +1,64 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# 2.1.0 (2020-07-04)
+
+**Note:** Version bump only for package @wepy/plugin-eslint
+
+
+
+
+
+# 2.1.0-alpha.10 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/plugin-eslint
+
+
+
+
+
+# 2.1.0-alpha.9 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/plugin-eslint
+
+
+
+
+
+# 2.1.0-alpha.8 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/plugin-eslint
+
+
+
+
+
+# 2.1.0-alpha.7 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/plugin-eslint
+
+
+
+
+
+# 2.1.0-alpha.6 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/plugin-eslint
+
+
+
+
+
+# 2.1.0-alpha.5 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/plugin-eslint
+
+
+
+
+
+# [2.1.0-alpha.4](https://github.com/Tencent/wepy/compare/v2.1.0-alpha.2...v2.1.0-alpha.4) (2020-06-20)
+
+**Note:** Version bump only for package @wepy/plugin-eslint
diff --git a/packages/plugin-eslint/README.md b/packages/plugin-eslint/README.md
new file mode 100644
index 000000000..70db87e52
--- /dev/null
+++ b/packages/plugin-eslint/README.md
@@ -0,0 +1,84 @@
+# wepy eslint 插件
+
+## 安装
+
+```bash
+npm install @wepy/plugin-eslint --save-dev
+```
+
+## 配置`wepy.config.js`
+
+```javascript
+const eslint = require('@wepy/plugin-eslint');
+
+module.exports = {
+  plugins: [
+    eslint({
+      // options
+    })
+  ]
+};
+```
+
+## 参数说明
+
+你提供的配置选项 ```options``` 将传递给 ```CLIEngine```处理，有关 ```options``` 的更多详细信息，请参阅[eslint文档](https://eslint.org/docs/developer-guide/nodejs-api#cliengine)。
+
+#### quiet (默认值: ```false```)
+
+如果此选项设置为true，插件将仅处理和报告错误，忽略警告
+
+```javascript
+const eslint = require('@wepy/plugin-eslint');
+
+module.exports = {
+  plugins: [
+    eslint({
+      quiet: true
+    })
+  ]
+};
+```
+#### fix (default: ```false```)
+
+启用 ```ESLint``` 自动修复功能
+
+注意：此选项将更改源文件
+
+#### output (default: ```true```)
+
+启用 ```ESLint```
+
+#### eslintPath (default: ```eslint```)
+
+用于 ```linting``` 的 ```ESLint``` 实例的路径
+
+#### formatter (default: eslint stylish formatter)
+
+用于格式化 ```ESLint``` 输出，选项值接收字符串或者函数
+
+```javascript
+const eslint = require('@wepy/plugin-eslint');
+
+module.exports = {
+  plugins: [
+    eslint({
+      // default value
+      formatter: require('eslint/lib/formatters/stylish'),
+
+      // community formatter
+      formatter: require('eslint-friendly-formatter'),
+
+      // custom formatter
+      formatter: function(results) {
+        // `results` format is available here
+        // http://eslint.org/docs/developer-guide/nodejs-api.html#executeonfiles()
+
+        // you should return a string
+        // DO NOT USE console.*() directly !
+        return 'OUTPUT'
+      }
+    })
+  ]
+};
+```
diff --git a/packages/plugin-eslint/index.js b/packages/plugin-eslint/index.js
new file mode 100644
index 000000000..9d293e8e5
--- /dev/null
+++ b/packages/plugin-eslint/index.js
@@ -0,0 +1,126 @@
+/**
+ * Tencent is pleased to support the open source community by making WePY available.
+ * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
+ * http://opensource.org/licenses/MIT
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+
+const objectHash = require('object-hash');
+const engines = {};
+
+let cached = {}; // ESLint line cache
+
+function lint(engine, file) {
+  return engine.executeOnFiles(file);
+}
+
+function printLinterOutput(res, options) {
+  if (res.warningCount && options.quiet) {
+    res.warningCount = 0;
+    res.results.forEach(item => {
+      item.warningCount = 0;
+      item.messages = item.messages.filter(message => message.severity !== 1);
+    });
+  }
+
+  // if enabled, use eslint auto-fixing where possible
+  if (options.fix && (res.fixableErrorCount > 0 || res.fixableWarningCount)) {
+    const eslint = require(options.eslintPath);
+    eslint.CLIEngine.outputFixes(res);
+  }
+  // removed file ignore warning
+  res.results.forEach(item => {
+    item.messages = item.messages.filter(msg => msg.message.indexOf('File ignored') === -1);
+  });
+
+  if (res.errorCount || res.warningCount) {
+    const fmt = options.formatter(res.results);
+
+    if (fmt && options.output) {
+      // eslint-disable-next-line
+      console.log(fmt);
+    }
+  }
+}
+
+exports = module.exports = function(options = {}) {
+  return function() {
+    // Clear the eslint cache when watch process done
+    this.register('process-clear', function() {
+      cached = {};
+    });
+
+    // Registe before parse hook to every process
+    ['wxs', 'config', 'script', 'template'].forEach(type => {
+      this.register('before-wepy-parser-' + type, function({ node, ctx } = {}) {
+        // wpy files goes here four times.
+        if (cached[ctx.file]) {
+          return Promise.resolve({ node, ctx });
+        }
+
+        if (ctx.npm) {
+          return Promise.resolve({ node, ctx });
+        }
+
+        cached[ctx.file] = 1;
+
+        options = Object.assign(
+          {},
+          {
+            useEslintrc: true,
+            eslintPath: 'eslint',
+            quiet: false,
+            output: true,
+            extensions: ['.js', this.options.wpyExt || '.wpy']
+          },
+          options
+        );
+
+        // Create singleton engine per config
+        const optionsHash = objectHash(options);
+        if (!engines[optionsHash]) {
+          const eslint = require(options.eslintPath);
+          engines[optionsHash] = new eslint.CLIEngine(options);
+        }
+
+        // Create eslint formatter
+        if (typeof options.formatter === 'string') {
+          try {
+            options.formatter = require(options.formatter);
+
+            if (
+              options.formatter &&
+              typeof options.formatter !== 'function' &&
+              typeof options.formatter.default === 'function'
+            ) {
+              options.formatter = options.formatter.default;
+            }
+          } catch (_) {
+            // ignore
+          }
+        }
+
+        if (!options.formatter || typeof options.formatter !== 'function') {
+          const userEslintPath = options.eslintPath;
+          if (userEslintPath) {
+            try {
+              options.formatter = require(userEslintPath + '/lib/formatters/stylish');
+            } catch (e) {
+              options.formatter = require('eslint/lib/formatters/stylish');
+            }
+          } else {
+            options.formatter = require('eslint/lib/formatters/stylish');
+          }
+        }
+
+        const engine = engines[optionsHash];
+
+        printLinterOutput(lint(engine, [ctx.file]), options);
+
+        return Promise.resolve({ node, ctx });
+      });
+    });
+  };
+};
diff --git a/packages/plugin-eslint/package-lock.json b/packages/plugin-eslint/package-lock.json
new file mode 100644
index 000000000..de4f2a2d9
--- /dev/null
+++ b/packages/plugin-eslint/package-lock.json
@@ -0,0 +1,13 @@
+{
+	"name": "@wepy/plugin-eslint",
+	"version": "2.1.0",
+	"lockfileVersion": 1,
+	"requires": true,
+	"dependencies": {
+		"object-hash": {
+			"version": "1.3.1",
+			"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz",
+			"integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA=="
+		}
+	}
+}
diff --git a/packages/plugin-eslint/package.json b/packages/plugin-eslint/package.json
new file mode 100644
index 000000000..73c8da465
--- /dev/null
+++ b/packages/plugin-eslint/package.json
@@ -0,0 +1,27 @@
+{
+  "name": "@wepy/plugin-eslint",
+  "version": "2.1.0",
+  "description": "wepy eslint",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "keywords": [
+    "wepy",
+    "eslint"
+  ],
+  "author": {
+    "name": "dlhandsome"
+  },
+  "license": "MIT",
+  "peerDependencies": {
+    "eslint": ">=1.6.0 <6.0.0"
+  },
+  "dependencies": {
+    "object-hash": "^1.3.1"
+  },
+  "readme": "ERROR: No README data found!",
+  "_id": "@wepy/plugin-eslint@0.1.5",
+  "_commitid": "251e67f",
+  "gitHead": "5a25776457360bbbbc54a4d059f6bc7c032d5df3"
+}
diff --git a/packages/plugin-eslint/test/index.test.js b/packages/plugin-eslint/test/index.test.js
new file mode 100644
index 000000000..f5a230612
--- /dev/null
+++ b/packages/plugin-eslint/test/index.test.js
@@ -0,0 +1 @@
+// Todo
diff --git a/packages/plugin-uglifyjs/.npmignore b/packages/plugin-uglifyjs/.npmignore
new file mode 100644
index 000000000..3c3629e64
--- /dev/null
+++ b/packages/plugin-uglifyjs/.npmignore
@@ -0,0 +1 @@
+node_modules
diff --git a/packages/plugin-uglifyjs/CHANGELOG.md b/packages/plugin-uglifyjs/CHANGELOG.md
new file mode 100644
index 000000000..534c68797
--- /dev/null
+++ b/packages/plugin-uglifyjs/CHANGELOG.md
@@ -0,0 +1,64 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# 2.1.0 (2020-07-04)
+
+**Note:** Version bump only for package @wepy/plugin-uglifyjs
+
+
+
+
+
+# 2.1.0-alpha.10 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/plugin-uglifyjs
+
+
+
+
+
+# 2.1.0-alpha.9 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/plugin-uglifyjs
+
+
+
+
+
+# 2.1.0-alpha.8 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/plugin-uglifyjs
+
+
+
+
+
+# 2.1.0-alpha.7 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/plugin-uglifyjs
+
+
+
+
+
+# 2.1.0-alpha.6 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/plugin-uglifyjs
+
+
+
+
+
+# 2.1.0-alpha.5 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/plugin-uglifyjs
+
+
+
+
+
+# [2.1.0-alpha.4](https://github.com/Tencent/wepy/compare/v2.1.0-alpha.2...v2.1.0-alpha.4) (2020-06-20)
+
+**Note:** Version bump only for package @wepy/plugin-uglifyjs
diff --git a/packages/plugin-uglifyjs/README.md b/packages/plugin-uglifyjs/README.md
new file mode 100644
index 000000000..6a278482c
--- /dev/null
+++ b/packages/plugin-uglifyjs/README.md
@@ -0,0 +1,27 @@
+# wepy uglifyjs 插件
+
+## 安装
+
+```bash
+npm install @wepy/plugin-uglifyjs uglify-js --save-dev
+```
+
+## 配置`wepy.config.js`
+
+```javascript
+const PluginUglifyjs = require('@wepy/plugin-uglifyjs');
+
+module.exports = {
+  plugins: [
+    PluginUglifyjs({
+    // options
+    })
+  ]
+};
+```
+
+## 参数说明
+
+你提供的配置选项 ```options``` 将传递给 ```UglifyJS```处理，有关 ```options``` 的更多详细信息，请参阅[UglifyJS文档](https://github.com/mishoo/UglifyJS2#minify-options)。
+
+
diff --git a/packages/plugin-uglifyjs/index.js b/packages/plugin-uglifyjs/index.js
new file mode 100644
index 000000000..542c74f9a
--- /dev/null
+++ b/packages/plugin-uglifyjs/index.js
@@ -0,0 +1,95 @@
+/**
+ * Tencent is pleased to support the open source community by making WePY available.
+ * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
+ * http://opensource.org/licenses/MIT
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+
+const UglifyJS = require('uglify-js');
+const path = require('path');
+
+/*
+ * To human readable size
+ */
+function formatSizeUnits(bytes) {
+  if (bytes >= 1073741824) {
+    bytes = (bytes / 1073741824).toFixed(2) + ' GB';
+  } else if (bytes >= 1048576) {
+    bytes = (bytes / 1048576).toFixed(2) + ' MB';
+  } else if (bytes >= 1024) {
+    bytes = (bytes / 1024).toFixed(2) + ' KB';
+  } else if (bytes > 1) {
+    bytes = bytes + ' bytes';
+  } else if (bytes === 1) {
+    bytes = bytes + ' byte';
+  } else {
+    bytes = '0 bytes';
+  }
+  return bytes;
+}
+
+let totalSize = 0;
+let totalFile = 0;
+let totalMinSize = 0;
+
+exports = module.exports = function(options = {}) {
+  return function() {
+    this.register('process-done', function() {
+      this.logger.info(
+        'uglifyjs',
+        `Compressed File: ${totalFile}, Original Size: ${formatSizeUnits(
+          totalSize
+        )}, Compressed Size: ${formatSizeUnits(totalMinSize)}, Ratio: ${(totalMinSize / totalSize).toFixed(2)}%`
+      );
+
+      // Clear data
+      totalFile = 0;
+      totalSize = 0;
+      totalMinSize = 0;
+    });
+
+    this.register('output-file', function({ filename, code, encoding }) {
+      this.logger.silly('uglifyjs', 'File: ' + filename);
+
+      let ext = path.extname(filename);
+      if (ext !== '.js') {
+        return { filename, code, encoding };
+      }
+
+      totalFile++;
+      totalSize += code.length;
+
+      let result = UglifyJS.minify({ [filename]: code }, options);
+
+      if (result.error) {
+        let pos = {
+          line: result.error.line,
+          column: result.error.col
+        };
+        throw {
+          handler: 'script',
+          error: {
+            filename: result.error.filename,
+            code: code,
+            type: 'error',
+            message: result.error.message,
+            title: 'uglifyjs'
+          },
+          pos: {
+            start: pos,
+            end: pos
+          }
+        };
+      } else {
+        totalMinSize += result.code.length;
+        return Promise.resolve({
+          filename,
+          code: result.code,
+          encoding
+        });
+      }
+    });
+  };
+};
diff --git a/packages/plugin-uglifyjs/package.json b/packages/plugin-uglifyjs/package.json
new file mode 100644
index 000000000..c0efbe822
--- /dev/null
+++ b/packages/plugin-uglifyjs/package.json
@@ -0,0 +1,24 @@
+{
+  "name": "@wepy/plugin-uglifyjs",
+  "version": "2.1.0",
+  "description": "wepy uglifyjs",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "keywords": [
+    "wepy",
+    "uglifyjs"
+  ],
+  "author": {
+    "name": "Gcaufy"
+  },
+  "license": "MIT",
+  "peerDependencies": {
+    "uglify-js": "^3.4.9"
+  },
+  "readme": "ERROR: No README data found!",
+  "_id": "@wepy/plugin-uglifyjs@0.0.3",
+  "_commitid": "4a8435b",
+  "gitHead": "5a25776457360bbbbc54a4d059f6bc7c032d5df3"
+}
diff --git a/packages/plugin-uglifyjs/test/index.test.js b/packages/plugin-uglifyjs/test/index.test.js
new file mode 100644
index 000000000..f5a230612
--- /dev/null
+++ b/packages/plugin-uglifyjs/test/index.test.js
@@ -0,0 +1 @@
+// Todo
diff --git a/packages/redux/CHANGELOG.md b/packages/redux/CHANGELOG.md
new file mode 100644
index 000000000..a9dc3bd98
--- /dev/null
+++ b/packages/redux/CHANGELOG.md
@@ -0,0 +1,64 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# 2.1.0 (2020-07-04)
+
+**Note:** Version bump only for package @wepy/redux
+
+
+
+
+
+# 2.1.0-alpha.10 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/redux
+
+
+
+
+
+# 2.1.0-alpha.9 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/redux
+
+
+
+
+
+# 2.1.0-alpha.8 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/redux
+
+
+
+
+
+# 2.1.0-alpha.7 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/redux
+
+
+
+
+
+# 2.1.0-alpha.6 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/redux
+
+
+
+
+
+# 2.1.0-alpha.5 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/redux
+
+
+
+
+
+# [2.1.0-alpha.4](https://github.com/Tencent/wepy/compare/v2.1.0-alpha.2...v2.1.0-alpha.4) (2020-06-20)
+
+**Note:** Version bump only for package @wepy/redux
diff --git a/packages/redux/README.md b/packages/redux/README.md
new file mode 100644
index 000000000..7a4a4da3c
--- /dev/null
+++ b/packages/redux/README.md
@@ -0,0 +1,103 @@
+[English](./README_EN.md) | 简体中文
+
+# WePY 2.0中的Redux
+
+## 安装
+
+```
+npm install @wepy/redux redux --save
+```
+
+## 用法
+
+1. 安装Redux
+
+```
+// app.wpy
+import wepy from '@wepy/core';
+import wepyRedux from '@wepy/redux';
+
+wepy.use(wepyRedux);
+```
+
+2. 初始化 Store
+
+```
+// ~/store.js
+import { createStore, combineReducers } from 'redux';
+
+export default createStore(combineReducers({
+  counter (state = { num: 0 }, action) {
+    switch (action.type) {
+      case 'ADD':
+        return {
+          ...state,
+          num: state.num + 1
+        };
+    }
+    return state;
+  }
+}));
+```
+
+3. 映射到组件
+
+```
+// ~/counter.wpy
+<template>
+  <div> {{counter.num}} </div>
+  <button @tap="increment"> Increment </button>
+</template>
+<script>
+import wepy from '@wepy/core';
+import { mapState } from '@wepy/redux';
+import store from './store'
+
+wepy.component({
+  store,
+  computed: {
+    ...mapState([ 'counter' ])
+  },
+  methods: {
+    increment () {
+      this.$store.dispatch({ type: 'ADD' })
+    }
+  }
+})
+```
+
+## API
+
+* mapState(states) 
+
+  状态：字符串/数组/K-V对象.。需要映射的 state 属性。如:
+
+  ```
+  mapState('counter')
+  mapState(['counter', 'somethingelse'])
+  mapState({ alias: 'counter' })
+  mapState({ 
+    num: function (state) {
+      return state.counter.num;
+    } 
+  })
+  ```
+
+* mapActions(actions)
+
+  actions: K-V Object. 需要映射的 action 。如：
+
+  ```
+  mapActions({ add: 'ADD' });
+  mapActions({ 
+    add: function () {
+      return {
+        type: 'ADD'
+      };
+    } 
+  });
+  ```
+
+## Document 
+
+[https://redux.jg.org](https://redux.js.org)
\ No newline at end of file
diff --git a/packages/redux/README_EN.md b/packages/redux/README_EN.md
new file mode 100644
index 000000000..5660be8b0
--- /dev/null
+++ b/packages/redux/README_EN.md
@@ -0,0 +1,96 @@
+English | [简体中文](./README.md)
+
+# Redux in WePY 2.0 
+
+## Install
+
+```
+npm install @wepy/redux redux --save
+```
+
+## Usage
+
+1. Install Redux
+```
+// app.wpy
+import wepy from '@wepy/core';
+import wepyRedux from '@wepy/redux';
+
+wepy.use(wepyRedux);
+```
+
+2. Initialize a store
+```
+// ~/store.js
+import { createStore, combineReducers } from 'redux';
+
+export default createStore(combineReducers({
+  counter (state = { num: 0 }, action) {
+    switch (action.type) {
+      case 'ADD':
+        return {
+          ...state,
+          num: state.num + 1
+        };
+    }
+    return state;
+  }
+}));
+```
+
+3. Map to Component
+```
+// ~/counter.wpy
+<template>
+  <div> {{counter.num}} </div>
+  <button @tap="increment"> Increment </button>
+</template>
+<script>
+import wepy from '@wepy/core';
+import { mapState } from '@wepy/redux';
+import store from './store'
+
+wepy.component({
+  store,
+  computed: {
+    ...mapState([ 'counter' ])
+  },
+  methods: {
+    increment () {
+      this.$store.dispatch({ type: 'ADD' })
+    }
+  }
+})
+```
+
+## API
+
+* mapState(states) 
+
+    states: String/Array/K-V Object. 需要映射的 state 属性。如:
+    ```
+    mapState('counter')
+    mapState(['counter', 'somethingelse'])
+    mapState({ alias: 'counter' })
+    mapState({ 
+      num: function (state) {
+        return state.counter.num;
+      } 
+    })
+    ```
+* mapActions(actions)
+
+    actions: K-V Object. 需要映射的 action 。如：
+    ```
+    mapActions({ add: 'ADD' });
+    mapActions({ 
+      add: function () {
+        return {
+          type: 'ADD'
+        };
+      } 
+    });
+    ```
+
+## Document 
+[https://redux.jg.org](https://redux.js.org)
diff --git a/packages/redux/dist/index.js b/packages/redux/dist/index.js
new file mode 100644
index 000000000..6c61929df
--- /dev/null
+++ b/packages/redux/dist/index.js
@@ -0,0 +1,152 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+function normalizeMap(map) {
+  if (typeof map === 'string') { map = [map]; }
+  return Array.isArray(map) ? map.map(function (k) { return ({ key: k, val: k }); }) : Object.keys(map).map(function (k) { return ({ key: k, val: map[k] }); });
+}
+
+var mapState = function(states) {
+  var res = Object.create(null);
+  var resValueMap = Object.create(null);
+  normalizeMap(states).forEach(function (ref) {
+    var key = ref.key;
+    var val = ref.val;
+
+    /**
+     * resValueMap 记录由 mapState 产生的值
+     * 在初始化时将其变成 observer 的
+     */
+    resValueMap[key] = Object.preventExtensions({ value: undefined });
+    res[key] = function mappedState() {
+      var state = this.$store.getState();
+      var value = typeof val === 'function' ? val.call(this, state) : state[val];
+
+      // 利用 redux state 每次改变都会返回一个新 state 的特性，只需做引用比较
+      var resValueMap = res[key][this.$id];
+      if (resValueMap[key].value !== value) {
+        resValueMap[key] = Object.preventExtensions({ value: value });
+      }
+      return resValueMap[key].value;
+    };
+    res[key].redux = true;
+    res[key].resValueMap = resValueMap;
+  });
+  return res;
+};
+
+var mapActions = function(actions) {
+  var res = {};
+  normalizeMap(actions).forEach(function (ref) {
+    var key = ref.key;
+    var val = ref.val;
+
+    res[key] = function mappedAction() {
+      var args = [], len = arguments.length;
+      while ( len-- ) args[ len ] = arguments[ len ];
+
+      if (!this.$store) {
+        // eslint-disable-next-line
+        console.warn(("[@wepy/redux] action \"" + key + "\" do not work, if store is not defined."));
+        return;
+      }
+      var dispatchParam;
+      if (typeof val === 'string') {
+        dispatchParam = {
+          type: val,
+          payload: args.length > 1 ? args : args[0]
+        };
+      } else {
+        dispatchParam = typeof val === 'function' ? val.apply(this.$store, args) : val;
+      }
+      return this.$store.dispatch(dispatchParam);
+    };
+  });
+  return res;
+};
+
+function wepyInstall(wepy) {
+  wepy.mixin({
+    beforeCreate: function beforeCreate() {
+      var options = this.$options;
+      if (options.store) {
+        this.$store = typeof options.store === 'function' ? options.store() : options.store;
+      } else if (options.parent && options.parent.$store) {
+        this.$store = options.parent.$store;
+      }
+      if (checkReduxComputed(this.$options)) {
+        if (!this.$store) {
+          // eslint-disable-next-line
+          console.warn("[@wepy/redux] state do not work, if store is not defined.");
+          return;
+        }
+        var ref = this.$options;
+        var computed = ref.computed;
+        var keys = Object.keys(computed);
+        var resValueMap;
+        for (var i = 0; i < keys.length; i++) {
+          if ('resValueMap' in computed[keys[i]]) {
+            if (!resValueMap) {
+              resValueMap = Object.assign({}, computed[keys[i]].resValueMap);
+            }
+            computed[keys[i]][this.$id] = resValueMap;
+          }
+        }
+        wepy.observe({
+          vm: this,
+          key: '',
+          value: resValueMap,
+          parent: '',
+          root: true
+        });
+      }
+    },
+
+    created: function created() {
+      var this$1 = this;
+
+      if (!checkReduxComputed(this.$options)) {
+        return;
+      }
+      var store = this.$store;
+      var ref = this.$options;
+      var computed = ref.computed;
+      this.$unsubscribe = store.subscribe(function () {
+        var keys = Object.keys(computed);
+        for (var i = 0; i < keys.length; i++) {
+          if ('redux' in computed[keys[i]]) {
+            this$1._computedWatchers[keys[i]].get();
+          }
+        }
+      });
+    },
+
+    detached: function detached() {
+      this.$unsubscribe && this.$unsubscribe();
+    }
+  });
+}
+
+function checkReduxComputed(options) {
+  if (!('computed' in options)) {
+    return false;
+  }
+  var computed = options.computed;
+  var keys = Object.keys(computed);
+  for (var i = 0; i < keys.length; i++) {
+    if ('redux' in computed[keys[i]]) {
+      return true;
+    }
+  }
+  return false;
+}
+
+var index = {
+  install: wepyInstall,
+  version: "2.0.3"
+};
+
+exports.default = index;
+exports.mapState = mapState;
+exports.mapActions = mapActions;
diff --git a/packages/redux/helper.js b/packages/redux/helper.js
new file mode 100644
index 000000000..dbcf617ba
--- /dev/null
+++ b/packages/redux/helper.js
@@ -0,0 +1,54 @@
+function normalizeMap(map) {
+  if (typeof map === 'string') map = [map];
+  return Array.isArray(map) ? map.map(k => ({ key: k, val: k })) : Object.keys(map).map(k => ({ key: k, val: map[k] }));
+}
+
+export const mapState = function(states) {
+  const res = Object.create(null);
+  const resValueMap = Object.create(null);
+  normalizeMap(states).forEach(({ key, val }) => {
+    /**
+     * resValueMap 记录由 mapState 产生的值
+     * 在初始化时将其变成 observer 的
+     */
+    resValueMap[key] = Object.preventExtensions({ value: undefined });
+    res[key] = function mappedState() {
+      const state = this.$store.getState();
+      const value = typeof val === 'function' ? val.call(this, state) : state[val];
+
+      // 利用 redux state 每次改变都会返回一个新 state 的特性，只需做引用比较
+      const resValueMap = res[key][this.$id];
+      if (resValueMap[key].value !== value) {
+        resValueMap[key] = Object.preventExtensions({ value });
+      }
+      return resValueMap[key].value;
+    };
+    res[key].redux = true;
+    res[key].resValueMap = resValueMap;
+  });
+  return res;
+};
+
+export const mapActions = function(actions) {
+  const res = {};
+  normalizeMap(actions).forEach(({ key, val }) => {
+    res[key] = function mappedAction(...args) {
+      if (!this.$store) {
+        // eslint-disable-next-line
+        console.warn(`[@wepy/redux] action "${key}" do not work, if store is not defined.`);
+        return;
+      }
+      let dispatchParam;
+      if (typeof val === 'string') {
+        dispatchParam = {
+          type: val,
+          payload: args.length > 1 ? args : args[0]
+        };
+      } else {
+        dispatchParam = typeof val === 'function' ? val.apply(this.$store, args) : val;
+      }
+      return this.$store.dispatch(dispatchParam);
+    };
+  });
+  return res;
+};
diff --git a/packages/redux/index.js b/packages/redux/index.js
new file mode 100644
index 000000000..a7dc23d3f
--- /dev/null
+++ b/packages/redux/index.js
@@ -0,0 +1,8 @@
+import { mapState, mapActions } from './helper';
+import install from './install';
+
+export default {
+  install,
+  version: __VERSION__
+};
+export { mapState, mapActions };
diff --git a/packages/redux/install.js b/packages/redux/install.js
new file mode 100644
index 000000000..4a064c837
--- /dev/null
+++ b/packages/redux/install.js
@@ -0,0 +1,71 @@
+export default function wepyInstall(wepy) {
+  wepy.mixin({
+    beforeCreate() {
+      const options = this.$options;
+      if (options.store) {
+        this.$store = typeof options.store === 'function' ? options.store() : options.store;
+      } else if (options.parent && options.parent.$store) {
+        this.$store = options.parent.$store;
+      }
+      if (checkReduxComputed(this.$options)) {
+        if (!this.$store) {
+          // eslint-disable-next-line
+          console.warn(`[@wepy/redux] state do not work, if store is not defined.`);
+          return;
+        }
+        const { computed } = this.$options;
+        const keys = Object.keys(computed);
+        let resValueMap;
+        for (let i = 0; i < keys.length; i++) {
+          if ('resValueMap' in computed[keys[i]]) {
+            if (!resValueMap) {
+              resValueMap = { ...computed[keys[i]].resValueMap };
+            }
+            computed[keys[i]][this.$id] = resValueMap;
+          }
+        }
+        wepy.observe({
+          vm: this,
+          key: '',
+          value: resValueMap,
+          parent: '',
+          root: true
+        });
+      }
+    },
+
+    created() {
+      if (!checkReduxComputed(this.$options)) {
+        return;
+      }
+      const store = this.$store;
+      const { computed } = this.$options;
+      this.$unsubscribe = store.subscribe(() => {
+        const keys = Object.keys(computed);
+        for (let i = 0; i < keys.length; i++) {
+          if ('redux' in computed[keys[i]]) {
+            this._computedWatchers[keys[i]].get();
+          }
+        }
+      });
+    },
+
+    detached() {
+      this.$unsubscribe && this.$unsubscribe();
+    }
+  });
+}
+
+function checkReduxComputed(options) {
+  if (!('computed' in options)) {
+    return false;
+  }
+  const { computed } = options;
+  const keys = Object.keys(computed);
+  for (let i = 0; i < keys.length; i++) {
+    if ('redux' in computed[keys[i]]) {
+      return true;
+    }
+  }
+  return false;
+}
diff --git a/packages/redux/package.json b/packages/redux/package.json
new file mode 100644
index 000000000..1fb359020
--- /dev/null
+++ b/packages/redux/package.json
@@ -0,0 +1,30 @@
+{
+  "name": "@wepy/redux",
+  "version": "2.1.0",
+  "description": "Redux in WePY",
+  "main": "dist/index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/Tencent/wepy.git"
+  },
+  "keywords": [
+    "Redux",
+    "WePY"
+  ],
+  "author": {
+    "name": "Gcaufy",
+    "email": "gcaufy@gmail.com"
+  },
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/Tencent/wepy/issues"
+  },
+  "homepage": "https://github.com/Tencent/wepy#readme",
+  "readme": "README.md",
+  "_id": "@wepy/redux@2.0.3",
+  "_commitid": "a423f8d",
+  "gitHead": "5a25776457360bbbbc54a4d059f6bc7c032d5df3"
+}
diff --git a/packages/router/README.md b/packages/router/README.md
new file mode 100644
index 000000000..48174da93
--- /dev/null
+++ b/packages/router/README.md
@@ -0,0 +1,10 @@
+
+**Coming soon**
+
+
+* [Usage](./doc/usage.md)
+* [配置](./doc/config.md)
+* [导航守卫](./doc/guard.md)
+* API
+    * [router](./doc/router.md)
+    * [实例](./doc/instance.md)
diff --git a/packages/router/core/config.js b/packages/router/core/config.js
new file mode 100644
index 000000000..7f4e46ce2
--- /dev/null
+++ b/packages/router/core/config.js
@@ -0,0 +1,18 @@
+/**
+ * @desc
+ * @author wudi@supermonkey.com.cn
+ * @createDate 2019/11/18
+ */
+const config = {
+  homePage: '',
+  tabPages: [],
+  routeMap: {}
+}
+
+function setConfig(obj) {
+  Object.assign(config, obj)
+}
+
+export { setConfig }
+
+export default config
diff --git a/packages/router/core/createRouter.js b/packages/router/core/createRouter.js
new file mode 100644
index 000000000..bf86ad314
--- /dev/null
+++ b/packages/router/core/createRouter.js
@@ -0,0 +1,86 @@
+/**
+ * @desc
+ * @author wudi@supermonkey.com.cn
+ * @createDate 2019/11/18
+ */
+import guard, { createRouterGuard } from './guard'
+import getRealPageInfo from './utils/getRealPageInfo'
+import { setConfig } from './config'
+import routeManager from './routeManager'
+import routerApi from './routerApi'
+
+/**
+ * 创建路由实例
+ * @param config 路由配置
+ */
+export default function createRouter(config) {
+  config['routeMap'] = normalizeRouteMap(config.routeMap)
+  setConfig(config)
+
+  return {
+    getRealPageInfo,
+    ...config,
+    ...routerApi,
+    get currentVm() {
+      return routeManager.currentVm
+    },
+    get route() {
+      return routeManager.route
+    },
+    beforeEach: cb => guard.globalGuard.beforeEach(cb),
+    beforeResolve: cb => guard.globalGuard.beforeResolve(cb),
+    afterEach: cb => guard.globalGuard.afterEach(cb)
+  }
+
+  function normalizeRouteMap(routeMap) {
+    const normalizeRouteMap = {}
+
+    for (const key in routeMap) {
+      if (!guard.hasInRouterGuardMap(key)) {
+        guard.updateRouterGuardMap(createRouterGuard(key))
+      }
+
+      if (typeof routeMap[key] === 'string') {
+        normalizeRouteMap[key] = { handler: () => handleStrResult(routeMap[key]) }
+      } else if (typeof routeMap[key] === 'function') {
+        normalizeRouteMap[key] = { handler: createHandler(routeMap[key]) }
+      } else {
+        if ('handler' in routeMap[key]) {
+          normalizeRouteMap[key] = { handler: createHandler(routeMap[key].handler) }
+        } else {
+          normalizeRouteMap[key] = { handler: () => routeMap[key] }
+        }
+
+        if ('beforeEnter' in routeMap[key]) {
+          normalizeRouteMap[key]['beforeEnter'] = routeMap[key].beforeEnter
+        }
+      }
+
+      if ('beforeEnter' in normalizeRouteMap[key]) {
+        guard.routerGuardMap[key].beforeEnter(normalizeRouteMap[key].beforeEnter)
+      }
+    }
+
+    return normalizeRouteMap
+
+    function createHandler(fn) {
+      return ({ query }) => {
+        const result = fn({ query })
+
+        if (typeof result === 'string') {
+          return handleStrResult(result)
+        }
+
+        return result
+      }
+    }
+
+    function handleStrResult(str) {
+      if (str.indexOf('/') === -1) {
+        return { name: str }
+      }
+
+      return { path: str }
+    }
+  }
+}
diff --git a/packages/router/core/guard/createComponentGuard.js b/packages/router/core/guard/createComponentGuard.js
new file mode 100644
index 000000000..227f2cde7
--- /dev/null
+++ b/packages/router/core/guard/createComponentGuard.js
@@ -0,0 +1,34 @@
+
+import { createGuardManager } from './guardManager'
+
+function createComponentGuard(name) {
+  const beforeRouteLeaveManager = createGuardManager()
+  const beforeRouteEnterManager = createGuardManager()
+  const beforeRouteUpdateManager = createGuardManager()
+
+  return {
+    get name() {
+      return name
+    },
+    get beforeRouteLeaveGuards() {
+      return beforeRouteLeaveManager.guards
+    },
+    get beforeRouteEnterGuards() {
+      return beforeRouteEnterManager.guards
+    },
+    get beforeRouteUpdateGuards() {
+      return beforeRouteUpdateManager.guards
+    },
+    beforeRouteLeave(cb) {
+      beforeRouteLeaveManager.register(cb)
+    },
+    beforeRouteEnter(cb) {
+      beforeRouteEnterManager.register(cb)
+    },
+    beforeRouteUpdate(cb) {
+      beforeRouteUpdateManager.register(cb)
+    }
+  }
+}
+
+export default createComponentGuard
diff --git a/packages/router/core/guard/createRouterGuard.js b/packages/router/core/guard/createRouterGuard.js
new file mode 100644
index 000000000..8e190275a
--- /dev/null
+++ b/packages/router/core/guard/createRouterGuard.js
@@ -0,0 +1,20 @@
+
+import { createGuardManager } from './guardManager'
+
+function createRouterGuard(name) {
+  const beforeEnterManager = createGuardManager()
+
+  return {
+    get name() {
+      return name
+    },
+    get beforeEnterGuards() {
+      return beforeEnterManager.guards
+    },
+    beforeEnter(cb) {
+      beforeEnterManager.register(cb)
+    }
+  }
+}
+
+export default createRouterGuard
diff --git a/packages/router/core/guard/globalGuard.js b/packages/router/core/guard/globalGuard.js
new file mode 100644
index 000000000..2fcd994db
--- /dev/null
+++ b/packages/router/core/guard/globalGuard.js
@@ -0,0 +1,27 @@
+
+import { createGuardManager } from './guardManager'
+
+const beforeEachManager = createGuardManager()
+const beforeResolveManager = createGuardManager()
+const afterEachManager = createGuardManager()
+
+export default {
+  get beforeEachGuards() {
+    return beforeEachManager.guards
+  },
+  get beforeResolveGuards() {
+    return beforeResolveManager.guards
+  },
+  get afterEachGuards() {
+    return afterEachManager.guards
+  },
+  beforeEach(cb) {
+    beforeEachManager.register(cb)
+  },
+  beforeResolve(cb) {
+    beforeResolveManager.register(cb)
+  },
+  afterEach(cb) {
+    afterEachManager.register(cb)
+  }
+}
diff --git a/packages/router/core/guard/guardManager.js b/packages/router/core/guard/guardManager.js
new file mode 100644
index 000000000..a53fa9690
--- /dev/null
+++ b/packages/router/core/guard/guardManager.js
@@ -0,0 +1,37 @@
+
+function createGuardManager() {
+  const guards = []
+
+  return {
+    register(guard) {
+      guards.push(guard)
+
+      return () => {
+        this.unRegister(guard)
+      }
+    },
+
+    unRegister(guard) {
+      const index = guards.indexOf(guard)
+
+      if (index !== -1) {
+        guards.splice(index, 1)
+
+        return true
+      }
+
+      console.warn('此 guard 并未注册，因此无法注销 ')
+
+      return false
+    },
+    clear() {
+      guards.length = 0
+    },
+
+    get guards() {
+      return guards.slice()
+    }
+  }
+}
+
+export { createGuardManager }
diff --git a/packages/router/core/guard/index.js b/packages/router/core/guard/index.js
new file mode 100644
index 000000000..4e7b78848
--- /dev/null
+++ b/packages/router/core/guard/index.js
@@ -0,0 +1,40 @@
+/**
+ * @desc
+ * @author wudi@supermonkey.com.cn
+ * @createDate 2019/11/18
+ */
+import createComponentGuard from './createComponentGuard'
+import createRouterGuard from './createRouterGuard'
+import globalGuard from './globalGuard'
+
+const routerGuardMap = {}
+const componentGuardMap = {}
+
+export {
+  createComponentGuard,
+  createRouterGuard
+}
+
+export default {
+  get globalGuard() {
+    return globalGuard
+  },
+  get routerGuardMap() {
+    return routerGuardMap
+  },
+  get componentGuardMap() {
+    return componentGuardMap
+  },
+  updateRouterGuardMap(routerGuard) {
+    routerGuardMap[routerGuard.name] = routerGuard
+  },
+  updateComponentGuardMap(componentGuard) {
+    componentGuardMap[componentGuard.name] = componentGuard
+  },
+  hasInRouterGuardMap(name) {
+    return name in routerGuardMap
+  },
+  hasInComponentGuardMap(name) {
+    return name in componentGuardMap
+  }
+}
diff --git a/packages/router/core/index.js b/packages/router/core/index.js
new file mode 100644
index 000000000..3193c3c91
--- /dev/null
+++ b/packages/router/core/index.js
@@ -0,0 +1,23 @@
+/**
+ * @desc
+ * @author wudi@supermonkey.com.cn
+ * @createDate 2020/3/5
+ */
+import { encodeParams, encodeUrl, decodeParams, decodePage, decodeUrl } from './utils/urlParse'
+import createRouter from './createRouter'
+import guard, { createComponentGuard } from './guard'
+import routeManager from './routeManager'
+import config from './config'
+
+export {
+  encodeParams,
+  encodeUrl,
+  decodeParams,
+  decodePage,
+  decodeUrl,
+  createRouter,
+  guard,
+  createComponentGuard,
+  routeManager,
+  config
+}
diff --git a/packages/router/core/routeManager.js b/packages/router/core/routeManager.js
new file mode 100644
index 000000000..747e998ed
--- /dev/null
+++ b/packages/router/core/routeManager.js
@@ -0,0 +1,104 @@
+
+const _currentRoutes = []
+const _showRoutes = []
+let _next = null
+let _currentVm = null
+let _currentRoute = null
+
+// 页面参数缓存
+const routeManager = {
+  get currentVm() {
+    return _currentVm
+  },
+  get next() {
+    return _next
+  },
+  get routes() {
+    return _currentRoutes
+  },
+  get route() {
+    return _currentRoute
+  },
+  get referrerRoute() {
+    if (_showRoutes.length <= 1) {
+      return null
+    }
+
+    return _showRoutes[0]
+  },
+
+  get lastRoute() {
+    return nthRoute(routeManager.routes, -2)
+  },
+
+  setCurrentVm(vm) {
+    _currentVm = vm
+  },
+  setNext(next) {
+    _next = next
+  },
+  clearNext() {
+    _next = null
+  },
+  createRoute(params) {
+    const {
+      id = null,
+      name,
+      query = {},
+      routes = null,
+      fullPath,
+      referrerRoute = null,
+      meta = null,
+      redirectedFrom = null
+    } = params
+
+    const path = fullPath.split('?')[0]
+
+    return {
+      id, name, query, routes, path, fullPath, referrerRoute, meta, redirectedFrom
+    }
+  },
+  setCurrentRoute(route) {
+    _currentRoute = route
+  },
+  updateCurrentRoute(params) {
+    Object.assign(_currentRoute, params)
+  },
+  pushRoute(route) {
+    _currentRoutes.push(route)
+
+    return route
+  },
+  popRoute() {
+    return _currentRoutes.pop()
+  },
+  clearRoutes() {
+    _currentRoutes.length = 0
+  },
+  pushShowRoute(route) {
+    if (last(_showRoutes) && route.id === last(_showRoutes).id) {
+      return route
+    }
+
+    _showRoutes.push(route)
+
+    if (_showRoutes.length > 2) {
+      _showRoutes.shift()
+    }
+
+    return route
+  },
+  clearShowRoutes() {
+    _showRoutes.length = 0
+  }
+}
+
+export default routeManager
+
+function last(list, index = 1) {
+  return list[list.length - index] || null
+}
+
+function nthRoute(routes, index) {
+  return (index >= 0 ? routes[index] : last(routes, -index)) || null
+}
diff --git a/packages/router/core/routerApi.js b/packages/router/core/routerApi.js
new file mode 100644
index 000000000..1ef7ceefe
--- /dev/null
+++ b/packages/router/core/routerApi.js
@@ -0,0 +1,234 @@
+/**
+ * @desc
+ * @author wudi@supermonkey.com.cn
+ * @createDate 2019/7/3
+ */
+import getRealPageInfo from './utils/getRealPageInfo'
+import { encodeUrl } from './utils/urlParse'
+import runQueue from './utils/queue'
+import guard from './guard'
+import routeManager from './routeManager'
+import config from './config'
+
+const errorHandlers = []
+
+/**
+ * 将路由接口（'navigateBack', 'navigateTo', 'redirectTo', 'reLaunch', 'switchTab'）promise化
+ * 修改传入参数。由 url 改为 name、query
+ * name 为页面名称（String）、query 为页面参数的键值对（Object）
+ */
+const wxApiList = ['navigateBack', 'navigateTo', 'redirectTo', 'reLaunch', 'switchTab']
+const promiseRouteApi = jumpMethodName => async (params = {}, encode = false) => {
+  const { success = () => {}, fail = () => {}, complete = () => {}, delta = 1, name, query = {}, ...otherParams } = params
+
+  if (jumpMethodName !== 'navigateBack' && name === undefined) {
+    throw new Error('页面跳转没有传入 name')
+  }
+
+  // 解析出真正要跳转的页面
+  const { pageMethod, pageDelta, realPage, pageData, pageMeta, pageEncode, pages } = await runGuard({
+    name, query, delta, jumpMethodName, encode
+  })
+
+  // 处理 beforeRouteUpdate
+  if (realPage === routeManager.route.name) {
+    routeManager.updateCurrentRoute({ query: pageData, meta: pageMeta })
+
+    return true
+  }
+
+  // hack 处理，因为 onHide 时拿到的 route 不对
+  routeManager['__tempRoute'] = getRoute({
+    pageMethod, pageDelta, realPage, pageData, pageMeta, pages
+  })
+
+  return handleNavigator(
+    getRealMethod({ pageMethod, realPage }),
+    getNavigatorParams({
+      pageMethod, pageDelta, realPage, pageData, pageEncode
+    }),
+    { success, fail, complete }
+  )
+
+  async function runGuard({ name, query = {}, delta, jumpMethodName = 'navigateTo', encode }) {
+    routeManager.clearNext()
+
+    const to = getTo({
+      name, query, delta, jumpMethodName, encode
+    })
+    try {
+      await runQueue(getGuardQueue(to.name, to.pages), guard => new Promise(async (resolve, reject) => {
+        const handleNext = createHandleNext()
+        try {
+          const res = await guard(
+            to,
+            routeManager.route,
+            handleNext.bind(null, resolve, reject)
+          )
+
+          res !== undefined && handleNext(resolve, reject, res)
+        } catch (e) {
+          handleNext(resolve, reject, e)
+        }
+
+        function createHandleNext() {
+          let isExecuted = false
+
+          return (resolve, reject, to) => {
+            if (isExecuted) {
+              return
+            }
+
+            isExecuted = true
+
+            if (to === false) {
+              reject(new Error('router to: false'))
+            } else if (type(to) === 'Error') {
+              reject(to)
+
+              errorHandlers.forEach(errorHandler => errorHandler(to))
+            } else if (type(to) === 'Object') {
+              reject(to)
+            } else if (type(to) === 'Function') {
+              resolve()
+
+              routeManager.setNext(to)
+            } else {
+              resolve()
+            }
+          }
+        }
+      }))
+    } catch (e) {
+      if (type(e) === 'Object') {
+        return runGuard(e)
+      }
+
+      throw e
+    }
+
+    return {
+      pageMethod: jumpMethodName,
+      pageDelta: delta,
+      realPage: to.name,
+      pageData: to.query,
+      pageMeta: to.meta,
+      pageEncode: encode,
+      pages: to.pages
+    }
+
+    function getTo({ name, query, delta, jumpMethodName, encode }) {
+      if (jumpMethodName === 'navigateBack') {
+        return {
+          ...routeManager.routes[routeManager.routes.length - 1 - delta],
+          jumpMethodName,
+          delta,
+          pages: [routeManager.routes[routeManager.routes.length - 1 - delta].name]
+        }
+      }
+
+      const { pageData = {}, pageMeta, pages } = getRealPageInfo({ name, query })
+
+      return {
+        name: pages[pages.length - 1], query: pageData, meta: pageMeta, jumpMethodName, encode, pages
+      }
+    }
+
+    function getGuardQueue(name, pages) {
+      if (name === routeManager.route.name) {
+        const beforeGuards = [...guard.componentGuardMap[name].beforeRouteUpdateGuards]
+
+        return [
+          ...beforeGuards.map(beforeGuard => beforeGuard.bind(routeManager.currentVm))
+        ]
+      }
+
+      const beforeGuards = [
+        ...guard.componentGuardMap[routeManager.route.name].beforeRouteLeaveGuards,
+        ...guard.globalGuard.beforeEachGuards,
+        ...getBeforeEnterGuards(pages)
+      ]
+
+      return [
+        ...beforeGuards.map(beforeGuard => beforeGuard.bind(routeManager.currentVm)),
+        ...getBeforeRouteEnterGuards(name),
+        ...guard.globalGuard.beforeResolveGuards
+      ]
+
+      function getBeforeRouteEnterGuards(name) {
+        if (name in guard.componentGuardMap) {
+          return guard.componentGuardMap[name].beforeRouteEnterGuards
+        }
+
+        return []
+      }
+
+      function getBeforeEnterGuards(pages) {
+        const result = []
+
+        pages.forEach(name => Array.prototype.push.apply(result, guard.routerGuardMap[name].beforeEnterGuards))
+
+        return result
+      }
+    }
+  }
+
+  function getRoute({ pageMethod, pageDelta, realPage, pageData, pageMeta, pages }) {
+    return pageMethod === 'navigateBack'
+      ? Object.assign({}, routeManager.routes[routeManager.routes.length - 1 - pageDelta])
+      : routeManager.createRoute({
+        name: realPage,
+        query: pageData,
+        meta: pageMeta,
+        fullPath: encodeUrl({ name: realPage, query: pageData }),
+        redirectedFrom: pages[pages.length - 2] || null
+      })
+  }
+
+  function handleNavigator(method, params, { success, fail, complete }) {
+    return new Promise(((resolve, reject) => {
+      setTimeout(() => wx[method]({
+        ...params,
+        ...otherParams,
+        success: (...res) => {
+          resolve(...res)
+          success(...res)
+        },
+        fail: (...res) => {
+          reject(...res)
+          fail(...res)
+        },
+        complete
+      }), 1)
+    }))
+  }
+
+  function getRealMethod({ pageMethod, realPage }) {
+    // 确定跳转页面的跳转方式
+    if ((config.tabPages.indexOf(realPage) !== -1) && (pageMethod === 'navigateTo' || pageMethod === 'redirectTo')) {
+      return 'switchTab'
+    }
+
+    return pageMethod
+  }
+
+  function getNavigatorParams({ pageMethod, pageDelta, realPage, pageData, pageEncode }) {
+    return pageMethod === 'navigateBack'
+      ? { delta: pageDelta }
+      : { url: encodeUrl({ name: realPage, query: pageData }, { encode: pageEncode, isAbsolutePath: true }) }
+  }
+}
+
+const routerApi = {}
+wxApiList.forEach(key => (routerApi[key] = promiseRouteApi(key)))
+
+routerApi['onError'] = handler => errorHandlers.push(handler)
+routerApi['backHome'] = () => routerApi.switchTab({ name: config.homePage })
+
+export default routerApi
+
+function type(val) {
+  const type = val === undefined ? 'Undefined' : Object.prototype.toString.call(val).slice(8, -1)
+
+  return val === null ? 'Null' : type
+}
diff --git a/packages/router/core/utils/getRealPageInfo.js b/packages/router/core/utils/getRealPageInfo.js
new file mode 100644
index 000000000..c87bf8cb5
--- /dev/null
+++ b/packages/router/core/utils/getRealPageInfo.js
@@ -0,0 +1,48 @@
+/**
+ * @desc
+ * @author wudi@supermonkey.com.cn
+ * @createDate 2019/11/15
+ */
+import config from '../config'
+
+function getRealPageInfo({ name, query, meta }, pages = []) {
+  if (!(name in config.routeMap)) {
+    throw new Error(`routeMap 中未找到 ${name} 页面`)
+  }
+
+  pages.push(name)
+  const result = config.routeMap[name].handler({ query })
+
+  if ('path' in result) {
+    return {
+      pagePath: result.path,
+      pageData: mergeRight(result.query, query),
+      pageMeta: mergeRight(result.meta, meta),
+      pages
+    }
+  }
+
+  return getRealPageInfo(
+    { name: result.name, query: mergeRight(result.query, query), meta: mergeRight(result.meta, meta) },
+    pages
+  )
+}
+
+export default getRealPageInfo
+
+function mergeRight(dataA, dataB) {
+  if (typeof dataA === 'undefined') {
+    return dataB
+  }
+
+  if (typeof dataB === 'undefined') {
+    return dataA
+  }
+
+  if (Object.prototype.toString.call(dataA) === '[object Object]'
+    && Object.prototype.toString.call(dataA) === '[object Object]') {
+    return Object.assign({}, dataA, dataB)
+  }
+
+  return dataB
+}
diff --git a/packages/router/core/utils/queue.js b/packages/router/core/utils/queue.js
new file mode 100644
index 000000000..ff8b1de37
--- /dev/null
+++ b/packages/router/core/utils/queue.js
@@ -0,0 +1,11 @@
+/**
+ * @desc
+ * @author wudi@supermonkey.com.cn
+ * @createDate 2019/11/14
+ */
+
+export default async function runQueue(queue, wrapperFn) {
+  for (const item of queue) {
+    item && await wrapperFn(item)
+  }
+}
diff --git a/packages/router/core/utils/urlParse.js b/packages/router/core/utils/urlParse.js
new file mode 100644
index 000000000..65c4a56f0
--- /dev/null
+++ b/packages/router/core/utils/urlParse.js
@@ -0,0 +1,87 @@
+/**
+ * @desc
+ * @author wudi@supermonkey.com.cn
+ * @createDate 2019/11/15
+ */
+import getRealPageInfo from './getRealPageInfo'
+
+/**
+ * 编码url参数，如：{a: 123, b: 345} => a=123&b=456
+ * @param obj
+ * @param encode = false
+ * return String
+ */
+function encodeParams(obj, encode = false) {
+  const results = []
+
+  for (const key in obj) {
+    if (['string', 'number'].indexOf(typeof obj[key]) !== -1) {
+      results.push(`${key}=${encode ? encodeURIComponent(obj[key]) : obj[key]}`)
+    }
+  }
+
+  return results.join('&')
+}
+
+/**
+ * 编码url参数，如：{ name: 'xxxxPage', query: {a: 123, b: 345} } => /pages/xxxxPage?a=123&b=456
+ * @param obj
+ * @param encode = false
+ * @param isAbsolutePath = false 是否得到真实的页面（物理页面）
+ * return String
+ */
+function encodeUrl({ name, query = {} }, { encode = false, isAbsolutePath = true } = {}) {
+  const { pagePath, pageData } = isAbsolutePath ? getRealPageInfo({ name, query }) : { pagePath: name, pageData: query }
+  const paramsStr = encodeParams(pageData, encode)
+
+  return paramsStr ? `${pagePath}?${paramsStr}` : pagePath
+}
+
+/**
+ * 解码 fullPath 或 params ，如：a=123&b=456 => { a: 123, b: 345 }
+ * @param fullPath
+ * @param decode = true
+ * @returns {*}
+ */
+function decodeParams(fullPath, decode = true) {
+  const splitArr = fullPath.split('?')
+  const result = {}
+
+  void (splitArr.length > 1 ? splitArr[1] : splitArr[0])
+    .split('&')
+    .map(str => str.split('='))
+    .forEach(([key, value]) => (result[key] = decode ? decodeURIComponent(value) : value))
+
+  return result
+}
+
+/**
+ * 解析 /pages/xxxxPage?a=123&b=456 => xxxxPage
+ * @param fullPath
+ */
+function decodePage(fullPath) {
+  const result = fullPath.split('?')[0].split('/')
+
+  return result[result.length - 1]
+}
+
+/**
+ * 解析 fullPath 页面和参数。如: /pages/xxxxPage?a=123&b=456 => { name: xxxxPage, query: { a: 123, b: 345 } }
+ * @param fullPath
+ * @param decode = true
+ * @return {{ query: *, name }}
+ */
+function decodeUrl(fullPath, decode = true) {
+  return {
+    name: decodePage(fullPath),
+    query: decodeParams(fullPath, decode)
+  }
+}
+
+export {
+  encodeParams,
+  encodeUrl,
+  decodeParams,
+  decodePage,
+  decodeUrl
+}
diff --git a/packages/router/doc/config.md b/packages/router/doc/config.md
new file mode 100644
index 000000000..4987a1e91
--- /dev/null
+++ b/packages/router/doc/config.md
@@ -0,0 +1,61 @@
+## 路由配置
+
+routeMap 是一个对象（key / value），所有页面的路由都在此配置。其中 key 为页面名（name），value 为路由配置信息（config），例如：
+
+> `页面名必须在页面里定义：wepy.page({ name: '页面名' })`
+
+```js
+homePage = 'SplashScreen'
+tabPages = ['CourseList']
+routeMap = {
+  SplashScreen: '/pages/SplashScreen',
+  CourseList: '/pages/tabBar/courseList/CourseList',
+  ClassList: { 
+    name: 'CourseList', query: { courseType: 'class' } 
+  },
+  BookList: { 
+    path: '/pages/BookList', query: { info: { name: 'roma' } }, meta: 2
+  },
+  CityList: {
+    handler: ({ query }) => ({ path: '/pages/CityList', query }) 
+  },
+  Courses: 'CourseList'
+}
+```
+
+config 支持三种数据类型来配置一个路由：Object、function、string
+
+### config（Object）
+
+两种结构：
+
+#### 第一种
+
+| 字段名      | 类型     | 必填 | 说明                                                         |
+| :---------- | -------- | ---- | ------------------------------------------------------------ |
+| path        | string   | 否   | 页面绝对路径 |
+| name        | string   | 否   | 页面名                                                       |
+| query        | Object   | 否   | 路由传参参数                                                 |
+| meta        | any      | 否   | 不属于 data 的额外信息                                       |
+| beforeEnter | function | 否   | 查看导航守卫章节                                             |
+
+> 注：`path、page 二选一，page 应该与页面文件名一致`
+
+#### 第二种
+
+| 字段名      | 类型     | 必填 | 说明                                                       |
+| :---------- | -------- | ---- | ---------------------------------------------------------- |
+| handler     | function | 是.  | ({ query }) => { path, name, query, meta }，具体含义参考上面 |
+| beforeEnter | function | 否   | 查看导航守卫章节                                           |
+
+### config（function）
+
+```
+({ query }) => ({ path | name, query(可选), meta(可选) } | string)
+```
+
+### config（string）
+
+```
+path 或者 name，有 / 的被认为是 path
+```
diff --git a/packages/router/doc/guard.md b/packages/router/doc/guard.md
new file mode 100644
index 000000000..0eb6a18e6
--- /dev/null
+++ b/packages/router/doc/guard.md
@@ -0,0 +1,391 @@
+## 导航守卫
+
+导航守卫参考 vue-router 的导航守卫，基本保持接口对齐。但有以下区别：
+
+- 支持 promise，可让函数返回一个 promise 代替 next。
+- to、from 的具体内容不同
+- 解析流程有部分区别
+
+### beforeRouteLeave
+
+- 组件守卫，离开页面时触发
+
+- **形式**：beforeRouteLeave(to, from, next)
+
+- **参数**：
+
+  - `{Object} to` 目标路由
+    - name 页面名
+    - query 跳转页面携带数据
+    - meta 携带额外信息
+    - jumpMethodName 跳转方式: 'navigateBack', 'navigateTo', 'redirectTo', 'reLaunch', 'switchTab'
+    - encode: 是否编码
+  - `{Object} from` 原路由
+    - name 页面名
+    - query 跳转页面携带数据
+    - meta 携带额外信息
+  - `{function} next`
+    - **`next()`**: 进入下一个守卫
+    - **`next(false)`**: 中断当前的导航
+    - **`next({ name, query, meta, jumpMethodName, encode })`**: 跳转到一个不同的页面。当前导航被中断
+    - **`next(error)`**: 如果传入 `next` 的参数是一个 `Error` 实例，则导航会被终止且该错误会被传递给 `router.onError()` 注册过的回调
+
+- **this**：指向离开页面的实例
+
+- **返回值**：promise，无论 rejected 还是 fulfilled ，其值的处理逻辑相同
+
+  - **`true`**: 进入下一个守卫
+  - **`false`**: 中断当前的导航
+  - **`{ name, query, meta, jumpMethodName, encode }`**: 跳转到一个不同的页面。当前导航被中断
+  - **`error`**: 返回一个 `Error` 实例，则导航会被终止且该错误会被传递给 `router.onError()` 注册过的回调
+
+  > `注意`：next 和 返回值 二选一，不然跳转会卡主
+
+- **用法**
+
+  在页面里定义
+
+- **示例**
+
+  ```js
+  <script>
+    wepy.page({
+      beforeRouteLeave(to, from, next) {
+        next()
+      }
+      // 或者
+      async beforeRouteLeave(to, from) {
+        return true
+      }
+    })
+  </script>
+  ```
+
+### beforeEach
+
+- 全局守卫，离开页面时触发
+
+- **形式**：beforeEach(to, from, next)
+
+- **参数**：
+
+  - `{Object} to` 目标路由
+    - name 页面名
+    - query 跳转页面携带数据
+    - meta 携带额外信息
+    - jumpMethodName 跳转方式: 'navigateBack', 'navigateTo', 'redirectTo', 'reLaunch', 'switchTab'
+    - encode: 是否编码
+  - `{Object} from` 原路由
+    - name 页面名
+    - query 跳转页面携带数据
+    - meta 携带额外信息
+  - `{function} next`
+    - **`next()`**: 进入下一个守卫
+    - **`next(false)`**: 中断当前的导航
+    - **`next({ name, query, meta, jumpMethodName, encode })`**: 跳转到一个不同的页面。当前导航被中断
+    - **`next(error)`**: 如果传入 `next` 的参数是一个 `Error` 实例，则导航会被终止且该错误会被传递给 `router.onError()` 注册过的回调
+
+- **this**：指向离开页面的实例
+
+- **返回值**：
+
+  - promise，无论 rejected 还是 fulfilled ，其值的处理逻辑相同
+
+    - **`true`**: 进入下一个守卫
+    - **`false`**: 中断当前的导航
+    - **`{ name, query, meta, jumpMethodName, encode }`**: 跳转到一个不同的页面。当前导航被中断
+    - **`error`**: 返回一个 `Error` 实例，则导航会被终止且该错误会被传递给 `router.onError()` 注册过的回调
+
+    > `注意`：next 和 返回值 二选一，不然跳转会卡主
+
+- **用法**
+
+  全局定义
+
+- **示例**
+
+  ```js
+  <script>
+  import router from 'router'
+  router.beforeEach(function beforeEach(to, from, next) {
+    next()
+  })
+  // 或者
+  router.beforeEach(function beforeEach(to, from) {
+    return true
+  })
+  </script>
+  ```
+
+### beforeEnter
+
+- 路由守卫
+
+- **形式**：beforeEnter(to, from, next)
+
+- **参数**：
+
+  - `{Object} to` 目标路由
+    - name 页面名
+    - query 跳转页面携带数据
+    - meta 携带额外信息
+    - jumpMethodName 跳转方式: 'navigateBack', 'navigateTo', 'redirectTo', 'reLaunch', 'switchTab'
+    - encode: 是否编码
+  - `{Object} from` 原路由
+    - name 页面名
+    - query 跳转页面携带数据
+    - meta 携带额外信息
+  - `{function} next`
+    - **`next()`**: 进入下一个守卫
+    - **`next(false)`**: 中断当前的导航
+    - **`next({ name, query, meta, jumpMethodName, encode })`**: 跳转到一个不同的页面。当前导航被中断
+    - **`next(error)`**: 如果传入 `next` 的参数是一个 `Error` 实例，则导航会被终止且该错误会被传递给 `router.onError()` 注册过的回调
+
+- **this**：指向离开页面的实例
+
+- **返回值**：
+
+  - promise，无论 rejected 还是 fulfilled ，其值的处理逻辑相同
+
+    - **`true`**: 进入下一个守卫
+    - **`false`**: 中断当前的导航
+    - **`{ name, query, meta, jumpMethodName, encode }`**: 跳转到一个不同的页面。当前导航被中断
+    - **`error`**: 返回一个 `Error` 实例，则导航会被终止且该错误会被传递给 `router.onError()` 注册过的回调
+
+    > `注意`：next 和 返回值 二选一，不然跳转会卡主
+
+- **用法**
+
+  routerConfig 里配置
+
+- **示例**
+
+  ```js
+  routerConfig = {
+    PersonalDetail: {
+      path: '/pagesSubPackage/personal/pages/PersonalDetail',
+      beforeEnter: (to, from, next) => next()
+    }
+  }
+  ```
+
+### beforeRouteEnter
+
+- 组件守卫，进入页面时触发
+
+- **形式**：beforeRouteEnter(to, from, next)
+
+- **参数**：
+
+  - `{Object} to` 目标路由
+    - name 页面名
+    - query 跳转页面携带数据
+    - meta 携带额外信息
+    - jumpMethodName 跳转方式: 'navigateBack', 'navigateTo', 'redirectTo', 'reLaunch', 'switchTab'
+    - encode: 是否编码
+  - `{Object} from` 原路由
+    - name 页面名
+    - query 跳转页面携带数据
+    - meta 携带额外信息
+  - `{function} next`
+    - **`next()`**: 进入下一个守卫
+    - **`next(false)`**: 中断当前的导航
+    - **`next({ name, query, meta, jumpMethodName, encode })`**: 跳转到一个不同的页面。当前导航被中断
+    - **`next(error)`**: 如果传入 `next` 的参数是一个 `Error` 实例，则导航会被终止且该错误会被传递给 `router.onError()` 注册过的回调
+    - **`next(vm => {})`**：vm 为进入页面的实例
+
+- **this**：由于进入页面还未实例化，因此不能使用，由 vm 代替
+
+- **返回值**：
+
+  - promise，无论 rejected 还是 fulfilled ，其值的处理逻辑相同
+
+    - **`true`**: 进入下一个守卫
+    - **`false`**: 中断当前的导航
+    - **`{ name, query, meta, jumpMethodName, encode }`**: 跳转到一个不同的页面。当前导航被中断
+    - **`error`**: 返回一个 `Error` 实例，则导航会被终止且该错误会被传递给 `router.onError()` 注册过的回调
+    - **`vm => {}`**： vm 为进入页面的实例
+
+    > `注意`：next 和 返回值 二选一，不然跳转会卡主
+
+- **用法**
+
+  页面里定义
+
+- **示例**
+
+  ```js
+  <script>
+    wepy.page({
+      beforeRouteEnter(to, from, next) {
+        next(false)
+      }
+      // 或者
+      async beforeRouteEnter(to, from) {
+        return vm => {}
+      }
+    })
+  </script>
+  ```
+
+### beforeResolve
+
+- 全局守卫，以上守卫执行后执行，但在页面跳转前
+
+- **形式**：beforeResolve(to, from, next)
+
+- **参数**：
+
+  - `{Object} to` 目标路由
+    - name 页面名
+    - query 跳转页面携带数据
+    - meta 携带额外信息
+    - jumpMethodName 跳转方式: 'navigateBack', 'navigateTo', 'redirectTo', 'reLaunch', 'switchTab'
+    - encode: 是否编码
+  - `{Object} from` 原路由
+    - name 页面名
+    - query 跳转页面携带数据
+    - meta 携带额外信息
+  - `{function} next`
+    - **`next()`**: 进入下一个守卫
+    - **`next(false)`**: 中断当前的导航
+    - **`next({ name, query, meta, jumpMethodName, encode })`**: 跳转到一个不同的页面。当前导航被中断
+    - **`next(error)`**: 如果传入 `next` 的参数是一个 `Error` 实例，则导航会被终止且该错误会被传递给 `router.onError()` 注册过的回调
+
+- **this**：无 this
+
+- **返回值**：
+
+  - promise，无论 rejected 还是 fulfilled ，其值的处理逻辑相同
+
+    - **`true`**: 进入下一个守卫
+    - **`false`**: 中断当前的导航
+    - **`{ name, query, meta, jumpMethodName, encode }`**: 跳转到一个不同的页面。当前导航被中断
+    - **`error`**: 返回一个 `Error` 实例，则导航会被终止且该错误会被传递给 `router.onError()` 注册过的回调
+
+    > `注意`：next 和 返回值 二选一，不然跳转会卡主
+
+- **用法**
+
+  全局定义
+
+- **示例**
+
+  ```js
+  <script>
+  import router from 'router'
+  router.beforeResolve((to, from, next) => next())
+  // 或者
+  router.beforeResolve((to, from) => true)
+  </script>
+  ```
+
+### afterEach
+
+- 全局守卫，进入页面后触发
+
+- **形式**：afterEach(to, from)
+
+- **参数**：
+
+  - `{Object} to` 目标路由
+    - name 页面名
+    - query 跳转页面携带数据
+    - meta 携带额外信息
+  - `{Object} from` 原路由
+    - name 页面名
+    - query 跳转页面携带数据
+    - meta 携带额外信息
+
+- **this**：指向进入页面的实例
+
+- **返回值**：
+
+  - 无
+
+- **用法**
+
+  全局定义
+
+- **示例**
+
+  ```js
+  <script>
+  import router from 'router'
+  router.afterEach((to, from) => {})
+  </script>
+  ```
+
+### beforeRouteUpdate
+
+- 组件守卫，页面内跳转
+
+- **形式**：beforeRouteUpdate(to, from, next)
+
+- **参数**：
+
+  - `{Object} to` 目标路由
+    - query 跳转页面携带数据
+    - meta 携带额外信息
+  - `{Object} from` 原路由
+    - query 跳转页面携带数据
+    - meta 携带额外信息
+  - `{function} next`
+    - **`next()`**: 进入下一个守卫
+    - **`next(false)`**: 中断当前的导航
+    - **`next({ name, query, meta, jumpMethodName, encode })`**: 跳转到一个不同的页面。当前导航被中断
+    - **`next(error)`**: 如果传入 `next` 的参数是一个 `Error` 实例，则导航会被终止且该错误会被传递给 `router.onError()` 注册过的回调
+
+- **this**：当前页面的实例
+
+- **返回值**：promise，无论 rejected 还是 fulfilled ，其值的处理逻辑相同
+
+  - **`true`**: 进入下一个守卫
+  - **`false`**: 中断当前的导航
+  - **`{ name, query, meta, jumpMethodName, encode }`**: 跳转到一个不同的页面。当前导航被中断
+  - **`error`**: 返回一个 `Error` 实例，则导航会被终止且该错误会被传递给 `router.onError()` 注册过的回调
+
+  > `注意`：next 和 返回值 二选一，不然跳转会卡主
+  >
+  > **跳转成功以后，route 对象会更新**
+
+- **用法**
+
+  在页面里定义（当跳转页面为当前页面时，触发此导航）
+
+- **示例**
+
+  ```js
+  <script>
+    wepy.page({
+      beforeRouteUpdate(to, from, next) {
+        next()
+      }
+      // 或者
+      async beforeRouteLeave(to, from) {
+        return true
+      }
+    })
+  </script>
+  ```
+
+### 完整页面导航解析流程
+
+#### 不同页面
+
+1. 从一个页面跳转到另一页面
+2. 在离开页面里调用 `beforeRouteLeave`
+3. 调用全局的 `beforeEach` 
+4. 调用路由配置里的 `beforeEnter`
+5. 调用即将进入页面的 `beforeRouteEnter`
+6. 调用全局的 `beforeResolve` 
+7. 页面进入后
+8. 调用全局的 `afterEach` 
+9. 调用 `beforeRouteEnter` 中传给 `next` 的回调函数（如果定义了）
+10. 如果某个守卫改变了页面跳转，则中断以上流程并且重新开始导航解析
+
+#### 同一个页面
+
+1. 从一个页面跳转到另一页面
+2. 离开页和进入页为同一个页面
+3. 调用当前页的`beforeRouteUpdate`
diff --git a/packages/router/doc/instance.md b/packages/router/doc/instance.md
new file mode 100644
index 000000000..8c146d62d
--- /dev/null
+++ b/packages/router/doc/instance.md
@@ -0,0 +1,17 @@
+## 实例属性
+
+### this.$router
+
+- **类型**：Object
+
+  router 对象实例
+
+- **参考**：跟全局 router 对象一致，[参考](router.md)
+
+### this.$route
+
+- **类型**：Object
+
+  route 对象实例
+
+- **参考**：跟全局 router.route 对象一致，[参考](router.md#route)
diff --git a/packages/router/doc/router.md b/packages/router/doc/router.md
new file mode 100644
index 000000000..67a35dfe6
--- /dev/null
+++ b/packages/router/doc/router.md
@@ -0,0 +1,242 @@
+# router
+
+## 导入方式
+
+`import router from 'router'`
+
+## 属性
+
+### route
+
+- 类型: Route
+
+  当前页面对应的路由对象
+
+- route.id
+
+  - 类型: string
+
+    当前页面的 id（唯一）
+
+- route.fullPath
+
+  - 类型: string
+
+    当前页面 url，带查询参数（只带数字类型和字符串类型的参数数据）
+
+- route.path
+
+  - 类型: string
+
+    当前页面 url，不带查询参数
+
+- route.name
+
+  - 类型: string
+
+    当前页面名
+
+- route.query
+
+  - 类型: Object
+
+    当前页面的完整查询参数数据
+
+- route.meta
+
+  - 类型: string
+
+    当前页面的非查询参数的其它数据
+
+- route.routes
+
+  - 类型: [Route, Route, ..., Route(当前路由)]
+
+    当前页面的路由栈
+
+- route.referrerRoute
+
+  - 类型: Route
+
+    前向路由，访问轨迹的当前页面的上一个页面的路由，没有则为 null
+
+    例如：A -> B -> C，再返回到 B，当前路由为 B，lastRoute 为 A，而 referrerRoute 为 C
+
+- redirectedFrom
+
+  - 类型: String
+
+    重定向页面名
+
+### homePage
+
+- **类型**: string
+
+  首页的页面名
+
+### tabPages
+
+- **类型**: List<String>
+
+  tab 页配置表，因为 tab 页跳转的 api 不一样
+
+  ```js
+  const tabPages = [
+    'BoxList',
+    'CourseList',
+    'MyBooking',
+    'My'
+  ]
+  
+  ```
+
+### routeMap
+
+- **类型**: Object
+
+  [页面路由配置表](config.md)
+
+## 方法/导航
+
+页面导航在 wx api 的基础上封装
+
+### navigateTo
+
+保留当前页面，跳转到应用内的某个页面
+
+- **形式**：navigateTo(object, encode)
+
+- **参数**：
+
+  - `{Object} object`
+    - `{string} name`页面名
+    - `{Object} query`页面参数
+    - `{function} success`接口调用成功的回调函数
+    - `{function} fail`接口调用失败的回调函数
+    - `{function} complete`接口调用结束的回调函数（调用成功、失败都会执行）
+  - `{bool} encode`是否对参数进行编码
+
+- **返回值** promise，根据调用成功/失败设置状态
+
+- **示例**
+
+  ```js
+  import router from 'router'
+  router.navigateTo({ name: 'BadgeDetail', query: { badgeId, sk } })
+  ```
+
+### redirectTo
+
+关闭当前页面，跳转到应用内的某个页面
+
+- **形式**：redirectTo(object, encode)
+
+- **参数**：
+
+  - `{Object} object`
+    - `{string} name`页面名
+    - `{Object} query`页面参数
+    - `{function} success`接口调用成功的回调函数
+    - `{function} fail`接口调用失败的回调函数
+    - `{function} complete`接口调用结束的回调函数（调用成功、失败都会执行）
+  - `{bool} encode`是否对参数进行编码
+
+- **返回值** promise，根据调用成功/失败设置状态
+
+- **示例**
+
+  ```js
+  import router from 'router'
+  router.redirectTo({ name: 'BadgeDetail', query: { badgeId, sk } })
+  ```
+
+### switchTab
+
+跳转到 tabBar 页面
+
+- **形式**：switchTab(object, encode)
+
+- **参数**：
+
+  - `{Object} object`
+    - `{string} name`页面名
+    - `{Object} query`页面参数
+    - `{function} success`接口调用成功的回调函数
+    - `{function} fail`接口调用失败的回调函数
+    - `{function} complete`接口调用结束的回调函数（调用成功、失败都会执行）
+  - `{bool} encode`是否对参数进行编码
+
+- **返回值** promise，根据调用成功/失败设置状态
+
+- **示例**
+
+  ```js
+  import router from 'router'
+  router.switchTab({ name: 'ClassList', query: { scheduleId, sk } })
+  ```
+
+### navigateBack
+
+关闭当前页面，返回上一页面或多级页面
+
+- **形式**：navigateBack(object, encode)
+
+- **参数**：
+
+  - `{Object} object`
+    - `{number} delta`返回的页面数，如果 delta 大于现有页面数，则返回到首页。默认：1
+    - `{function} success`接口调用成功的回调函数
+    - `{function} fail`接口调用失败的回调函数
+    - `{function} complete`接口调用结束的回调函数（调用成功、失败都会执行）
+
+- **返回值** promise，根据调用成功/失败设置状态
+
+- **示例**
+
+  ```js
+  import router from 'router'
+  router.navigateBack({ delta: 1 })
+  ```
+
+### reLaunch
+
+关闭所有页面，打开到应用内的某个页面
+
+- **形式**：reLaunch(object, encode)
+
+- **参数**：
+
+  - `{Object} object`
+    - `{string} name`页面名
+    - `{Object} query`页面参数
+    - `{function} success`接口调用成功的回调函数
+    - `{function} fail`接口调用失败的回调函数
+    - `{function} complete`接口调用结束的回调函数（调用成功、失败都会执行）
+  - `{bool} encode`是否对参数进行编码
+
+- **返回值** promise，根据调用成功/失败设置状态
+
+- **示例**
+
+  ```js
+  import router from 'router'
+  router.reLaunch({ name: 'ClassList', query: { scheduleId, sk } })
+  ```
+
+>  page 会根据 routeMap 找到真实页面路径（path）
+>
+> data 会转换成查询参数（'key=value&key2=value2'），如果 encode 为 true，则会使用 encodeURIComponent 进行编码，由于转换后是字符串，因此 query 里如果有非 string 和 number 将会被过滤掉，可以从 route.query 里拿到完整的 query
+
+## 方法/全局守卫
+
+### beforeEach
+
+[参考](guard.md#beforeEach)
+
+### beforeResolve
+
+[参考](guard.md#beforeResolve)
+
+### afterEach
+
+[参考](guard.md#afterEach)
diff --git a/packages/router/doc/usage.md b/packages/router/doc/usage.md
new file mode 100644
index 000000000..b349e4dff
--- /dev/null
+++ b/packages/router/doc/usage.md
@@ -0,0 +1,234 @@
+## Features
+
+对微信路由进行了封装和扩展（设计思路主要参考 vue router）
+
+- 结构化路由配置
+- api 支持 promise
+- 任意类型的路由传参
+- 导航守卫
+
+## Usage
+
+### 创建一个路由管理器
+
+```js
+const homePage = 'SplashScreen'
+const tabPages = ['CourseList']
+const routeMap = {
+  SplashScreen: '/pages/SplashScreen',
+  CourseList: '/pages/tabBar/courseList/CourseList',
+  CourseDetail: '/pages/CourseDetail','
+  CourseOnlineDetail: {
+    name: 'CourseDetail', 
+    query: { courseType: 'online' }
+  },
+}
+const config = { homePage, tabPages, routeMap }
+
+const router = createSmRouter(config)
+wepy.use(routerPlugin, router);
+
+export { router }
+```
+
+### 使用场景
+
+具体使用场景可以根据业务自行处理，下面给出几个典型场景供开发者参考
+
+#### 页面跳转
+
+```js
+// 其它页
+const course = { id: '123', text: '课程' };
+router.navigateTo({ name: 'CourseDetail', query: { course } })
+
+
+// CourseDetail 页
+wepy.page({
+  name: 'CourseDetail',
+  onLoad() {
+    // params = { course: { id: '123', text: '课程' } }
+    const params = this.$route.query;
+  }
+})
+```
+
+#### 别名跳转
+
+```js
+// 其它页
+const course = { id: '233', text: '线上课程' };
+router.navigateTo({ name: 'CourseOnlineDetail', query: { course } })
+
+// CourseDetail 页
+wepy.page({
+  name: 'CourseDetail',
+  onLoad() {
+    // params = { course: { id: '233', text: '线上课程' }, courseType: 'online' }
+    const params = this.$route.query;
+  }
+})
+```
+
+#### 预加载数据
+
+- 提升页面加载速度，减少用户等待时间，这时可以使用守卫 `beforeRouteEnter`处理
+
+  ```js
+  <script>
+    wepy.page({
+      name: 'xxx',
+      _pData: null,
+      beforeRouteEnter(to, from, next) {
+        const pData = api.getXXX()
+        next(vm => {
+          vm.$options._pData = pData
+        })
+      },
+      onLoad() {
+        this._fetchData()
+      },
+      methods: { 
+        async _fetchData() {
+          try {
+            if (this.$options._pData) {
+              this._renderingData = await this.$options._pData
+            } else {
+              this._renderingData = await api.getXXX()
+            }
+          } catch(e) {
+            // 错误处理
+          } finally {
+            this.$options._pData = null
+          }
+        }
+       }
+    })
+  </script>
+  ```
+
+#### 复杂情况下的页面数据交互
+
+- 将获取数据抽象成一个服务
+
+  ```js
+  // 代金券选择组件
+  wepy.component({
+    /** 页面/组件名 */
+    name: 'BookingConfirmRowSelectTicket',
+    methods: {
+      async goSelectTicket() {
+        this.ticketId = await this._getTicketId() || ''
+      },
+  
+      _getTicketId() {
+        return new Promise((resolve, reject) => {
+          this.$router.navigateTo({
+            name: 'UseTicket',
+            query: {
+              ...params,
+              resolve,
+              reject
+            }
+          })
+        })
+      }
+    },
+  })
+  
+  // 选择代金券页面
+  wepy.page({
+    /** 页面/组件名 */
+    name: 'UseTicket',
+    methods: {
+      onSelectTicket({ ticketId }) {
+        this.ticketId = ticketId
+        this.$router.navigateBack({ delta: 1 })
+      }
+    },
+    onUnload() {
+      this.$route.query.resolve(this.ticketId)
+    }
+  })
+  ```
+
+#### 非正常流程页面跳转
+
+- 要求符合条件 A 的用户无论点击哪个按钮都要跳到某个指定页面，这时可以使用守卫 `beforeRouteLeave`处理
+
+  ```js
+  <script>
+    wepy.page({
+      name: 'xxx',
+      beforeRouteLeave(to, from, next) {
+        // 如果不加 to.name !== 'xxxPage'，会进入死循环
+      	if (this.condition && to.name !== 'xxxPage') {
+      	  next({ name: 'xxxPage', jumpMethodName: 'navigateTo' })
+      	} else {
+      	  next()
+      	}
+      }
+    })
+  </script>
+  ```
+
+#### 限制进入某个页面
+
+- 进入某个页面需要符合某个条件，这时可以使用守卫 `beforeEnter`处理
+
+  ```js
+  routerConfig = {
+    xxxPage: {
+      path: '/xxxPath',
+      beforeEnter: (to, from, next) => {
+        if (condition) {
+          next()
+        } else {
+          this.$showToast('需要 xxx 条件方可进入哦')
+          next(false)
+        }
+      }
+    }
+  }
+  ```
+
+#### 页面内不同标签页之间跳转
+
+- 某个页面由不同业务组成，分成不同标签页，在定义路由时可根据标签页定义不同的逻辑页面（映射到同一个物理页面），页面内跳转时，可以使用`beforeRouteUpdate`守卫处理。（可以参考启动页、课表页）
+
+  ```js
+  routeMap = {
+    xxxPage: '/xxxPath',
+    APage: { name: 'xxxPage', query: { type: 'A' } },
+    BPage: { name: 'xxxPage', query: { type: 'B' } }
+  }
+  
+  <script>
+    wepy.page({
+      name: 'xxxPage',
+      data: {
+        type: 'A'
+      },
+      beforeRouteUpdate(to, from, next) {
+        if (to.query.type === 'B') {
+          // 处理 B 业务
+        }
+  
+        next()
+      }
+    })
+  </script>
+  ```
+
+## 注意事项
+
+- 路由管理器基于微信提供的 api，但如果用户某个路由跳转行为不是基于 api，那么守卫将无法处理，开发时需要注意。例如：手势滑动返回 或者 点击 tab 或者从外部跳转进入小程序
+- 对于首次分包加载， `beforeRouteEnter`守卫无法终止路由跳转，因为导航守卫是在运行时处理的，首次分包加载前无跳转页面代码，因此拿不到此守卫
+
+## 文档
+
+* [配置](config.md)
+* [导航守卫](guard.md)
+* API
+    * [router](router.md)
+    * [实例](instance.md)
diff --git a/packages/router/index.js b/packages/router/index.js
new file mode 100644
index 000000000..01a4ad665
--- /dev/null
+++ b/packages/router/index.js
@@ -0,0 +1,12 @@
+import routerPlugin from './install'
+import { encodeParams, encodeUrl, decodeParams, decodePage, decodeUrl, createRouter } from '../router/core'
+
+export {
+  encodeParams,
+  encodeUrl,
+  decodeParams,
+  decodePage,
+  decodeUrl,
+  createRouter,
+  routerPlugin
+}
diff --git a/packages/router/install.js b/packages/router/install.js
new file mode 100644
index 000000000..a33457756
--- /dev/null
+++ b/packages/router/install.js
@@ -0,0 +1,240 @@
+import {
+  encodeParams,
+  encodeUrl,
+  decodeParams,
+  decodePage,
+  decodeUrl,
+  guard,
+  createComponentGuard,
+  routeManager,
+  config
+} from './core'
+
+let _isExternalJump = false
+let _isCallAppShow = false
+let _externalQuery = {}
+
+export default {
+  install(wepy, router) {
+    wepy.config.optionMergeStrategies['__routerHandler'] = (_, option) => {
+      const { name, beforeRouteLeave, beforeRouteEnter, beforeRouteUpdate } = option
+
+      if (!(name in config.routeMap)) {
+        return
+      }
+
+      if (!guard.hasInComponentGuardMap(name)) {
+        guard.updateComponentGuardMap(createComponentGuard(name))
+      }
+
+      if (beforeRouteLeave) {
+        guard.componentGuardMap[name].beforeRouteLeave(beforeRouteLeave)
+      }
+
+      if (beforeRouteEnter) {
+        guard.componentGuardMap[name].beforeRouteEnter(beforeRouteEnter)
+        handleBeforeRouteLeave(name, beforeRouteEnter)
+      }
+
+      if (beforeRouteUpdate) {
+        guard.componentGuardMap[name].beforeRouteUpdate(beforeRouteUpdate)
+      }
+
+      async function handleBeforeRouteLeave(name, beforeRouteLeave) {
+        if (routeManager.__tempRoute && name === routeManager.__tempRoute.name) {
+          try {
+            const res = await beforeRouteLeave(routeManager.__tempRoute, routeManager.route, res => {
+              if (typeof res === 'function') {
+                routeManager.setNext(res)
+              }
+            })
+
+            if (typeof res === 'function') {
+              routeManager.setNext(res)
+            }
+          } catch (e) {
+            console.error('handleBeforeRouteLeave', e)
+          }
+        }
+      }
+    }
+
+    wepy.mixin({
+      __routerHandler: '',
+
+      beforeCreate() {
+        this['$name'] = this.$options.name
+        this['$encodeParams'] = encodeParams
+        this['$encodeUrl'] = encodeUrl
+        this['$decodeParams'] = decodeParams
+        this['$decodePage'] = decodePage
+        this['$decodeUrl'] = decodeUrl
+        this['$router'] = router
+
+        // 判断是否是组件 0 为页面，1 为组件
+        if (last(this.$id) === '1') {
+          Object.defineProperty(this, '$route', { get: () => this.$root.$route })
+        }
+      },
+
+      created() {
+        // 判断是否是组件 0 为页面，1 为组件
+        if (last(this.$id) === '1') {
+          return
+        }
+
+        resetPageRoute.call(this)
+
+        handleTmpRoute()
+
+        handleTapTab.call(this)
+
+        updateRouteManager.call(this)
+
+        setThisRoute.call(this)
+
+        handleGuards.call(this)
+
+        function resetPageRoute() {
+          // 保底处理，tab 页
+          if (config.tabPages.indexOf(this.$name) !== -1) {
+            routeManager.clearRoutes()
+          }
+
+          if (_isExternalJump) {
+            updateIsExternalJump(false)
+            updateIsCallAppShow(false)
+
+            routeManager.clearRoutes()
+            routeManager.clearShowRoutes()
+
+            setCurrentRoute(this.$name, _externalQuery)
+          }
+        }
+
+        function handleTapTab() {
+          // 点击 tab
+          if (routeManager.route.name !== this.$name) {
+            setCurrentRoute(this.$name, {})
+          }
+        }
+
+        function setCurrentRoute(name, query) {
+          const fullPath = encodeUrl({ name, query })
+          routeManager.setCurrentRoute(routeManager.createRoute({ name, query, fullPath }))
+        }
+
+        function updateRouteManager() {
+          routeManager.setCurrentVm(this)
+          routeManager.pushRoute(routeManager.route)
+          routeManager.pushShowRoute(routeManager.route)
+          routeManager.updateCurrentRoute({
+            id: this.$id,
+            routes: [...routeManager.routes],
+            referrerRoute: routeManager.referrerRoute
+          })
+        }
+
+        function setThisRoute() {
+          this['$_route'] = routeManager.route
+          Object.defineProperty(this, '$route', {
+            get: () => this.$_route
+          })
+        }
+      },
+
+      onLaunch(options) {
+        updateIsExternalJump(true)
+      },
+
+      onShow(options) {
+        // App onShow
+        if (!('$app' in this)) {
+          handleAppOnShow.call(this, options)
+          return
+        }
+
+        handleTmpRoute()
+
+        // 手势滑动返回 或者 点击 tab 或者 其它方式，进入已经存在的页面
+        if (routeManager.route !== this.$_route) {
+          // 其它方式跳转过来
+          if (routeManager.route.name === this.$name) {
+            this['$_route'] = routeManager.route
+          }
+
+          // tab 页
+          if (config.tabPages.indexOf(this.$name) !== -1) {
+            routeManager.clearRoutes()
+            routeManager.pushRoute(this.$_route)
+          }
+
+          updateRouteManager.call(this)
+          handleGuards.call(this)
+        }
+
+        function handleAppOnShow(options) {
+          updateIsCallAppShow(true)
+          updateExternalQuery(options.query)
+        }
+
+        function updateRouteManager() {
+          routeManager.setCurrentVm(this)
+          routeManager.setCurrentRoute(this.$_route)
+          routeManager.pushShowRoute(routeManager.route)
+          routeManager.updateCurrentRoute({ referrerRoute: routeManager.referrerRoute })
+        }
+      },
+
+      onUnload() {
+        if (_isCallAppShow) {
+          updateIsCallAppShow(false)
+          updateIsExternalJump(true)
+        }
+
+        routeManager.popRoute()
+      }
+    })
+  }
+}
+
+function handleGuards() {
+  try {
+    guard.globalGuard.afterEachGuards.forEach(guard => guard(routeManager.route, routeManager.lastRoute))
+  } catch (e) {
+    console.error('handleGuards afterEach', e)
+  }
+
+  if (routeManager.next) {
+    try {
+      routeManager.next(this)
+    } catch (e) {
+      console.error('routeManager.next', e)
+    }
+    routeManager.clearNext()
+  }
+}
+
+function last(list, index = 1) {
+  return list[list.length - index] || null
+}
+
+// hack 处理，因为 onHide 时拿到的 route 不对
+function handleTmpRoute() {
+  if (routeManager.__tempRoute) {
+    routeManager.setCurrentRoute(routeManager.__tempRoute)
+    delete routeManager.__tempRoute
+  }
+}
+
+function updateIsExternalJump(val) {
+  _isExternalJump = val
+}
+
+function updateIsCallAppShow(val) {
+  _isCallAppShow = val
+}
+
+function updateExternalQuery(query) {
+  _externalQuery = query
+}
diff --git a/packages/router/package.json b/packages/router/package.json
new file mode 100644
index 000000000..96c272e2e
--- /dev/null
+++ b/packages/router/package.json
@@ -0,0 +1,30 @@
+{
+  "name": "@wepy/router",
+  "version": "0.0.1",
+  "description": "router in WePY",
+  "main": "dist/index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/Tencent/wepy.git"
+  },
+  "keywords": [
+    "router",
+    "WePY"
+  ],
+  "author": {
+    "name": "nishino",
+    "email": "nishinotsukasavirgo@gmail.com"
+  },
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/Tencent/wepy/issues"
+  },
+  "homepage": "https://github.com/Tencent/wepy#readme",
+  "readme": "README.md",
+  "_id": "@wepy/router@0.0.1",
+  "_commitid": "a423f8d",
+  "gitHead": "5a25776457360bbbbc54a4d059f6bc7c032d5df3"
+}
diff --git a/packages/use-intercept/CHANGELOG.md b/packages/use-intercept/CHANGELOG.md
new file mode 100644
index 000000000..e1153e479
--- /dev/null
+++ b/packages/use-intercept/CHANGELOG.md
@@ -0,0 +1,64 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# 2.1.0 (2020-07-04)
+
+**Note:** Version bump only for package @wepy/use-intercept
+
+
+
+
+
+# 2.1.0-alpha.10 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/use-intercept
+
+
+
+
+
+# 2.1.0-alpha.9 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/use-intercept
+
+
+
+
+
+# 2.1.0-alpha.8 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/use-intercept
+
+
+
+
+
+# 2.1.0-alpha.7 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/use-intercept
+
+
+
+
+
+# 2.1.0-alpha.6 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/use-intercept
+
+
+
+
+
+# 2.1.0-alpha.5 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/use-intercept
+
+
+
+
+
+# [2.1.0-alpha.4](https://github.com/Tencent/wepy/compare/v2.1.0-alpha.2...v2.1.0-alpha.4) (2020-06-20)
+
+**Note:** Version bump only for package @wepy/use-intercept
diff --git a/packages/use-intercept/README.md b/packages/use-intercept/README.md
new file mode 100644
index 000000000..5df2937e9
--- /dev/null
+++ b/packages/use-intercept/README.md
@@ -0,0 +1,44 @@
+[English](./README_EN.md) | 简体中文
+
+# @wepy/use-intercept
+
+ weapp APIs intercept factory.
+
+## 安装 
+
+```
+npm install @wepy/use-intercept --save
+```
+
+## 用法
+
+
+### 基本用法
+
+```
+import wepy from '@wepy/core';
+import useIntercept  from '@wepy/use-intercept';
+
+wepy.use(useIntercept);
+
+const request = wepy.intercept(wepy.wx.request, {
+  config(params) {
+    console.log(params);
+    if (!params.data) {
+      params.data = {};
+    }
+    params.data.t = +new Date();
+    return params;
+    // return Promise.resolve(params); // support async config interceptor
+  },
+  success(res) {
+    console.log(res);
+    return res;
+  },
+  fail(e) {
+    console.log(e);
+    return e;
+  }
+})
+```
+
diff --git a/packages/use-intercept/README_EN.md b/packages/use-intercept/README_EN.md
new file mode 100644
index 000000000..ca0014c82
--- /dev/null
+++ b/packages/use-intercept/README_EN.md
@@ -0,0 +1,44 @@
+English | [简体中文](./README.md)
+
+# @wepy/use-intercept
+
+ weapp APIs intercept factory.
+
+## Install 
+
+```
+npm install @wepy/use-intercept --save
+```
+
+## Usage
+
+
+### Basic Usage
+
+```
+import wepy from '@wepy/core';
+import useIntercept  from '@wepy/use-intercept';
+
+wepy.use(useIntercept);
+
+const request = wepy.intercept(wepy.wx.request, {
+  config(params) {
+    console.log(params);
+    if (!params.data) {
+      params.data = {};
+    }
+    params.data.t = +new Date();
+    return params;
+    // return Promise.resolve(params); // support async config interceptor
+  },
+  success(res) {
+    console.log(res);
+    return res;
+  },
+  fail(e) {
+    console.log(e);
+    return e;
+  }
+})
+```
+
diff --git a/packages/use-intercept/dist/index.js b/packages/use-intercept/dist/index.js
new file mode 100644
index 000000000..cefee27b5
--- /dev/null
+++ b/packages/use-intercept/dist/index.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var install = require('./install');
+
+var index = {
+  install: install,
+  version: "2.0.3"
+};
+
+module.exports = index;
diff --git a/packages/use-intercept/index.js b/packages/use-intercept/index.js
new file mode 100644
index 000000000..564f0c84a
--- /dev/null
+++ b/packages/use-intercept/index.js
@@ -0,0 +1,6 @@
+import install from './install';
+
+export default {
+  install,
+  version: __VERSION__
+};
diff --git a/packages/use-intercept/install.js b/packages/use-intercept/install.js
new file mode 100644
index 000000000..d457dbdff
--- /dev/null
+++ b/packages/use-intercept/install.js
@@ -0,0 +1,109 @@
+/**
+ * Intercept a function
+ * @param  {Function} fn           the function need to intercept
+ * @param  {Object}   interceptors interceptors configuration
+ * @return {Function}              intercepted function
+ */
+const intercept = function(fn, interceptors) {
+  return function(...args) {
+    const self = this;
+    if (fn._promisify) {
+      const callit = function(args) {
+        let promise = fn.apply(this, args);
+        const successInterceptors = interceptors.success;
+        if (typeof successInterceptors === 'function') {
+          promise = promise.then(rst => {
+            return successInterceptors(rst);
+          });
+        }
+        const failInterceptors = interceptors.fail;
+        if (typeof failInterceptors === 'function') {
+          promise = promise.catch(e => {
+            throw failInterceptors(e);
+          });
+        }
+        return promise;
+      };
+
+      const configInterceptors = interceptors.config;
+      if (typeof configInterceptors === 'function') {
+        args = configInterceptors.apply(self, args);
+      }
+      if (isPromise(args)) {
+        return args.then(res => {
+          return callit(res);
+        });
+      } else {
+        return callit(args);
+      }
+    } else {
+      let originalOption = args[0];
+      let option = originalOption;
+      const callit = function(args) {
+        ['fail', 'success', 'complete'].forEach(item => {
+          const bak = args[item];
+          if (typeof bak === 'function') {
+            args[item] = res => {
+              if (typeof interceptors[item] === 'function') {
+                res = interceptors[item].call(self, res);
+              }
+              bak.call(self, res);
+            };
+          }
+        });
+        return fn.call(self, args);
+      };
+
+      const configInterceptors = interceptors.config;
+      if (typeof configInterceptors === 'function') {
+        option = configInterceptors.call(self, originalOption);
+      }
+      if (isPromise(option)) {
+        return option
+          .then(res => {
+            return callit(res);
+          })
+          .catch(e => {
+            const failInterceptors = interceptors.fail;
+            if (typeof failInterceptors === 'function') {
+              e = failInterceptors.call(self, e);
+            }
+            const failFunc = originalOption.fail;
+            if (typeof failFunc === 'function') {
+              failFunc.call(self, e);
+            }
+          });
+      } else {
+        return callit(option);
+      }
+    }
+  };
+};
+
+function isPromise(obj) {
+  return !!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function';
+}
+/*
+ * wx API intercept
+ * useage:
+ * wepy.use(useIntercept)
+ * wepy.intercept(wepy.wx.request, {
+ *   config(params) {
+ *     params.t = +new Date();
+ *     return params;
+ *     // return Promise.resolve(params);
+ *   },
+ *   success(res) {
+ *     return res;
+ *   },
+ *   fail(e) {
+ *     return e;
+ *   }
+ * })
+ */
+
+export default function install(wepy) {
+  wepy.wx = wepy.wx || Object.assign({}, wx);
+  wepy.intercept = intercept;
+}
+
diff --git a/packages/use-intercept/package.json b/packages/use-intercept/package.json
new file mode 100644
index 000000000..d1ff16b2d
--- /dev/null
+++ b/packages/use-intercept/package.json
@@ -0,0 +1,18 @@
+{
+  "name": "@wepy/use-intercept",
+  "version": "2.1.0",
+  "description": "wepy intercept",
+  "main": "/dist/index.js",
+  "scripts": {
+    "test": "mocha --require esm ./test/**/*"
+  },
+  "author": {
+    "name": "Gcaufy",
+    "email": "gcaufy@gmail.com"
+  },
+  "license": "MIT",
+  "readme": "ERROR: No README data found!",
+  "_id": "@wepy/use-intercept@2.0.4",
+  "_commitid": "2fd06e4",
+  "gitHead": "5a25776457360bbbbc54a4d059f6bc7c032d5df3"
+}
diff --git a/packages/use-intercept/test/index.test.js b/packages/use-intercept/test/index.test.js
new file mode 100644
index 000000000..232ae4bec
--- /dev/null
+++ b/packages/use-intercept/test/index.test.js
@@ -0,0 +1,265 @@
+import useInterceptInstall from '../install';
+const { expect } = require('chai');
+
+function ensureAllTaskDone(taskList, done) {
+  let tasks = {};
+  taskList.forEach(v => (tasks[v] = false));
+
+  let _interval = setInterval(function() {
+    let alldone = true;
+    for (let k in tasks) {
+      alldone = alldone && tasks[k];
+    }
+    if (alldone) {
+      clearInterval(_interval);
+      done();
+    }
+  });
+  return {
+    done: function(key) {
+      tasks[key] = true;
+    }
+  };
+}
+
+describe('@wepy/use-intercept', function() {
+  let __storage = {
+    mydata: { a: 1 }
+  };
+
+  let wx = {
+    request: function(option) {
+      setTimeout(() => {
+        option.fail && option.fail(new Error('wx.request error'));
+        option.complete && option.complete({ a: 1 });
+      }, 1000);
+    },
+    getStorage: function(option) {
+      setTimeout(() => {
+        let res = __storage[option.key];
+        option.success && option.success(res);
+        option.complete && option.complete(res);
+      });
+    },
+    setStorage: function(option) {
+      setTimeout(() => {
+        __storage[option.key] = option.data;
+      });
+    },
+    setStorageSync: function(option) {
+      __storage[option.key] = option.data;
+    },
+    getStorageSync: function(key) {
+      let res = __storage[key];
+      return res;
+    },
+    someNewAPI: function(option) {
+      setTimeout(() => {
+        option.success(option.num);
+      });
+    },
+    showActionSheet: function(option) {
+      setTimeout(() => {
+        option.success && option.success(option);
+      });
+    }
+  };
+
+  before(function() {
+    global.wx = wx;
+  });
+
+  it('test callback success', function(done) {
+    let task = ensureAllTaskDone(['test-getStorage-config', 'test-getStorage-success', 'test-request-complete'], done);
+
+    let wepy = {};
+    useInterceptInstall(wepy);
+
+    const timeNow = +new Date();
+    const getStorage = wepy.intercept(wepy.wx.getStorage, {
+      config(p) {
+        p.t = timeNow;
+        expect(p.key).to.equal('sid');
+        task.done('test-getStorage-config');
+        return p;
+      },
+      success(res) {
+        res += ' world';
+        return res;
+      },
+      complete(res) {
+        res += ' complete';
+        return res;
+      }
+    });
+
+    expect(getStorage).is.a('function');
+
+    wx.setStorageSync({
+      key: 'sid',
+      data: 'hello'
+    });
+    getStorage({
+      key: 'sid',
+      success(res) {
+        expect(res).to.equal('hello world');
+        task.done('test-getStorage-success');
+      },
+      fail() {
+        throw new Error('never go here');
+      },
+      complete(res) {
+        expect(res).to.equal('hello complete');
+        task.done('test-request-complete');
+      }
+    });
+  });
+
+  it('test callback config promise', function(done) {
+    let task = ensureAllTaskDone(['test-getStorage-config', 'test-getStorage-success', 'test-request-complete'], done);
+
+    let wepy = {};
+    useInterceptInstall(wepy);
+
+    const timeNow = +new Date();
+    const getStorage = wepy.intercept(wepy.wx.getStorage, {
+      config(p) {
+        p.t = timeNow;
+        expect(p.key).to.equal('sid');
+        return new Promise(resolve => {
+          setTimeout(() => {
+            task.done('test-getStorage-config');
+            resolve(p);
+          });
+        });
+      },
+      success(res) {
+        res += ' world';
+        return res;
+      },
+      complete(res) {
+        res += ' complete';
+        return res;
+      }
+    });
+
+    expect(getStorage).is.a('function');
+
+    wx.setStorageSync({
+      key: 'sid',
+      data: 'hello'
+    });
+    getStorage({
+      key: 'sid',
+      success(res) {
+        expect(res).to.equal('hello world');
+        task.done('test-getStorage-success');
+      },
+      fail() {
+        throw new Error('never go here');
+      },
+      complete(res) {
+        expect(res).to.equal('hello complete');
+        task.done('test-request-complete');
+      }
+    });
+  });
+
+  it('test callback config promise reject', function(done) {
+    let task = ensureAllTaskDone(['test-getStorage-config', 'test-getStorage-fail'], done);
+
+    let wepy = {};
+    useInterceptInstall(wepy);
+
+    const timeNow = +new Date();
+    const getStorage = wepy.intercept(wepy.wx.getStorage, {
+      config(p) {
+        p.t = timeNow;
+        expect(p.key).to.equal('sid');
+        return new Promise((_, reject) => {
+          setTimeout(() => {
+            task.done('test-getStorage-config');
+            reject(new Error('test'));
+          });
+        });
+      },
+      fail(e) {
+        return new Error(e.message + ' from interceptor');
+      },
+      success(res) {
+        res += ' world';
+        return res;
+      },
+      complete(res) {
+        res += ' complete';
+        return res;
+      }
+    });
+
+    expect(getStorage).is.a('function');
+
+    wx.setStorageSync({
+      key: 'sid',
+      data: 'hello'
+    });
+    getStorage({
+      key: 'sid',
+      success() {
+        throw new Error('never go here');
+      },
+      fail(e) {
+        expect(e.message).to.equal('test from interceptor');
+        task.done('test-getStorage-fail');
+      },
+      complete() {
+        throw new Error('never call complete when interceptor config reject');
+      }
+    });
+  });
+
+  it('test callback failed', function(done) {
+    let task = ensureAllTaskDone(['test-request-config', 'test-request-fail', 'test-request-complete'], done);
+
+    let wepy = {};
+    useInterceptInstall(wepy);
+
+    const timeNow = +new Date();
+    const request = wepy.intercept(wepy.wx.request, {
+      config(params) {
+        params.t = timeNow;
+        task.done('test-request-config');
+        expect(params.url).to.equal('www.baidu.com');
+        return params;
+      },
+      fail(e) {
+        e.intercept_fail = true;
+        return e;
+      },
+      complete(res) {
+        res.intercept_complete = true;
+        return res;
+      }
+    });
+
+    expect(request).is.a('function');
+    request({
+      url: 'www.baidu.com',
+      success() {
+        throw new Error('never go here');
+      },
+      fail(e) {
+        expect(e.intercept_fail).to.equal(true);
+        task.done('test-request-fail');
+      },
+      complete(res) {
+        expect(res.a).to.equal(1);
+        expect(res.intercept_complete).to.equal(true);
+        task.done('test-request-complete');
+      }
+    });
+  });
+
+  after(function() {
+    delete global.wx;
+  });
+});
diff --git a/packages/use-promisify/CHANGELOG.md b/packages/use-promisify/CHANGELOG.md
new file mode 100644
index 000000000..b683b02c7
--- /dev/null
+++ b/packages/use-promisify/CHANGELOG.md
@@ -0,0 +1,64 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# 2.1.0 (2020-07-04)
+
+**Note:** Version bump only for package @wepy/use-promisify
+
+
+
+
+
+# 2.1.0-alpha.10 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/use-promisify
+
+
+
+
+
+# 2.1.0-alpha.9 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/use-promisify
+
+
+
+
+
+# 2.1.0-alpha.8 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/use-promisify
+
+
+
+
+
+# 2.1.0-alpha.7 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/use-promisify
+
+
+
+
+
+# 2.1.0-alpha.6 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/use-promisify
+
+
+
+
+
+# 2.1.0-alpha.5 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/use-promisify
+
+
+
+
+
+# [2.1.0-alpha.4](https://github.com/Tencent/wepy/compare/v2.1.0-alpha.2...v2.1.0-alpha.4) (2020-06-20)
+
+**Note:** Version bump only for package @wepy/use-promisify
diff --git a/packages/use-promisify/README.md b/packages/use-promisify/README.md
new file mode 100644
index 000000000..7dfc42316
--- /dev/null
+++ b/packages/use-promisify/README.md
@@ -0,0 +1,95 @@
+[English](./README_EN.md) | 简体中文
+
+# @wepy/use-promisify
+
+Promisfy all weapp APIs.
+
+## 安装
+
+```
+npm install @wepy/use-promisify --save
+```
+
+## 用法
+
+
+### 基本用法
+
+```
+import wepy from '@wepy/core';
+import promisify  from '@wepy/use-promisify';
+
+wepy.use(promisify);
+
+wepy.wx.getStorage('mykey').then(res => console.log(res));
+```
+
+### 忽略 APIs
+
+```
+wepy.use(promisify, ['getStorage', 'getSystemInfo']);
+
+// passing object
+// wepy.use(promisify, { someNewAPI: false, getStorage: true });
+wepy.wx.getStorage({
+  key: 'mykey',
+  succuess (res) { console.log(res) }
+})
+```
+
+### 函数调用
+
+Support to use `wepy.promisify` to promisify a callback function.
+
+```
+/**
+ * Promisify a callback function
+ * @param  {Function} fn     callback function
+ * @param  {Object}   caller caller
+ * @param  {String}   type   weapp-style|error-first, default to weapp-style
+ * @return {Function}        promisified function
+ */
+wepy.promisify(fn, caller, type);
+```
+
+#### weapp-style
+
+支持 weapp-style的所有功能:
+
+```
+func({
+  success () {},
+  fail () {}
+})
+wepy.promisify(func)({key: 'mykey'}).then(console.log).catch(console.error);
+```
+
+#### error-first
+
+支持所有 `error-first` 功能，例如:
+
+```
+func(arg1, args2, function (err, data) {});
+
+wepy.promisify(func, null, 'error-first')(arg1, arg2).then(console.log).catch(console.error);
+```
+
+
+### 简化参数
+
+`weapp-style` 函数始终需要一个Object参数，并且此插件将简化参数。例如：
+
+```
+wepy.use(promisify);
+
+// wepy.wx.getStorage({ key: 'mykey' });
+wepy.wx.getStorage('mykey');
+
+// wepy.wx.request({ url: myurl });
+wepy.wx.request(myurl);
+
+// wepy.wx.openLocation({ latitude: 0, longitude: 0 });
+wepy.wx.openLocation(0, 0);
+```
+
+在这里我们可以看到所有的简化列表 [Simplify List](https://github.com/Tencent/wepy/blob/2.0.x/packages/use-promisify/index.js#L86-L152) 
\ No newline at end of file
diff --git a/packages/use-promisify/README_EN.md b/packages/use-promisify/README_EN.md
new file mode 100644
index 000000000..55a1e0a3f
--- /dev/null
+++ b/packages/use-promisify/README_EN.md
@@ -0,0 +1,95 @@
+English | [简体中文](./README.md)
+
+# @wepy/use-promisify
+
+Promisfy all weapp APIs.
+
+## Install 
+
+```
+npm install @wepy/use-promisify --save
+```
+
+## Usage
+
+
+### Basic Usage
+
+```
+import wepy from '@wepy/core';
+import promisify  from '@wepy/use-promisify';
+
+wepy.use(promisify);
+
+wepy.wx.getStorage('mykey').then(res => console.log(res));
+```
+
+### Ignore APIs
+
+```
+wepy.use(promisify, ['getStorage', 'getSystemInfo']);
+
+// passing object
+// wepy.use(promisify, { someNewAPI: false, getStorage: true });
+wepy.wx.getStorage({
+  key: 'mykey',
+  succuess (res) { console.log(res) }
+})
+```
+
+### Function call
+
+Support to use `wepy.promisify` to promisify a callback function.
+
+```
+/**
+ * Promisify a callback function
+ * @param  {Function} fn     callback function
+ * @param  {Object}   caller caller
+ * @param  {String}   type   weapp-style|error-first, default to weapp-style
+ * @return {Function}        promisified function
+ */
+wepy.promisify(fn, caller, type);
+```
+
+#### weapp-style
+
+Supports all function which is weapp-style:
+
+```
+func({
+  success () {},
+  fail () {}
+})
+wepy.promisify(func)({key: 'mykey'}).then(console.log).catch(console.error);
+```
+
+#### error-first
+
+Supports all `error-first` functions, like:
+
+```
+func(arg1, args2, function (err, data) {});
+
+wepy.promisify(func, null, 'error-first')(arg1, arg2).then(console.log).catch(console.error);
+```
+
+
+### Simplify Parameters
+
+`weapp-style` function always need a Object params, and this plugin will simplify the parameters. e.g.
+
+```
+wepy.use(promisify);
+
+// wepy.wx.getStorage({ key: 'mykey' });
+wepy.wx.getStorage('mykey');
+
+// wepy.wx.request({ url: myurl });
+wepy.wx.request(myurl);
+
+// wepy.wx.openLocation({ latitude: 0, longitude: 0 });
+wepy.wx.openLocation(0, 0);
+```
+
+Here we can see all the [Simplify List](https://github.com/Tencent/wepy/blob/2.0.x/packages/use-promisify/index.js#L86-L152) 
diff --git a/packages/use-promisify/dist/index.js b/packages/use-promisify/dist/index.js
new file mode 100644
index 000000000..b9659245d
--- /dev/null
+++ b/packages/use-promisify/dist/index.js
@@ -0,0 +1,220 @@
+'use strict';
+
+/**
+ * Promisify a callback function
+ * @param  {Function} fn     callback function
+ * @param  {Object}   caller caller
+ * @param  {String}   type   weapp-style|error-first, default to weapp-style
+ * @return {Function}        promisified function
+ */
+var promisify = function(fn, caller, type) {
+  if ( type === void 0 ) type = 'weapp-style';
+
+  return function() {
+    var args = [], len = arguments.length;
+    while ( len-- ) args[ len ] = arguments[ len ];
+
+    return new Promise(function (resolve, reject) {
+      switch (type) {
+        case 'weapp-style':
+          fn.call(caller, Object.assign({}, args[0],
+            {success: function success(res) {
+                resolve(res);
+              },
+              fail: function fail(err) {
+                reject(err);
+              }}));
+          break;
+        case 'weapp-fix':
+          args = !args.length ? [{}] : args;
+          fn.apply(caller, args.concat(resolve).concat(reject));
+          break;
+        case 'error-first':
+          fn.apply(caller, args.concat( [function (err, res) { return (err ? reject(err) : resolve(res)); }]));
+          break;
+      }
+    });
+  };
+};
+
+// The methods no need to promisify
+var noPromiseMethods = [
+  // 媒体
+  'stopRecord',
+  'getRecorderManager',
+  'pauseVoice',
+  'stopVoice',
+  'pauseBackgroundAudio',
+  'stopBackgroundAudio',
+  'getBackgroundAudioManager',
+  'createAudioContext',
+  'createInnerAudioContext',
+  'createVideoContext',
+  'createCameraContext',
+
+  // 位置
+  'createMapContext',
+
+  // 设备
+  'canIUse',
+  'startAccelerometer',
+  'stopAccelerometer',
+  'startCompass',
+  'stopCompass',
+  'onBLECharacteristicValueChange',
+  'onBLEConnectionStateChange',
+
+  // 界面
+  'hideToast',
+  'hideLoading',
+  'showNavigationBarLoading',
+  'hideNavigationBarLoading',
+  'navigateBack',
+  'createAnimation',
+  'pageScrollTo',
+  'createSelectorQuery',
+  'createCanvasContext',
+  'createContext',
+  'drawCanvas',
+  'hideKeyboard',
+  'stopPullDownRefresh',
+
+  // 拓展接口
+  'arrayBufferToBase64',
+  'base64ToArrayBuffer'
+];
+
+var simplifyArgs = {
+  // network
+  request: 'url',
+  downloadFile: 'url',
+  connectSocket: 'url',
+  sendSocketMessage: 'data',
+
+  // media
+  previewImage: 'urls',
+  getImageInfo: 'src',
+  saveImageToPhotosAlbum: 'filePath',
+  playVoice: 'filePath',
+  playBackgroundAudio: 'dataUrl',
+  seekBackgroundAudio: 'position',
+  saveVideoToPhotosAlbum: 'filePath',
+
+  // files
+  saveFile: 'tempFilePath',
+  getFileInfo: 'filePath',
+  getSavedFileInfo: 'filePath',
+  removeSavedFile: 'filePath',
+  openDocument: 'filePath',
+
+  // device
+  setStorage: 'key,data',
+  getStorage: 'key',
+  removeStorage: 'key',
+  openLocation: 'latitude,longitude',
+  makePhoneCall: 'phoneNumber',
+  setClipboardData: 'data',
+  getConnectedBluetoothDevices: 'services',
+  createBLEConnection: 'deviceId',
+  closeBLEConnection: 'deviceId',
+  getBLEDeviceServices: 'deviceId',
+  startBeaconDiscovery: 'uuids',
+  setScreenBrightness: 'value',
+  setKeepScreenOn: 'keepScreenOn',
+
+  // screen
+  showToast: 'title',
+  showLoading: 'title,mask',
+  showModal: 'title,content',
+  showActionSheet: 'itemList,itemColor',
+  setNavigationBarTitle: 'title',
+  setNavigationBarColor: 'frontColor,backgroundColor',
+
+  // tabBar
+  setTabBarBadge: 'index,text',
+  removeTabBarBadge: 'idnex',
+  showTabBarRedDot: 'index',
+  hideTabBarRedDot: 'index',
+  showTabBar: 'animation',
+  hideTabBar: 'animation',
+
+  // topBar
+  setTopBarText: 'text',
+
+  // navigator
+  navigateTo: 'url',
+  redirectTo: 'url',
+  navigateBack: 'delta',
+  reLaunch: 'url',
+
+  // pageScroll
+  pageScrollTo: 'scrollTop,duration'
+};
+
+var makeObj = function (arr) {
+  var obj = {};
+  arr.forEach(function (v) { return (obj[v] = 1); });
+  return obj;
+};
+
+/*
+ * wx basic api promisify
+ * useage:
+ * wepy.use(wepy-use-promisify)
+ * wepy.use(wepy-use-promisify([nopromise1, nopromise2]));
+ * wepy.use(wepy-use-promisify({nopromise1: true, promise: false}));
+ * wepy.login().then().catch()
+ */
+function install(wepy, removeFromPromisify) {
+  var _wx = (wepy.wx = wepy.wx || Object.assign({}, wx));
+
+  var noPromiseMap = {};
+  if (removeFromPromisify) {
+    if (Array.isArray(removeFromPromisify)) {
+      noPromiseMap = makeObj(noPromiseMethods.concat(removeFromPromisify));
+    } else {
+      noPromiseMap = Object.assign({}, makeObj(noPromiseMethods), removeFromPromisify);
+    }
+  }
+
+  Object.keys(_wx).forEach(function (key) {
+    if (!noPromiseMap[key] && key.substr(0, 2) !== 'on' && key.substr(-4) !== 'Sync') {
+      _wx[key] = promisify(
+        function() {
+          var args = [], len = arguments.length;
+          while ( len-- ) args[ len ] = arguments[ len ];
+
+          var fixArgs = args[0];
+          var failFn = args.pop();
+          var successFn = args.pop();
+          if (simplifyArgs[key] && Object.prototype.toString.call(fixArgs) !== '[object Object]') {
+            fixArgs = {};
+            var ps = simplifyArgs[key];
+            if (args.length) {
+              ps.split(',').forEach(function (p, i) {
+                if (i in args) {
+                  fixArgs[p] = args[i];
+                }
+              });
+            }
+          }
+          fixArgs.success = successFn;
+          fixArgs.fail = failFn;
+
+          return wx[key].call(wx, fixArgs);
+        },
+        _wx,
+        'weapp-fix'
+      );
+    }
+  });
+
+  wepy.promisify = promisify;
+}
+
+var index = {
+  install: install,
+  version: "2.0.6"
+};
+
+module.exports = index;
diff --git a/packages/use-promisify/index.js b/packages/use-promisify/index.js
new file mode 100644
index 000000000..564f0c84a
--- /dev/null
+++ b/packages/use-promisify/index.js
@@ -0,0 +1,6 @@
+import install from './install';
+
+export default {
+  install,
+  version: __VERSION__
+};
diff --git a/packages/use-promisify/install.js b/packages/use-promisify/install.js
new file mode 100644
index 000000000..af016aada
--- /dev/null
+++ b/packages/use-promisify/install.js
@@ -0,0 +1,207 @@
+/**
+ * Promisify a callback function
+ * @param  {Function} fn     callback function
+ * @param  {Object}   caller caller
+ * @param  {String}   type   weapp-style|error-first, default to weapp-style
+ * @return {Function}        promisified function
+ */
+const promisify = function(fn, caller, type = 'weapp-style') {
+  return function(...args) {
+    return new Promise((resolve, reject) => {
+      switch (type) {
+        case 'weapp-style':
+          fn.call(caller, {
+            ...args[0],
+            ...{
+              success(res) {
+                resolve(res);
+              },
+              fail(err) {
+                reject(err);
+              }
+            }
+          });
+          break;
+        case 'weapp-fix':
+          args = !args.length ? [{}] : args;
+          fn.apply(caller, args.concat(resolve).concat(reject));
+          break;
+        case 'error-first':
+          fn.apply(caller, [...args, (err, res) => (err ? reject(err) : resolve(res))]);
+          break;
+      }
+    });
+  };
+};
+
+// The methods no need to promisify
+const noPromiseMethods = [
+  // 媒体
+  'stopRecord',
+  'getRecorderManager',
+  'pauseVoice',
+  'stopVoice',
+  'pauseBackgroundAudio',
+  'stopBackgroundAudio',
+  'getBackgroundAudioManager',
+  'createAudioContext',
+  'createInnerAudioContext',
+  'createVideoContext',
+  'createCameraContext',
+
+  // 位置
+  'createMapContext',
+
+  // 设备
+  'canIUse',
+  'startAccelerometer',
+  'stopAccelerometer',
+  'startCompass',
+  'stopCompass',
+  'onBLECharacteristicValueChange',
+  'onBLEConnectionStateChange',
+
+  // 界面
+  'hideToast',
+  'hideLoading',
+  'showNavigationBarLoading',
+  'hideNavigationBarLoading',
+  'navigateBack',
+  'createAnimation',
+  'pageScrollTo',
+  'createSelectorQuery',
+  'createCanvasContext',
+  'createContext',
+  'drawCanvas',
+  'hideKeyboard',
+  'stopPullDownRefresh',
+
+  // 拓展接口
+  'arrayBufferToBase64',
+  'base64ToArrayBuffer'
+];
+
+const simplifyArgs = {
+  // network
+  request: 'url',
+  downloadFile: 'url',
+  connectSocket: 'url',
+  sendSocketMessage: 'data',
+
+  // media
+  previewImage: 'urls',
+  getImageInfo: 'src',
+  saveImageToPhotosAlbum: 'filePath',
+  playVoice: 'filePath',
+  playBackgroundAudio: 'dataUrl',
+  seekBackgroundAudio: 'position',
+  saveVideoToPhotosAlbum: 'filePath',
+
+  // files
+  saveFile: 'tempFilePath',
+  getFileInfo: 'filePath',
+  getSavedFileInfo: 'filePath',
+  removeSavedFile: 'filePath',
+  openDocument: 'filePath',
+
+  // device
+  setStorage: 'key,data',
+  getStorage: 'key',
+  removeStorage: 'key',
+  openLocation: 'latitude,longitude',
+  makePhoneCall: 'phoneNumber',
+  setClipboardData: 'data',
+  getConnectedBluetoothDevices: 'services',
+  createBLEConnection: 'deviceId',
+  closeBLEConnection: 'deviceId',
+  getBLEDeviceServices: 'deviceId',
+  startBeaconDiscovery: 'uuids',
+  setScreenBrightness: 'value',
+  setKeepScreenOn: 'keepScreenOn',
+
+  // screen
+  showToast: 'title',
+  showLoading: 'title,mask',
+  showModal: 'title,content',
+  showActionSheet: 'itemList,itemColor',
+  setNavigationBarTitle: 'title',
+  setNavigationBarColor: 'frontColor,backgroundColor',
+
+  // tabBar
+  setTabBarBadge: 'index,text',
+  removeTabBarBadge: 'idnex',
+  showTabBarRedDot: 'index',
+  hideTabBarRedDot: 'index',
+  showTabBar: 'animation',
+  hideTabBar: 'animation',
+
+  // topBar
+  setTopBarText: 'text',
+
+  // navigator
+  navigateTo: 'url',
+  redirectTo: 'url',
+  navigateBack: 'delta',
+  reLaunch: 'url',
+
+  // pageScroll
+  pageScrollTo: 'scrollTop,duration'
+};
+
+const makeObj = arr => {
+  let obj = {};
+  arr.forEach(v => (obj[v] = 1));
+  return obj;
+};
+
+/*
+ * wx basic api promisify
+ * useage:
+ * wepy.use(wepy-use-promisify)
+ * wepy.use(wepy-use-promisify([nopromise1, nopromise2]));
+ * wepy.use(wepy-use-promisify({nopromise1: true, promise: false}));
+ * wepy.login().then().catch()
+ */
+export default function install(wepy, removeFromPromisify) {
+  let _wx = (wepy.wx = wepy.wx || Object.assign({}, wx));
+
+  let noPromiseMap = {};
+  if (removeFromPromisify) {
+    if (Array.isArray(removeFromPromisify)) {
+      noPromiseMap = makeObj(noPromiseMethods.concat(removeFromPromisify));
+    } else {
+      noPromiseMap = Object.assign({}, makeObj(noPromiseMethods), removeFromPromisify);
+    }
+  }
+
+  Object.keys(_wx).forEach(key => {
+    if (!noPromiseMap[key] && key.substr(0, 2) !== 'on' && key.substr(-4) !== 'Sync') {
+      _wx[key] = promisify(
+        function(...args) {
+          let fixArgs = args[0];
+          let failFn = args.pop();
+          let successFn = args.pop();
+          if (simplifyArgs[key] && Object.prototype.toString.call(fixArgs) !== '[object Object]') {
+            fixArgs = {};
+            let ps = simplifyArgs[key];
+            if (args.length) {
+              ps.split(',').forEach((p, i) => {
+                if (i in args) {
+                  fixArgs[p] = args[i];
+                }
+              });
+            }
+          }
+          fixArgs.success = successFn;
+          fixArgs.fail = failFn;
+
+          return wx[key].call(wx, fixArgs);
+        },
+        _wx,
+        'weapp-fix'
+      );
+    }
+  });
+
+  wepy.promisify = promisify;
+}
diff --git a/packages/use-promisify/package.json b/packages/use-promisify/package.json
new file mode 100644
index 000000000..bbf489543
--- /dev/null
+++ b/packages/use-promisify/package.json
@@ -0,0 +1,18 @@
+{
+  "name": "@wepy/use-promisify",
+  "version": "2.1.0",
+  "description": "wepy promisify",
+  "main": "/dist/index.js",
+  "scripts": {
+    "test": "mocha --require esm ./test/**/*"
+  },
+  "author": {
+    "name": "Gcaufy",
+    "email": "gcaufy@gmail.com"
+  },
+  "license": "MIT",
+  "readme": "ERROR: No README data found!",
+  "_id": "@wepy/use-promisify@2.0.7",
+  "_commitid": "6d2153b",
+  "gitHead": "5a25776457360bbbbc54a4d059f6bc7c032d5df3"
+}
diff --git a/packages/use-promisify/test/index.test.js b/packages/use-promisify/test/index.test.js
new file mode 100644
index 000000000..6f84da940
--- /dev/null
+++ b/packages/use-promisify/test/index.test.js
@@ -0,0 +1,256 @@
+import usePromisifyInstall from '../install';
+const expect = require('chai').expect;
+
+function ensureAllTaskDone(taskList, done) {
+  let tasks = {};
+  taskList.forEach(v => (tasks[v] = false));
+
+  let _interval = setInterval(function() {
+    let alldone = true;
+    for (let k in tasks) {
+      alldone = alldone && tasks[k];
+    }
+    if (alldone) {
+      clearInterval(_interval);
+      done();
+    }
+  });
+  return {
+    done: function(key) {
+      tasks[key] = true;
+    }
+  };
+}
+
+describe('wepy@use-promisify', function() {
+  let __storage = {
+    mydata: { a: 1 }
+  };
+
+  let wx = {
+    request: function(option) {
+      setTimeout(() => {
+        option.fail && option.fail(new Error('timeout'));
+        option.complete && option.complete({ a: 1 });
+      }, 1000);
+    },
+    getStorage: function(option) {
+      setTimeout(() => {
+        let res = __storage[option.key];
+        option.success && option.success(res);
+        option.complete && option.complete(res);
+      });
+    },
+    setStorage: function(option) {
+      setTimeout(() => {
+        __storage[option.key] = option.data;
+        option.success && option.success();
+        option.complete && option.complete();
+      });
+    },
+    getStorageSync: function(key) {
+      let res = __storage[key];
+      return res;
+    },
+    someNewAPI: function(option) {
+      setTimeout(() => {
+        option.success(option.num);
+      });
+    },
+    showActionSheet: function(option) {
+      setTimeout(() => {
+        option.success && option.success(option);
+      });
+    },
+    checkSession: function(option) {
+      if (typeof option === 'function') {
+        throw new Error('option should not be a function');
+      }
+      setTimeout(() => {
+        option.success({ errMsg: 'checkSession:ok' });
+      });
+    }
+  };
+
+  before(function() {
+    global.wx = wx;
+  });
+
+  it('install', function(done) {
+    let task = ensureAllTaskDone(['test-request-catch', 'test-storage', 'test-checkSession'], done);
+
+    let wepy = {};
+    usePromisifyInstall(wepy);
+
+    expect(wepy.wx.request).is.a('function');
+
+    let promise = wepy.wx.request();
+
+    expect(promise).is.a('promise');
+
+    promise.catch(e => {
+      expect(e).is.an('error');
+      expect(e.message).to.equal('timeout');
+      task.done('test-request-catch');
+    });
+
+    wepy.wx.getStorage({ key: 'mydata' }).then(res => {
+      expect(res).to.deep.equal(__storage.mydata);
+      task.done('test-storage');
+    });
+
+    expect(wepy.wx.getStorageSync('mydata')).to.deep.equal(__storage.mydata);
+
+    wepy.wx.checkSession().then(res => {
+      expect(res).to.deep.equal({ errMsg: 'checkSession:ok' });
+      task.done('test-checkSession');
+    });
+  });
+
+  it('install appends array list', function(done) {
+    let wepy = {};
+
+    usePromisifyInstall(wepy, { someNewAPI: false, getStorage: true });
+
+    wepy.wx.someNewAPI({ num: 1 }).then(res => {
+      expect(res).to.equal(1);
+      done();
+    });
+  });
+
+  it('install get rid apis', function(done) {
+    let wepy = {};
+    usePromisifyInstall(wepy, ['getStorage']);
+    wepy.wx.getStorage({
+      key: 'mydata',
+      success: function(res) {
+        expect(res).is.deep.equal(__storage.mydata);
+        done();
+      }
+    });
+  });
+
+  it('params fix testing', function(done) {
+    let wepy = {};
+    usePromisifyInstall(wepy);
+
+    wepy.wx.setStorage('mydata', { b: 1 }).then(() => {
+      wepy.wx.getStorage('mydata').then(res => {
+        expect(res).to.deep.equal({ b: 1 });
+        expect(__storage.mydata).to.deep.equal(res);
+        done();
+      });
+    });
+  });
+
+  it('test err-first promisify', function(done) {
+    let task = ensureAllTaskDone(['test-greater', 'test-less'], done);
+
+    let isGreaterThan10 = function(num, callback) {
+      setTimeout(function() {
+        if (num > 10) {
+          callback(null, true);
+        } else {
+          callback(new Error('wrong'), false);
+        }
+      }, 300);
+    };
+
+    let wepy = {};
+    usePromisifyInstall(wepy);
+
+    let promisifyFn = wepy.promisify(isGreaterThan10, null, 'error-first');
+
+    promisifyFn(11).then(res => {
+      expect(res).to.equal(true);
+      task.done('test-greater');
+    });
+
+    promisifyFn(9)
+      .then(() => {
+        throw new Error('should not run here');
+      })
+      .catch(e => {
+        expect(e).is.an('error');
+        expect(e.message).to.equal('wrong');
+        task.done('test-less');
+      });
+  });
+
+  it('test weapp-style promisify', function(done) {
+    let task = ensureAllTaskDone(['test-greater', 'test-less'], done);
+
+    let isGreaterThan10 = function(option) {
+      if (option.num > 10) {
+        option.success(true);
+      } else {
+        option.fail(new Error('wrong'));
+      }
+    };
+
+    let wepy = {};
+    usePromisifyInstall(wepy);
+
+    let promisifyFn = wepy.promisify(isGreaterThan10);
+
+    promisifyFn({ num: 11 }).then(res => {
+      expect(res).to.equal(true);
+      task.done('test-greater');
+    });
+
+    promisifyFn({ num: 9 })
+      .then(() => {
+        throw new Error('should not run here');
+      })
+      .catch(e => {
+        expect(e).is.an('error');
+        expect(e.message).to.equal('wrong');
+        task.done('test-less');
+      });
+  });
+
+  it('test simplify', function(done) {
+    let wepy = {},
+      originParamsArr = [
+        {
+          itemList: 0,
+          itemColor: 0
+        },
+        {
+          itemList: ['A', 'B', 'C'],
+          itemColor: '#000'
+        },
+        {
+          itemList: 'test?id=1'
+        }
+      ],
+      task = ensureAllTaskDone(
+        (function() {
+          return originParamsArr.map((item, index) => index);
+        })(),
+        done
+      );
+
+    usePromisifyInstall(wepy);
+
+    for (let item of originParamsArr) {
+      let filterParams = Object.values(item);
+      wepy.wx
+        .showActionSheet(...filterParams)
+        .then(res => {
+          delete res.success;
+          delete res.fail;
+          expect(res).to.deep.equal(item);
+          task.done(originParamsArr.indexOf(item));
+        })
+        .catch(e => {
+          // eslint-disable-next-line no-console
+          console.log(e);
+        });
+    }
+  });
+
+  after(function() {
+    delete global.wx;
+  });
+});
diff --git a/packages/wepy-ant/.npmignore b/packages/wepy-ant/.npmignore
deleted file mode 100644
index a25615e13..000000000
--- a/packages/wepy-ant/.npmignore
+++ /dev/null
@@ -1,10 +0,0 @@
-node_modules/
-coverage/
-demo/
-test/
-ISSUE_TEMPLATE.md
-appveyor.yml
-README_zh-CN.md
-*.map
-src/
-coverage
\ No newline at end of file
diff --git a/packages/wepy-ant/README.md b/packages/wepy-ant/README.md
deleted file mode 100644
index 9d054c646..000000000
--- a/packages/wepy-ant/README.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# 支付宝版本
-
-参见：[小程序框架wepy](https://github.com/wepyjs/wepy)
-
-
-### 安装
-```bash
-wepy build --output ant
-```
-
-### Changelog
-[查看CHANGELOG](https://github.com/wepyjs/wepy/blob/master/CHANGELOG.md)
diff --git a/packages/wepy-ant/package.json b/packages/wepy-ant/package.json
deleted file mode 100644
index 56a4252c3..000000000
--- a/packages/wepy-ant/package.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "name": "wepy-ant",
-  "version": "1.5.9",
-  "description": "",
-  "main": "lib/wepy.js",
-  "scripts": {
-    "prepublish": "npm run build",
-    "build": "babel --presets es2015,stage-1 src/ --out-dir lib/ --source-maps",
-    "watch-compile": "npm run build -- --watch",
-    "watch": "npm run watch-compile",
-    "eslint": "eslint src/"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git@github.com:wepyjs/wepy.git"
-  },
-  "author": "Gcaufy",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/wepyjs/wepy/issues"
-  },
-  "homepage": "https://github.com/wepyjs/wepy#readme",
-  "devDependencies": {
-    "babel": "^6.5.2",
-    "babel-cli": "^6.18.0",
-    "babel-eslint": "^7.1.1",
-    "babel-preset-es2015": "^6.18.0",
-    "babel-preset-stage-1": "^6.16.0"
-  }
-}
diff --git a/packages/wepy-ant/src/app.js b/packages/wepy-ant/src/app.js
deleted file mode 100644
index cb6411cd6..000000000
--- a/packages/wepy-ant/src/app.js
+++ /dev/null
@@ -1,270 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-import native from './native';
-
-let RequestMQ = {
-    map: {},
-    mq: [],
-    running: [],
-    MAX_REQUEST: 5,
-    push (param) {
-        param.t = +new Date();
-        while ((this.mq.indexOf(param.t) > -1 || this.running.indexOf(param.t) > -1)) {
-            param.t += Math.random() * 10 >> 0;
-        }
-        this.mq.push(param.t);
-        this.map[param.t] = param;
-    },
-    next () {
-        let me = this;
-
-        if (this.mq.length === 0)
-            return;
-
-        if (this.running.length < this.MAX_REQUEST - 1) {
-            let newone = this.mq.shift();
-                let obj = this.map[newone];
-                let oldComplete = obj.complete;
-                obj.complete = (...args) => {
-                    me.running.splice(me.running.indexOf(obj.t), 1);
-                    delete me.map[obj.t];
-                    oldComplete && oldComplete.apply(obj, args);
-                    me.next();
-                }
-                this.running.push(obj.t);
-                return my.request(obj);
-        }
-    },
-    request (obj) {
-        let me = this;
-
-        obj = obj || {};
-        obj = (typeof(obj) === 'string') ? {url: obj} : obj;
-
-
-        this.push(obj);
-
-        return this.next();
-    }
-};
-
-
-export default class {
-
-    $addons = {};
-
-    $interceptors = {};
-
-    $pages = {};
-
-
-
-    $init (wepy, config = {}) {
-        this.$initAPI(wepy, config.promisifyAPI);
-        this.$initDiffAPI(wepy);
-        this.$wxapp = getApp();
-    }
-
-
-    use (addon, ...args) {
-        if (typeof(addon) === 'string' && this[addon]) {
-            this.$addons[addon] = 1;
-            this[addon](args);
-        } else {
-            this.$addons[addon.name] = new addon(args);
-        }
-    }
-
-    intercept (api, provider) {
-        this.$interceptors[api] = provider;
-    }
-
-    promisify () {
-    }
-
-    requestfix () {
-    }
-
-    $initAPI (wepy, promisifyAPI) {
-        var self = this;
-        let noPromiseMethods = {
-            stopRecord: true,
-            pauseVoice: true,
-            stopVoice: true,
-            pauseBackgroundAudio: true,
-            stopBackgroundAudio: true,
-            showNavigationBarLoading: true,
-            hideNavigationBarLoading: true,
-            createAnimation: true,
-            createContext: true,
-            createCanvasContext: true,
-            hideKeyboard: true,
-            stopPullDownRefresh: true
-        };
-        if (promisifyAPI) {
-            for (let k in promisifyAPI) {
-                noPromiseMethods[k] = promisifyAPI[k];
-            }
-        }
-        Object.keys(my).forEach((key) => {
-            if (!noPromiseMethods[key] && key.substr(0, 2) !== 'on' && !(/\w+Sync$/.test(key))) {
-                Object.defineProperty(native, key, {
-                    get () {
-                        return (obj) => {
-                            obj = obj || {};
-                            if (self.$interceptors[key] && self.$interceptors[key].config) {
-                                let rst = self.$interceptors[key].config.call(self, obj);
-                                if (rst === false) {
-                                    if (self.$addons.promisify) {
-                                        return Promise.reject('aborted by interceptor');
-                                    } else {
-                                        obj.fail && obj.fail('aborted by interceptor');
-                                        return;
-                                    }
-                                }
-                                obj = rst;
-                            }
-                            if (key === 'request') {
-                                obj = (typeof(obj) === 'string') ? {url: obj} : obj;
-                            }
-                            if (typeof obj === 'string') {
-                                return my[key](obj);
-                            }
-                            if (self.$addons.promisify) {
-                                return new Promise((resolve, reject) => {
-                                    let bak = {};
-                                    ['fail', 'success', 'complete'].forEach((k) => {
-                                        bak[k] = obj[k];
-                                        obj[k] = (res) => {
-                                            if (self.$interceptors[key] && self.$interceptors[key][k]) {
-                                                res = self.$interceptors[key][k].call(self, res);
-                                            }
-                                            if (k === 'success')
-                                                resolve(res)
-                                            else if (k === 'fail')
-                                                reject(res);
-                                        };
-                                    });
-                                    if (self.$addons.requestfix && key === 'request') {
-                                        RequestMQ.request(obj);
-                                    } else
-                                        my[key](obj);
-                                });
-                            } else {
-                                let bak = {};
-                                ['fail', 'success', 'complete'].forEach((k) => {
-                                    bak[k] = obj[k];
-                                    obj[k] = (res) => {
-                                        if (self.$interceptors[key] && self.$interceptors[key][k]) {
-                                            res = self.$interceptors[key][k].call(self, res);
-                                        }
-                                        bak[k] && bak[k].call(self, res);
-                                    };
-                                });
-                                if (self.$addons.requestfix && key === 'request') {
-                                    RequestMQ.request(obj);
-                                } else
-                                    my[key](obj);
-                            }
-                        };
-                    }
-                });
-                wepy[key] = native[key];
-            } else {
-                Object.defineProperty(native, key, {
-                    get () { return (...args) => my[key].apply(my, args) }
-                });
-                wepy[key] = native[key];
-            }
-        });
-
-    }
-
-    $initDiffAPI(wepy) {
-        const STORAGE_API = ['getStorageSync', 'setStorageSync', 'removeStorageSync'];
-        let bak = {};
-        STORAGE_API.forEach(api => {
-            bak[api] = wepy[api];
-            wepy[api] = (key, data) => {
-                let params = {};
-                if (typeof key === 'string') {
-                    params.key = key;
-                    if (data) {
-                        params.data = data;
-                    }
-                } else {
-                    params = key;
-                }
-                return bak[api](params);
-            };
-        });
-
-        wepy.setNavigationBarTitle = wepy.setNavigationBar;
-
-        wepy.login = wepy.getAuthCode;
-
-        wepy.request = wepy.httpRequest;
-
-        if (this.$addons.promisify) {
-            wepy.login = () => {
-                return new Promise((resolve, reject) => {
-                    wepy.getAuthCode().then(res => {
-                        res.code = res.authCode;
-                        delete res.authCode;
-                        resolve(res);
-                    }).catch(reject);
-                });
-            };
-            wepy.getUserInfo = () => {
-                return new Promise((resolve, reject) => {
-                    wepy.getAuthUserInfo(res => {
-                        let rst = {};
-                        for (let k in res) {
-                            rst[k === 'avatar' ? 'avatarUrl' : k] = res[k]
-                        }
-                        resolve({
-                            userInfo: rst
-                        })
-                    })
-                })
-            }
-        } else {
-            wepy.login = (o) => {
-                let bak = {
-                    success: o.success,
-                    fail: o.fail,
-                    complete: o.complete
-                };
-                o.success = function (res) {
-                    res.code = res.authCode;
-                    delete res.authCode;
-                    bak.success && bak.success(res);
-                }
-                return wepy.getAuthCode(o);
-            };
-            wepy.getUserInfo = (o) => {
-                let bak = {
-                    success: o.success,
-                    fail: o.fail,
-                    complete: o.complete
-                };
-                o.success = function (res) {
-                    let rst = {};
-                    for (let k in res) {
-                        rst[k === 'avatar' ? 'avatarUrl' : k] = res[k]
-                    }
-                    bak.success && bak.success({userInfo: rst});
-                }
-                return wepy.getAuthUserInfo(o);
-            };
-        }
-
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy-ant/src/base.js b/packages/wepy-ant/src/base.js
deleted file mode 100644
index eecd2f84b..000000000
--- a/packages/wepy-ant/src/base.js
+++ /dev/null
@@ -1,210 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import event from './event';
-import util from './util';
-
-const PAGE_EVENT = ['onLoad', 'onReady', 'onShow', 'onHide', 'onUnload', 'onPullDownRefresh', 'onReachBottom', 'onShareAppMessage'];
-const APP_EVENT = ['onLaunch', 'onShow', 'onHide', 'onError'];
-
-
-let $bindEvt = (config, com, prefix) => {
-    com.$prefix = util.camelize(prefix || '');
-    Object.getOwnPropertyNames(com.components || {}).forEach((name) => {
-        let cClass = com.components[name];
-        let child = new cClass();
-        child.$initMixins();
-        child.$name = name;
-        let comPrefix = prefix ? (prefix + child.$name + '$') : ('$' + child.$name + '$');
-
-        com.$com[name] = child;
-
-        $bindEvt(config, child, comPrefix);
-    });
-    Object.getOwnPropertyNames(com.constructor.prototype || []).forEach((prop) => {
-        if(prop !== 'constructor' && PAGE_EVENT.indexOf(prop) === -1) {
-            config[prop] = function () {
-                com.constructor.prototype[prop].apply(com, arguments);
-                com.$apply();
-            }
-        }
-    });
-
-    let allMethods = Object.getOwnPropertyNames(com.methods || []);
-
-    com.$mixins.forEach((mix) => {
-        allMethods = allMethods.concat(Object.getOwnPropertyNames(mix.methods || []));
-    });
-
-    allMethods.forEach((method, i) => {
-        config[com.$prefix + method] = function (e, ...args) {
-            let evt = new event('system', this, e.type);
-            evt.$transfor(e);
-            let wepyParams = [], paramsLength = 0, tmp, p, comIndex;
-            if (e.currentTarget && e.currentTarget.dataset) {
-                tmp = e.currentTarget.dataset;
-                while(tmp['wepyParams' + (p = String.fromCharCode(65 + paramsLength++))] !== undefined) {
-                    wepyParams.push(tmp['wepyParams' + p]);
-                }
-                if (tmp.comIndex !== undefined) {
-                    comIndex = tmp.comIndex;
-                }
-            }
-
-            // Update repeat components data.
-            if (comIndex !== undefined) {
-                comIndex = ('' + comIndex).split('-');
-                let level = comIndex.length, tmp = level;
-                while(level-- > 0) {
-                    tmp = level;
-                    let tmpcom = com;
-                    while (tmp-- > 0) {
-                        tmpcom = tmpcom.$parent;
-                    }
-                    tmpcom.$setIndex(comIndex.shift());
-                }
-            }
-
-            args = [].concat(wepyParams);
-            let rst, mixRst;
-            let comfn = com.methods[method];
-            if (comfn) {
-                rst = comfn.apply(com, args.concat(evt));
-            }
-            com.$mixins.forEach((mix) => {
-                mix.methods[method] && (mixRst = mix.methods[method].apply(com, args.concat(evt)));
-            });
-            com.$apply();
-            return comfn ? rst : mixRst;
-        }
-    });
-    return config;
-};
-
-
-export default {
-    $createApp (appClass, appConfig) {
-        let config = {};
-        let app = new appClass();
-
-        if (!this.$instance) {
-            app.$init(this, appConfig);
-            this.$instance = app;
-        }
-
-        // This is for test case
-        if (arguments.length === 2 && arguments[1] === true) {
-            config.$app = app;
-        }
-
-        app.$wxapp = getApp();
-
-        APP_EVENT.forEach((v) => {
-            config[v] = (...args) => {
-                let rst;
-                app[v] && (rst = app[v].apply(app, args));
-                return rst;
-            };
-        });
-        return config;
-    },
-    $createPage (pageClass, pagePath) {
-        let self = this;
-        let config = {}, k;
-        let page = new pageClass();
-        if (typeof pagePath === 'string') {
-            this.$instance.$pages['/' + pagePath] = page;
-        }
-        page.$initMixins();
-        // This will be a circum Object
-        if ((typeof pagePath === 'boolean' && pagePath) || (arguments.length === 3 && arguments[2] === true))
-            config.$page = page;
-
-        config.onLoad = function (...args) {
-
-            page.$name = pageClass.name || 'unnamed';
-            page.$init(this, self.$instance, self.$instance);
-
-            let prevPage = self.$instance.__prevPage__;
-            let secParams = {};
-            secParams.from = prevPage ? prevPage : undefined;
-
-            if (prevPage && Object.keys(prevPage.$preloadData).length > 0) {
-                secParams.preload = prevPage.$preloadData;
-                prevPage.$preloadData = {};
-            }
-            if (page.$prefetchData && Object.keys(page.$prefetchData).length > 0) {
-                secParams.prefetch = page.$prefetchData;
-                page.$prefetchData = {};
-            }
-            args.push(secParams);
-            page.onLoad && page.onLoad.apply(page, args);
-
-            page.$mixins.forEach((mix) => {
-                mix['onLoad'] && mix['onLoad'].apply(page, args);
-            });
-
-            page.$apply();
-        };
-
-        config.onShow = function (...args) {
-
-            self.$instance.__prevPage__ = page;
-
-            page.onShow && page.onShow.apply(page, args);
-
-            page.$mixins.forEach((mix) => {
-                mix['onShow'] && mix['onShow'].apply(page, args);
-            });
-
-            let pages = getCurrentPages();
-            let pageId = pages[pages.length - 1].__route__;
-
-            if (self.$instance.__route__ !== pageId) {
-
-                self.$instance.__route__ = pageId;
-
-                page.onRoute && page.onRoute.apply(page, args);
-
-                page.$mixins.forEach((mix) => {
-                    mix['onRoute'] && mix['onRoute'].apply(page, args);
-                });
-            }
-
-            page.$apply();
-        };
-
-        PAGE_EVENT.forEach((v) => {
-            if (v !== 'onLoad' && v !== 'onShow') {
-                config[v] = (...args) => {
-                    let rst;
-                    page[v] && (rst = page[v].apply(page, args));
-
-                    if (v === 'onShareAppMessage')
-                        return rst;
-
-                    page.$mixins.forEach((mix) => {
-                        mix[v] && mix[v].apply(page, args);
-                    });
-
-                    page.$apply();
-
-                    return rst;
-                };
-            }
-        });
-
-        if (!page.onShareAppMessage) {
-            delete config.onShareAppMessage;
-        }
-
-        return $bindEvt(config, page, '');
-    },
-}
diff --git a/packages/wepy-ant/src/component.js b/packages/wepy-ant/src/component.js
deleted file mode 100644
index 112761099..000000000
--- a/packages/wepy-ant/src/component.js
+++ /dev/null
@@ -1,496 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import event from './event';
-import util from './util';
-
-
-const Props = {
-    check (t, val) {
-        switch (t) {
-            case String:
-                return typeof(val) === 'string';
-            case Number:
-                return typeof(val) === 'number';
-            case Boolean:
-                return typeof(val) === 'boolean';
-            case Function:
-                return typeof(val) === 'function';
-            case Object:
-                return typeof(val) === 'object';
-            case Array:
-                return toString.call(val) === '[object Array]';
-            default:
-                return val instanceof t;
-        }
-    },
-    build (props) {
-        let rst = {};
-        if (typeof(props) === 'string') {
-            rst[props] = {};
-        } else if (toString.call(props) === '[object Array]') {
-            props.forEach((p) => {
-                rst[p] = {};
-            });
-        } else {
-            Object.keys(props).forEach(p => {
-                if (typeof(props[p]) === 'function') {
-                    rst[p] = {
-                        type: [props[p]]
-                    }
-                } else if (toString.call(props[p]) === '[object Array]') {
-                    rst[p] = {
-                        type: props[p]
-                    }
-                } else
-                    rst[p] = props[p];
-
-                if (rst[p].type && toString.call(rst[p].type) !== '[object Array]')
-                    rst[p].type = [rst[p].type];
-            });
-        }
-        return rst;
-    },
-    valid (props, key, val) {
-        let valid = false;
-        if (props[key]) {
-            if (!props[key].type) {
-                valid = true;
-            } else {
-                return props[key].type.some(t => this.check(t, val));
-            }
-        }
-        return valid;
-    },
-    getValue (props, key, value) {
-        var rst;
-        if (value !== undefined && this.valid(props, key, value)) {
-            rst = value;
-        } else if (typeof(props[key].default) === 'function') {
-            rst = props[key].default();
-        } else
-            rst = props[key].default;
-        return props[key].coerce ? props[key].coerce(rst) : rst;
-    }
-};
-
-export default class {
-
-    $com = {};
-    $mixins = [];
-
-    $isComponent = true;
-    $prefix = '';
-
-    $mappingProps = {};
-
-    data = {};
-    methods = {};
-
-    $init ($wxpage, $root, $parent) {
-        let self = this;
-
-        this.$wxpage = $wxpage;
-        if (this.$isComponent) {
-            this.$root = $root || this.$root;
-            this.$parent = $parent || this.$parent;
-            this.$wxapp = this.$root.$parent.$wxapp;
-        }
-
-        if (this.props) {
-            this.props = Props.build(this.props);
-        }
-
-        let k, defaultData = {};
-
-
-        let props = this.props;
-        let key, val, binded;
-        let inRepeat = false, repeatKey;
-
-
-        // save a init data.
-        if (this.$initData === undefined) {
-            this.$initData = util.$copy(this.data, true);
-        } else {
-            this.data = util.$copy(this.$initData, true);
-        }
-
-        if (this.$props) { // generate mapping Props
-            for (key in this.$props) {
-                for (binded in this.$props[key]) {
-                    if (/\.sync$/.test(binded)) { // sync goes to mapping
-                        if (!this.$mappingProps[this.$props[key][binded]])
-                            this.$mappingProps[this.$props[key][binded]] = {};
-                        this.$mappingProps[this.$props[key][binded]][key] = binded.substring(7, binded.length - 5);
-                    }
-                }
-            }
-        }
-
-        if (props) {
-            for (key in props) {
-                val = undefined;
-                if ($parent && $parent.$props && $parent.$props[this.$name]) {
-                    val = $parent.$props[this.$name][key];
-                    binded = $parent.$props[this.$name][`v-bind:${key}.once`] || $parent.$props[this.$name][`v-bind:${key}.sync`];
-                    if (binded) {
-                        if (typeof(binded) === 'object') {
-                            props[key].repeat = binded.for;
-                            
-                            inRepeat = true;
-
-                            let bindfor = binded.for, binddata = $parent;
-                            bindfor.split('.').forEach(t => {
-                                binddata = binddata[t];
-                            });
-                            repeatKey = Object.keys(binddata)[0];
-
-
-                            if (!this.$mappingProps[key]) this.$mappingProps[key] = {};
-                            this.$mappingProps[key]['parent'] = {
-                                mapping: binded.for,
-                                from: key
-                            };
-                        } else {
-                            val = $parent[binded];
-                            if (props[key].twoWay) {
-                                if (!this.$mappingProps[key]) this.$mappingProps[key] = {};
-                                this.$mappingProps[key]['parent'] = binded;
-                            }
-                        }
-                    } else if (typeof val === 'object' && val.value !== undefined) { // 静态传值
-                        this.data[key] = val.value;
-                    }
-                }
-                if (!this.data[key] && !props[key].repeat) {
-                    val = Props.getValue(props, key, val);
-                    this.data[key] = val;
-                }
-            }
-        }
-
-        for (k in this.data) {
-            defaultData[`${this.$prefix}${k}`] = this.data[k];
-            this[k] = this.data[k];
-            //this[k] = util.$copy(this.data[k], true);
-        }
-
-        this.$data = util.$copy(this.data, true);
-        if (inRepeat)
-            this.$setIndex(repeatKey);
-
-        if (this.computed) {
-            for (k in this.computed) {
-                let fn = this.computed[k];
-                defaultData[`${this.$prefix}${k}`] = fn.call(this);
-                this[k] = util.$copy(defaultData[`${this.$prefix}${k}`], true);
-            }
-        }
-        this.setData(defaultData);
-
-        let coms = Object.getOwnPropertyNames(this.$com);
-        if (coms.length) {
-            coms.forEach((name) => {
-                this.$com[name].$init(this.getWxPage(), $root, this);
-                this.$com[name].onLoad && this.$com[name].onLoad();
-
-                this.$com[name].$mixins.forEach((mix) => {
-                    mix['onLoad'] && mix['onLoad'].call(this.$com[name]);
-                });
-
-                this.$com[name].$apply();
-            });
-        }
-    }
-
-    $initMixins () {
-        if (this.mixins) {
-            if (typeof(this.mixins) === 'function') {
-                this.mixins = [this.mixins];
-            }
-        } else {
-            this.mixins = [];
-        }
-        this.mixins.forEach((mix) => {
-            let inst = new mix();
-            inst.$init(this);
-            this.$mixins.push(inst);
-        });
-    }
-
-    onLoad () {
-    }
-
-    setData (k, v) {
-        if (typeof(k) === 'string') {
-            if (v) {
-                let tmp = {};
-                tmp[k] = v;
-                k = tmp;
-            } else {
-                let tmp = {};
-                tmp[k] = this.data[`${k}`];
-                k = tmp;
-            }
-            return this.$wxpage.setData(k);
-        }
-        let t = null, reg = new RegExp('^' + this.$prefix.replace(/\$/g, '\\$'), 'ig');
-        for (t in k) {
-            let noPrefix = t.replace(reg, '');
-            this.$data[noPrefix] = util.$copy(k[t], true);
-        }
-        return this.$wxpage.setData(k);
-    }
-
-    getWxPage () {
-        return this.$wxpage;
-    }
-
-    getCurrentPages () {
-        return this.$wxpage.getCurrentPages();
-    }
-
-    /**
-     * 对于在repeat中的组件，index改变时需要修改对应的数据
-     */
-    $setIndex (index) {
-        if (this.$index === index)
-            return;
-
-        this.$index = index;
-
-        let props = this.props,
-            $parent = this.$parent;
-        let key, val, binded;
-        if (props) {
-            for (key in props) {
-                val = undefined;
-                if ($parent && $parent.$props && $parent.$props[this.$name]) {
-                    val = $parent.$props[this.$name][key];
-                    binded = $parent.$props[this.$name][`v-bind:${key}.once`] || $parent.$props[this.$name][`v-bind:${key}.sync`];
-                    if (binded) {
-                        if (typeof(binded) === 'object') {
-                            let bindfor = binded.for, binddata = $parent;
-                            bindfor.split('.').forEach(t => {
-                                binddata = binddata[t];
-                            });
-
-                            val = binddata[index];
-                            this.$index = index;
-                            this.data[key] = val;
-                            this[key] = val;
-                            this.$data[key] = util.$copy(this[key], true);
-                        }
-                    }
-                }
-            }
-            // Clear all childrens index;
-            for (key in this.$com) {
-                this.$com[key].$index = undefined;
-            }
-        }
-
-    }
-
-    $getComponent(com) {
-        if (typeof(com) === 'string') {
-            if (com.indexOf('/') === -1) {
-                return this.$com[com];
-            } else if (com === '/') {
-                return this.$parent;
-            } else {
-                let path = com.split('/');
-                path.forEach((s, i) => {
-                    if (i === 0) {
-                        if (s === '') {   //   /a/b/c
-                            com = this.$root;
-                        } else if (s === '.') {
-                            // ./a/b/c
-                            com = this;
-                        } else if (s === '..') {
-                            // ../a/b/c
-                            com = this.$parent;
-                        } else {
-                            com = this.$getComponent(s);
-                        }
-                    } else if (s) {
-                        com = com.$com[s];
-                    }
-                });
-            }
-        }
-        return (typeof(com) !== 'object') ? null : com;
-    }
-
-    $invoke (com, method, ...args) {
-        com = this.$getComponent(com);
-
-        if (!com) {
-            throw new Error('Invalid path: ' + com);
-        }
-
-        let fn = com.methods ? com.methods[method] : '';
-
-        if (typeof(fn) === 'function') {
-            let $evt = new event('', this, 'invoke');
-            let rst = fn.apply(com, args.concat($evt));
-            com.$apply();
-            return rst;
-        } else {
-            fn = com[method];
-        }
-
-        if (typeof(fn) === 'function') {
-            return fn.apply(com, args);
-        } else {
-            throw new Error('Invalid method: ' + method);
-        }
-    }
-
-    $broadcast (evtName, ...args) {
-        let com = this;
-        let $evt = typeof(evtName) === 'string' ? new event(evtName, this, 'broadcast') : $evt;
-        let queue = [com];
-
-        while(queue.length && $evt.active) {
-            let current = queue.shift();
-            for (let c in current.$com) {
-                c = current.$com[c];
-                queue.push(c);
-                let fn = getEventsFn(c, evtName);
-                if (fn) {
-                    c.$apply(() => {
-                        fn.apply(c, args.concat($evt));
-                    });
-                }
-                if (!$evt.active)
-                    break;
-            }
-        }
-    }
-
-    $emit (evtName, ...args) {
-        let com = this;
-        let source = this;
-        let $evt = new event(evtName, source, 'emit');
-
-        // User custom event;
-        if (this.$parent.$events && this.$parent.$events[this.$name]) {
-            let method = this.$parent.$events[this.$name]['v-on:' + evtName];
-            if (method && this.$parent.methods) {
-                let fn = this.$parent.methods[method];
-                if (typeof(fn) === 'function') {
-                    this.$parent.$apply(() => {
-                        fn.apply(this.$parent, args.concat($evt));
-                    });
-                    return;
-                } else {
-                    throw new Error(`Invalid method from emit, component is ${this.$parent.$name}, method is ${method}. Make sure you defined it already.\n`);
-                }
-            }
-        }
-        while(com && com.$isComponent !== undefined && $evt.active) {
-            // 保存 com 块级作用域组件实例
-            let comContext = com;
-            let fn = getEventsFn(comContext, evtName);
-            fn && comContext.$apply(() => {
-                fn.apply(comContext, args.concat($evt));
-            });
-            com = comContext.$parent;
-        }
-    }
-
-    $apply (fn) {
-        if (typeof(fn) === 'function') {
-            fn.call(this);
-            this.$apply();
-        } else {
-            if (this.$$phase) {
-                this.$$phase = '$apply';
-            } else {
-                this.$digest();
-            }
-        }
-    }
-
-    $digest () {
-        let k;
-        let originData = this.$data;
-        this.$$phase = '$digest';
-        while (this.$$phase) {
-            let readyToSet = {};
-            for (k in originData) {
-                if (!util.$isEqual(this[k], originData[k])) { // compare if new data is equal to original data
-                    // data watch trigger
-                    if (this.watch) {
-                        if (this.watch[k]) {
-                            if (typeof this.watch[k] === 'function') {
-                                this.watch[k].call(this, this[k], originData[k]);
-                            } else if (typeof this.watch[k] === 'string' && typeof this.methods[k] === 'function') {
-                                this.methods[k].call(this, this[k], originData[k]);
-                            }
-                        }
-                    }
-                    // Send to ReadyToSet
-                    readyToSet[this.$prefix + k] = this[k]; 
-                    this.data[k] = this[k];
-                    originData[k] = util.$copy(this[k], true);
-                    if (this.$mappingProps[k]) {
-                        Object.keys(this.$mappingProps[k]).forEach((changed) => {
-                            let mapping = this.$mappingProps[k][changed];
-                            if (typeof(mapping) === 'object') {
-                                this.$parent.$apply();
-                            } else if (changed === 'parent' && !util.$isEqual(this.$parent.$data[mapping], this[k])) {
-                                this.$parent[mapping] = this[k];
-                                this.$parent.data[mapping] = this[k];
-                                this.$parent.$apply();
-                            } else if (changed !== 'parent' && !util.$isEqual(this.$com[changed].$data[mapping], this[k])) {
-                                this.$com[changed][mapping] = this[k];
-                                this.$com[changed].data[mapping] = this[k];
-                                this.$com[changed].$apply();
-                            }
-                        });
-                    }
-                }
-            }
-            if (Object.keys(readyToSet).length) {
-                if (this.computed) {
-                    for (k in this.computed) { // If there are computed property, calculated every times
-                        let fn = this.computed[k], val = fn.call(this);
-                        if (!util.$isEqual(this[k], val)) { // Value changed, then send to ReadyToSet
-                            readyToSet[this.$prefix + k] = val;
-                            this[k] = util.$copy(val, true);
-                        }
-                    }
-                }
-                this.setData(readyToSet);
-            }
-            this.$$phase = (this.$$phase === '$apply') ? '$digest' : false;
-        }
-    }
-
-}
-
-function getEventsFn (comContext, evtName) {
-    let fn = comContext.events ? comContext.events[evtName] : undefined;
-    const typeFn = typeof(fn);
-    let fnFn;
-    if (typeFn === 'string') {
-        // 如果 events[k] 是 string 类型 则认为是调用 methods 上方法
-        const method = comContext.methods && comContext.methods[fn];
-        if (typeof(method) === 'function') {
-            fnFn = method;
-        }
-    } else if (typeFn === 'function') {
-        fnFn = fn;
-    }
-    return fnFn;
-}
\ No newline at end of file
diff --git a/packages/wepy-ant/src/event.js b/packages/wepy-ant/src/event.js
deleted file mode 100644
index f159072f9..000000000
--- a/packages/wepy-ant/src/event.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-export default class {
-
-    active = true;
-
-    constructor (name, source, type) {
-
-        this.name = name;
-        this.source = source;
-        this.type = type;
-    }
-
-    $destroy () {
-        this.active = false;
-    }
-
-    $transfor(wxevent) {
-        let k = 0;
-        for (k in wxevent) {
-            this[k] = wxevent[k];
-        }
-    }
-}
diff --git a/packages/wepy-ant/src/mixin.js b/packages/wepy-ant/src/mixin.js
deleted file mode 100644
index 33480d64e..000000000
--- a/packages/wepy-ant/src/mixin.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-export default class {
-
-    data = {};
-
-    components = {};
-
-    methods = {};
-
-    events = {};
-
-    $init (parent) {
-        let k;
-
-        // 自定义属性覆盖
-        Object.getOwnPropertyNames(this)
-            .concat(Object.getOwnPropertyNames(Object.getPrototypeOf(this)))
-            .forEach((k) => {
-                if (k[0] + k[1] !== 'on' && k !== 'constructor') {
-                    if (!parent[k])
-                        parent[k] = this[k];
-                }
-        });
-
-
-        // 数据，事件，组件覆盖
-        ['data', 'events', 'components'].forEach((item) => {
-            Object.getOwnPropertyNames(this[item]).forEach((k) => {
-                if (k !== 'init' && !parent[item][k])
-                    parent[item][k] = this[item][k];
-            });
-        });
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy-ant/src/native.js b/packages/wepy-ant/src/native.js
deleted file mode 100644
index dbdb557d2..000000000
--- a/packages/wepy-ant/src/native.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-export default {
-};
-
-
diff --git a/packages/wepy-ant/src/page.js b/packages/wepy-ant/src/page.js
deleted file mode 100644
index e69baf1cf..000000000
--- a/packages/wepy-ant/src/page.js
+++ /dev/null
@@ -1,107 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import native from './native';
-import component from './component';
-import util from './util';
-
-export default class extends component {
-
-    $isComponent = false;
-
-
-    $preloadData = {};
-
-    $prefetchData = {};
-
-    $init (wxpage, $parent) {
-
-        this.$parent = $parent;
-        this.$root = this;
-        if (!$parent.$wxapp) {
-            $parent.$wxapp = getApp();
-        }
-        this.$wxapp = $parent.$wxapp;
-        super.$init(wxpage, this);
-    }
-
-    onLoad () {
-        super.onLoad();
-    }
-
-    $preload(key, data) {
-        if (typeof(key) === 'object') {
-            let k;
-            for (k in key) {
-                this.$preload(k, key[k]);
-            }
-        } else {
-            this.$preloadData[key] = data;
-        }
-    }
-
-    $route(type, url, params = {}) {
-        if (typeof(url) === 'string') {
-            let s = url + '?';
-            if (params) {
-                let k;
-                for (k in params) {
-                    s += `${k}=${params[k]}&`
-                }
-            }
-            s = s.substring(0, s.length - 1);
-            url = {url: s};
-        } else {
-            params = util.$getParams(url.url);
-        }
-        // __route__ will be undefined if it called from onLoad
-        if (!this.$parent.__route__) {
-            this.$parent.__route__ = getCurrentPages()[0].route;
-        }
-        let absoluteRoute = this.$parent.__route__[0] !== '/' ? ('/' + this.$parent.__route__) : this.$parent.__route__;
-        let realPath = util.$resolvePath(absoluteRoute, url.url.split('?')[0]);
-        let goTo = this.$parent.$pages[realPath];
-        if (goTo && goTo.onPrefetch) {
-            let prevPage = this.$parent.__prevPage__;
-            let preloadData = {};
-            if (prevPage && Object.keys(prevPage.$preloadData).length > 0) {
-                preloadData = prevPage.$preloadData;
-            }
-            goTo.$prefetchData = goTo.onPrefetch(params, {from: this, preload: preloadData});
-        }
-        return native[type](url);
-    }
-
-    $redirect(url, params) {
-        return this.$route('redirectTo', url, params);
-    }
-
-    $navigate(url, params) {
-        return this.$route('navigateTo', url, params);
-    }
-
-    $switch(url) {
-        if (typeof(url) === 'string')
-            url = {url: url};
-
-        return native.switchTab(url);
-    }
-
-    $back(delta) {
-        let p = delta || {};
-        if (typeof(p) === 'number')
-            p = {delta: p};
-
-        if (!p.delta)
-            p.delta = 1;
-
-        return native.navigateBack(p);
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy-ant/src/util.js b/packages/wepy-ant/src/util.js
deleted file mode 100644
index 45a008147..000000000
--- a/packages/wepy-ant/src/util.js
+++ /dev/null
@@ -1,308 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-export default {
-    $isEmpty (obj) {
-        return Object.keys(obj).length === 0;
-    },
-
-    $isEqual (a, b, aStack, bStack) {
-        // Identical objects are equal. `0 === -0`, but they aren't identical.
-        // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
-        if (a === b) return a !== 0 || 1 / a === 1 / b;
-        // `NaN`s are equivalent, but non-reflexive.
-        if (a !== a) return b !== b;
-        // A strict comparison is necessary because `null == undefined`.
-        if (!a || !b) return a === b;
-        // Exhaust primitive checks
-        var type = typeof a;
-        if (type !== 'function' && type !== 'object' && typeof b !== 'object') return false;
-        return this.$isDeepEqual(a, b, aStack, bStack);
-    },
-
-    $isDeepEqual (a, b, aStack, bStack) {
-        let self = this;
-        // Compare `[[Class]]` names.
-        var className = toString.call(a);
-        if (className !== toString.call(b)) return false;
-        switch (className) {
-          // Strings, numbers, regular expressions, dates, and booleans are compared by value.
-          case '[object RegExp]':
-          // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
-          case '[object String]':
-            // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
-            // equivalent to `new String("5")`.
-            return '' + a === '' + b;
-          case '[object Number]':
-            // `NaN`s are equivalent, but non-reflexive.
-            // Object(NaN) is equivalent to NaN.
-            if (+a !== +a) return +b !== +b;
-            // An `egal` comparison is performed for other numeric values.
-            return +a === 0 ? 1 / +a === 1 / b : +a === +b;
-          case '[object Date]':
-          case '[object Boolean]':
-            // Coerce dates and booleans to numeric primitive values. Dates are compared by their
-            // millisecond representations. Note that invalid dates with millisecond representations
-            // of `NaN` are not equivalent.
-            return +a === +b;
-          case '[object Symbol]':
-            var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
-            return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
-        }
-
-        var areArrays = className === '[object Array]';
-        if (!areArrays) {
-          if (typeof a !== 'object' || typeof b !== 'object') return a === b;
-
-          // Objects with different constructors are not equivalent, but `Object`s or `Array`s
-          // from different frames are.
-          var aCtor = a.constructor, bCtor = b.constructor;
-          if (aCtor !== bCtor && !(typeof aCtor === 'function' && aCtor instanceof aCtor &&
-                                   typeof bCtor === 'function' && bCtor instanceof bCtor)
-                              && ('constructor' in a && 'constructor' in b)) {
-            return false;
-          }
-        }
-        // Assume equality for cyclic structures. The algorithm for detecting cyclic
-        // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
-
-        // Initializing stack of traversed objects.
-        // It's done here since we only need them for objects and arrays comparison.
-        aStack = aStack || [];
-        bStack = bStack || [];
-        var length = aStack.length;
-        while (length--) {
-          // Linear search. Performance is inversely proportional to the number of
-          // unique nested structures.
-          if (aStack[length] === a) return bStack[length] === b;
-        }
-
-        // Add the first object to the stack of traversed objects.
-        aStack.push(a);
-        bStack.push(b);
-
-        // Recursively compare objects and arrays.
-        if (areArrays) {
-          // Compare array lengths to determine if a deep comparison is necessary.
-          length = a.length;
-          if (length !== b.length) return false;
-          // Deep compare the contents, ignoring non-numeric properties.
-          while (length--) {
-            if (!self.$isEqual(a[length], b[length], aStack, bStack)) return false;
-          }
-        } else {
-          // Deep compare objects.
-          var keys = Object.keys(a), key;
-          length = keys.length;
-          // Ensure that both objects contain the same number of properties before comparing deep equality.
-          if (Object.keys(b).length !== length) return false;
-          while (length--) {
-            // Deep compare each member
-            key = keys[length];
-            if (!(self.$has(b, key) && self.$isEqual(a[key], b[key], aStack, bStack))) return false;
-          }
-        }
-        // Remove the first object from the stack of traversed objects.
-        aStack.pop();
-        bStack.pop();
-        return true;
-    },
-
-    $has (obj, path) {
-        if (toString.call(path) !== '[object Array]') {
-            return obj && hasOwnProperty.call(obj, path);
-        }
-        var length = path.length;
-        for (var i = 0; i < length; i++) {
-            var key = path[i];
-            if (!obj || !hasOwnProperty.call(obj, key)) {
-                return false;
-            }
-            obj = obj[key];
-        }
-        return !!length;
-    },
-
-    $extend () {
-        var options, name, src, copy, copyIsArray, clone,
-        target = arguments[ 0 ] || {},
-        i = 1,
-        length = arguments.length,
-        deep = false;
-        var self = this;
-
-        // Handle a deep copy situation
-        if ( typeof target === 'boolean' ) {
-            deep = target;
-
-            // Skip the boolean and the target
-            target = arguments[ i ] || {};
-            i++;
-        }
-
-        // Handle case when target is a string or something (possible in deep copy)
-        if ( typeof target !== 'object' && !(typeof(target) === 'function') ) {
-            target = {};
-        }
-
-        // Extend jQuery itself if only one argument is passed
-        if ( i === length ) {
-            target = this;
-            i--;
-        }
-
-        for ( ; i < length; i++ ) {
-
-            // Only deal with non-null/undefined values
-            if ( ( options = arguments[ i ] ) ) {
-
-                // Extend the base object
-                for ( name in options ) {
-                    src = target[ name ];
-                    copy = options[ name ];
-
-                    // Prevent never-ending loop
-                    if ( target === copy ) {
-                        continue;
-                    }
-
-                    // Recurse if we're merging plain objects or arrays
-                    if ( deep && copy && ( self.$isPlainObject( copy ) ||
-                        ( copyIsArray = Array.isArray( copy ) ) ) ) {
-
-                        if ( copyIsArray ) {
-                            copyIsArray = false;
-                            clone = src && Array.isArray( src ) ? src : [];
-
-                        } else {
-                            clone = src && self.$isPlainObject( src ) ? src : {};
-                        }
-
-                        // Never move original objects, clone them
-                        target[ name ] = self.$extend( deep, clone, copy );
-
-                    // Don't bring in undefined values => bring undefined values
-                    } else {
-                        target[ name ] = copy;
-                    }
-                }
-            }
-        }
-
-        // Return the modified object
-        return target;
-    },
-
-    $copy (obj, deep = false) {
-        if (Array.isArray(obj)) {
-            return this.$extend(deep, [], obj);
-        } else if ('' + obj === 'null') {
-            return obj;
-        } else if (typeof (obj) === 'object') {
-            return this.$extend(deep, {}, obj);
-        } else
-            return obj;
-    },
-
-    $isPlainObject (obj) {
-        var proto, Ctor;
-
-        // Detect obvious negatives
-        // Use toString instead of jQuery.type to catch host objects
-        if ( !obj || Object.prototype.toString.call( obj ) !== '[object Object]' ) {
-            return false;
-        }
-
-        proto = Object.getPrototypeOf( obj );
-
-        // Objects with no prototype (e.g., `Object.create( null )`) are plain
-        if ( !proto ) {
-            return true;
-        }
-
-        // Objects with prototype are plain iff they were constructed by a global Object function
-        Ctor = Object.prototype.hasOwnProperty.call( proto, 'constructor' ) && proto.constructor;
-        return typeof Ctor === 'function' && Object.prototype.hasOwnProperty.toString.call( Ctor ) === Object.prototype.hasOwnProperty.toString.call(Object);
-    },
-
-    /**
-     * resolve path
-     * @param  {[string]} route ['/page/index']
-     * @param  {[string]} url   ['./page2']
-     * @return {[string]}       ['/page/page2']
-     */
-    $resolvePath (route, url) {
-        if (!url)
-            return route;
-        if (url[0] === '/') { // /index
-            url = url.substr(1);
-            return this.$resolvePath('', url);
-        }
-        if (url[0] !== '.') { // index
-            return this.$resolvePath(route, './' + url);
-        }
-        let current = route.split('/');
-        if (url[0] === '.' && url[1] === '/') { // ./index
-            url = url.substr(2);
-            if (url[0] !== '.') {
-                if (current.length)
-                    current[current.length - 1] = url;
-                else
-                    current = [url];
-                return current.length === 1 ? ('/' + current[0]) : current.join('/');
-            }
-            return this.$resolvePath(current.join('/'), url);
-        }
-        if (url[0] === '.' && url[1] === '.' && url[2] === '/') { // ../index || ....../index || ../../../index
-            url = url.replace(/^\.*/ig, '');
-            current.pop();
-            return this.$resolvePath(current.join('/'), '.' + url);
-        }
-        if (url[0] === '.') {
-            return this.$resolvePath(route, url.substr(1));
-        }
-    },
-    /**
-     * get url params
-     * @param  {String} url index?a=1&b=2
-     * @return {Object}     {a:1,b:2}
-     */
-    $getParams (url) {
-        let rst = {};
-        let quoteIndex = url.indexOf('?');
-
-        if (quoteIndex !== -1) {
-            let str = url.substr(quoteIndex + 1);
-            let tmp;
-            str.split('&').forEach(v => {
-                tmp = v.split('=');
-                rst[tmp[0]] = decodeURIComponent(tmp[1]);
-            });
-       }
-       return rst;
-    },
-    /**
-    * Hyphenate a camelCase string.
-    */
-    hyphenate (str) {
-        return str
-            .replace(/([^-])([A-Z])/g, '$1-$2')
-            .replace(/([^-])([A-Z])/g, '$1-$2')
-            .toLowerCase();
-    },
-    /**
-     * Camelize a hyphen-delimited string.
-     */
-    camelize (str) {
-        return str.replace(/-(\w)/g, (_, c) => c ? c.toUpperCase() : '');
-    }
-};
-
-
diff --git a/packages/wepy-ant/src/wepy.js b/packages/wepy-ant/src/wepy.js
deleted file mode 100644
index e87bf3b7b..000000000
--- a/packages/wepy-ant/src/wepy.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-// Hats off to the Alibaba Mini Program engineers.
-import app from './app';
-import page from './page';
-import component from './component';
-import event from './event';
-import base from './base';
-import util from './util';
-import mixin from './mixin';
-
-
-export default {
-    event: event,
-    app: app,
-    component: component,
-    page: page,
-    mixin: mixin,
-
-    $createApp: base.$createApp,
-    $createPage: base.$createPage,
-
-    $isEmpty: util.$isEmpty,
-    $isEqual: util.$isEqual,
-    $isDeepEqual: util.$isDeepEqual,
-    $has: util.$has,
-    $extend: util.$extend,
-    $isPlainObject: util.$isPlainObject,
-    $copy: util.$copy,
-};
-
-
diff --git a/packages/wepy-async-function/.npmignore b/packages/wepy-async-function/.npmignore
deleted file mode 100644
index 0339c5399..000000000
--- a/packages/wepy-async-function/.npmignore
+++ /dev/null
@@ -1,4 +0,0 @@
-src
-test
-node_modules
-npm-debug.log
\ No newline at end of file
diff --git a/packages/wepy-async-function/README.md b/packages/wepy-async-function/README.md
deleted file mode 100644
index bf0299836..000000000
--- a/packages/wepy-async-function/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# wepy 中使用async/await
-
-## 安装
-
-```
-npm install wepy-async-function --save
-```
-
-## 引用
-
-```
-// app.wpy
-import wepy from 'wepy';
-
-import 'wepy-async-function';
-```
-
-## 配置`wepy.config.js`编译器
-
-```
-module.exports = {
-    'compilers': {
-        babel: {
-            'presets': [
-                'es2015',
-                'stage-1'
-            ],
-            'plugins': [
-                'transform-export-extensions',
-                'syntax-export-extensions'
-            ]
-        }
-    }
-};
-```
-
diff --git a/packages/wepy-async-function/global.js b/packages/wepy-async-function/global.js
deleted file mode 100644
index 04f0cd192..000000000
--- a/packages/wepy-async-function/global.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-var global = module.exports = typeof window !== 'undefined' && window.Math === Math
-  ? window : typeof self !== 'undefined' && self.Math === Math ? self : this;
diff --git a/packages/wepy-async-function/index.js b/packages/wepy-async-function/index.js
deleted file mode 100644
index 464106e60..000000000
--- a/packages/wepy-async-function/index.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-var g = require('./global');
-
-// IOS 10.0.1 may cause IOS crash.
-g.Promise = require('promise-polyfill');
-g.regeneratorRuntime = require('regenerator-runtime/runtime');
-
diff --git a/packages/wepy-async-function/package.json b/packages/wepy-async-function/package.json
deleted file mode 100644
index ddce0d1ce..000000000
--- a/packages/wepy-async-function/package.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-  "name": "wepy-async-function",
-  "version": "1.4.4",
-  "description": "wepy async function support",
-  "main": "index.js",
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "keywords": [
-    "async",
-    "await",
-    "promise"
-  ],
-  "author": "Gcaufy",
-  "license": "MIT",
-  "dependencies": {
-    "promise-polyfill": "^6.0.2",
-    "regenerator-runtime": "^0.10.3"
-  }
-}
diff --git a/packages/wepy-cli/bin/wepy.js b/packages/wepy-cli/bin/wepy.js
deleted file mode 100755
index 2c94a6cd4..000000000
--- a/packages/wepy-cli/bin/wepy.js
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env node
-
-require('../lib/wepy');
diff --git a/packages/wepy-cli/package-lock.json b/packages/wepy-cli/package-lock.json
deleted file mode 100644
index 273084fd8..000000000
--- a/packages/wepy-cli/package-lock.json
+++ /dev/null
@@ -1,2889 +0,0 @@
-{
-  "name": "wepy-cli",
-  "version": "1.5.9-0",
-  "lockfileVersion": 1,
-  "requires": true,
-  "dependencies": {
-    "ansi-align": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/ansi-align/download/ansi-align-1.1.0.tgz",
-      "integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=",
-      "requires": {
-        "string-width": "1.0.2"
-      }
-    },
-    "ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
-    },
-    "ansi-styles": {
-      "version": "2.2.1",
-      "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz",
-      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
-    },
-    "anymatch": {
-      "version": "1.3.2",
-      "resolved": "http://registry.npm.taobao.org/anymatch/download/anymatch-1.3.2.tgz",
-      "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=",
-      "requires": {
-        "micromatch": "2.3.11",
-        "normalize-path": "2.1.1"
-      }
-    },
-    "arr-diff": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/arr-diff/download/arr-diff-2.0.0.tgz",
-      "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
-      "requires": {
-        "arr-flatten": "1.1.0"
-      }
-    },
-    "arr-flatten": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz",
-      "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE="
-    },
-    "array-unique": {
-      "version": "0.2.1",
-      "resolved": "http://registry.npm.taobao.org/array-unique/download/array-unique-0.2.1.tgz",
-      "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM="
-    },
-    "async-each": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/async-each/download/async-each-1.0.1.tgz",
-      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0="
-    },
-    "babel": {
-      "version": "6.23.0",
-      "resolved": "http://registry.npm.taobao.org/babel/download/babel-6.23.0.tgz",
-      "integrity": "sha1-0NHn2APpdHZb7qMjLU4VPA77kPQ=",
-      "dev": true
-    },
-    "babel-cli": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-cli/download/babel-cli-6.26.0.tgz",
-      "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=",
-      "dev": true,
-      "requires": {
-        "babel-core": "6.26.0",
-        "babel-polyfill": "6.26.0",
-        "babel-register": "6.26.0",
-        "babel-runtime": "6.26.0",
-        "chokidar": "1.7.0",
-        "commander": "2.11.0",
-        "convert-source-map": "1.5.0",
-        "fs-readdir-recursive": "1.0.0",
-        "glob": "7.1.2",
-        "lodash": "4.17.4",
-        "output-file-sync": "1.1.2",
-        "path-is-absolute": "1.0.1",
-        "slash": "1.0.0",
-        "source-map": "0.5.7",
-        "v8flags": "2.1.1"
-      }
-    },
-    "babel-code-frame": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-code-frame/download/babel-code-frame-6.26.0.tgz",
-      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
-      "dev": true,
-      "requires": {
-        "chalk": "1.1.3",
-        "esutils": "2.0.2",
-        "js-tokens": "3.0.2"
-      }
-    },
-    "babel-core": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-core/download/babel-core-6.26.0.tgz",
-      "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=",
-      "dev": true,
-      "requires": {
-        "babel-code-frame": "6.26.0",
-        "babel-generator": "6.26.0",
-        "babel-helpers": "6.24.1",
-        "babel-messages": "6.23.0",
-        "babel-register": "6.26.0",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0",
-        "babylon": "6.18.0",
-        "convert-source-map": "1.5.0",
-        "debug": "2.6.8",
-        "json5": "0.5.1",
-        "lodash": "4.17.4",
-        "minimatch": "3.0.4",
-        "path-is-absolute": "1.0.1",
-        "private": "0.1.7",
-        "slash": "1.0.0",
-        "source-map": "0.5.7"
-      }
-    },
-    "babel-generator": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-generator/download/babel-generator-6.26.0.tgz",
-      "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=",
-      "dev": true,
-      "requires": {
-        "babel-messages": "6.23.0",
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0",
-        "detect-indent": "4.0.0",
-        "jsesc": "1.3.0",
-        "lodash": "4.17.4",
-        "source-map": "0.5.7",
-        "trim-right": "1.0.1"
-      }
-    },
-    "babel-helper-bindify-decorators": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-bindify-decorators/download/babel-helper-bindify-decorators-6.24.1.tgz",
-      "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-helper-builder-binary-assignment-operator-visitor": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-builder-binary-assignment-operator-visitor/download/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
-      "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
-      "dev": true,
-      "requires": {
-        "babel-helper-explode-assignable-expression": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-helper-call-delegate": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-call-delegate/download/babel-helper-call-delegate-6.24.1.tgz",
-      "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
-      "dev": true,
-      "requires": {
-        "babel-helper-hoist-variables": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-helper-define-map": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-define-map/download/babel-helper-define-map-6.26.0.tgz",
-      "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
-      "dev": true,
-      "requires": {
-        "babel-helper-function-name": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0",
-        "lodash": "4.17.4"
-      }
-    },
-    "babel-helper-explode-assignable-expression": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-explode-assignable-expression/download/babel-helper-explode-assignable-expression-6.24.1.tgz",
-      "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-helper-explode-class": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-explode-class/download/babel-helper-explode-class-6.24.1.tgz",
-      "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=",
-      "dev": true,
-      "requires": {
-        "babel-helper-bindify-decorators": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-helper-function-name": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-function-name/download/babel-helper-function-name-6.24.1.tgz",
-      "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
-      "dev": true,
-      "requires": {
-        "babel-helper-get-function-arity": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-helper-get-function-arity": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-get-function-arity/download/babel-helper-get-function-arity-6.24.1.tgz",
-      "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-helper-hoist-variables": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-hoist-variables/download/babel-helper-hoist-variables-6.24.1.tgz",
-      "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-helper-optimise-call-expression": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-optimise-call-expression/download/babel-helper-optimise-call-expression-6.24.1.tgz",
-      "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-helper-regex": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-regex/download/babel-helper-regex-6.26.0.tgz",
-      "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0",
-        "lodash": "4.17.4"
-      }
-    },
-    "babel-helper-remap-async-to-generator": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-remap-async-to-generator/download/babel-helper-remap-async-to-generator-6.24.1.tgz",
-      "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
-      "dev": true,
-      "requires": {
-        "babel-helper-function-name": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-helper-replace-supers": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helper-replace-supers/download/babel-helper-replace-supers-6.24.1.tgz",
-      "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
-      "dev": true,
-      "requires": {
-        "babel-helper-optimise-call-expression": "6.24.1",
-        "babel-messages": "6.23.0",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-helpers": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-helpers/download/babel-helpers-6.24.1.tgz",
-      "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0"
-      }
-    },
-    "babel-messages": {
-      "version": "6.23.0",
-      "resolved": "http://registry.npm.taobao.org/babel-messages/download/babel-messages-6.23.0.tgz",
-      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0"
-      }
-    },
-    "babel-plugin-check-es2015-constants": {
-      "version": "6.22.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-check-es2015-constants/download/babel-plugin-check-es2015-constants-6.22.0.tgz",
-      "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0"
-      }
-    },
-    "babel-plugin-syntax-async-functions": {
-      "version": "6.13.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-async-functions/download/babel-plugin-syntax-async-functions-6.13.0.tgz",
-      "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
-      "dev": true
-    },
-    "babel-plugin-syntax-async-generators": {
-      "version": "6.13.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-async-generators/download/babel-plugin-syntax-async-generators-6.13.0.tgz",
-      "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=",
-      "dev": true
-    },
-    "babel-plugin-syntax-class-constructor-call": {
-      "version": "6.18.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-class-constructor-call/download/babel-plugin-syntax-class-constructor-call-6.18.0.tgz",
-      "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=",
-      "dev": true
-    },
-    "babel-plugin-syntax-class-properties": {
-      "version": "6.13.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-class-properties/download/babel-plugin-syntax-class-properties-6.13.0.tgz",
-      "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=",
-      "dev": true
-    },
-    "babel-plugin-syntax-decorators": {
-      "version": "6.13.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-decorators/download/babel-plugin-syntax-decorators-6.13.0.tgz",
-      "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=",
-      "dev": true
-    },
-    "babel-plugin-syntax-dynamic-import": {
-      "version": "6.18.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-dynamic-import/download/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
-      "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=",
-      "dev": true
-    },
-    "babel-plugin-syntax-exponentiation-operator": {
-      "version": "6.13.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-exponentiation-operator/download/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
-      "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
-      "dev": true
-    },
-    "babel-plugin-syntax-export-extensions": {
-      "version": "6.13.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-export-extensions/download/babel-plugin-syntax-export-extensions-6.13.0.tgz",
-      "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=",
-      "dev": true
-    },
-    "babel-plugin-syntax-object-rest-spread": {
-      "version": "6.13.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-object-rest-spread/download/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
-      "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
-      "dev": true
-    },
-    "babel-plugin-syntax-trailing-function-commas": {
-      "version": "6.22.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-trailing-function-commas/download/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
-      "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
-      "dev": true
-    },
-    "babel-plugin-transform-async-generator-functions": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-async-generator-functions/download/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
-      "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
-      "dev": true,
-      "requires": {
-        "babel-helper-remap-async-to-generator": "6.24.1",
-        "babel-plugin-syntax-async-generators": "6.13.0",
-        "babel-runtime": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-async-to-generator": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-async-to-generator/download/babel-plugin-transform-async-to-generator-6.24.1.tgz",
-      "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
-      "dev": true,
-      "requires": {
-        "babel-helper-remap-async-to-generator": "6.24.1",
-        "babel-plugin-syntax-async-functions": "6.13.0",
-        "babel-runtime": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-class-constructor-call": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-class-constructor-call/download/babel-plugin-transform-class-constructor-call-6.24.1.tgz",
-      "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=",
-      "dev": true,
-      "requires": {
-        "babel-plugin-syntax-class-constructor-call": "6.18.0",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-class-properties": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-class-properties/download/babel-plugin-transform-class-properties-6.24.1.tgz",
-      "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=",
-      "dev": true,
-      "requires": {
-        "babel-helper-function-name": "6.24.1",
-        "babel-plugin-syntax-class-properties": "6.13.0",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-decorators": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-decorators/download/babel-plugin-transform-decorators-6.24.1.tgz",
-      "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=",
-      "dev": true,
-      "requires": {
-        "babel-helper-explode-class": "6.24.1",
-        "babel-plugin-syntax-decorators": "6.13.0",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-arrow-functions": {
-      "version": "6.22.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-arrow-functions/download/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
-      "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-block-scoped-functions": {
-      "version": "6.22.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-block-scoped-functions/download/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
-      "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-block-scoping": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-block-scoping/download/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
-      "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0",
-        "lodash": "4.17.4"
-      }
-    },
-    "babel-plugin-transform-es2015-classes": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-classes/download/babel-plugin-transform-es2015-classes-6.24.1.tgz",
-      "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
-      "dev": true,
-      "requires": {
-        "babel-helper-define-map": "6.26.0",
-        "babel-helper-function-name": "6.24.1",
-        "babel-helper-optimise-call-expression": "6.24.1",
-        "babel-helper-replace-supers": "6.24.1",
-        "babel-messages": "6.23.0",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-computed-properties": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-computed-properties/download/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
-      "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-destructuring": {
-      "version": "6.23.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-destructuring/download/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
-      "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-duplicate-keys": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-duplicate-keys/download/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
-      "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-for-of": {
-      "version": "6.23.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-for-of/download/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
-      "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-function-name": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-function-name/download/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
-      "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
-      "dev": true,
-      "requires": {
-        "babel-helper-function-name": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-literals": {
-      "version": "6.22.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-literals/download/babel-plugin-transform-es2015-literals-6.22.0.tgz",
-      "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-modules-amd": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-amd/download/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
-      "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
-      "dev": true,
-      "requires": {
-        "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-modules-commonjs": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-commonjs/download/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz",
-      "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=",
-      "dev": true,
-      "requires": {
-        "babel-plugin-transform-strict-mode": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-modules-systemjs": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-systemjs/download/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
-      "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
-      "dev": true,
-      "requires": {
-        "babel-helper-hoist-variables": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-modules-umd": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-umd/download/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
-      "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
-      "dev": true,
-      "requires": {
-        "babel-plugin-transform-es2015-modules-amd": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-object-super": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-object-super/download/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
-      "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
-      "dev": true,
-      "requires": {
-        "babel-helper-replace-supers": "6.24.1",
-        "babel-runtime": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-parameters": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-parameters/download/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
-      "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
-      "dev": true,
-      "requires": {
-        "babel-helper-call-delegate": "6.24.1",
-        "babel-helper-get-function-arity": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-shorthand-properties": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-shorthand-properties/download/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
-      "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-spread": {
-      "version": "6.22.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-spread/download/babel-plugin-transform-es2015-spread-6.22.0.tgz",
-      "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-sticky-regex": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-sticky-regex/download/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
-      "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
-      "dev": true,
-      "requires": {
-        "babel-helper-regex": "6.26.0",
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-template-literals": {
-      "version": "6.22.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-template-literals/download/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
-      "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-typeof-symbol": {
-      "version": "6.23.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-typeof-symbol/download/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
-      "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-unicode-regex": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-unicode-regex/download/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
-      "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
-      "dev": true,
-      "requires": {
-        "babel-helper-regex": "6.26.0",
-        "babel-runtime": "6.26.0",
-        "regexpu-core": "2.0.0"
-      }
-    },
-    "babel-plugin-transform-exponentiation-operator": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-exponentiation-operator/download/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
-      "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
-      "dev": true,
-      "requires": {
-        "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1",
-        "babel-plugin-syntax-exponentiation-operator": "6.13.0",
-        "babel-runtime": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-export-extensions": {
-      "version": "6.22.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-export-extensions/download/babel-plugin-transform-export-extensions-6.22.0.tgz",
-      "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=",
-      "dev": true,
-      "requires": {
-        "babel-plugin-syntax-export-extensions": "6.13.0",
-        "babel-runtime": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-object-rest-spread": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-object-rest-spread/download/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
-      "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
-      "dev": true,
-      "requires": {
-        "babel-plugin-syntax-object-rest-spread": "6.13.0",
-        "babel-runtime": "6.26.0"
-      }
-    },
-    "babel-plugin-transform-regenerator": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-regenerator/download/babel-plugin-transform-regenerator-6.26.0.tgz",
-      "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
-      "dev": true,
-      "requires": {
-        "regenerator-transform": "0.10.1"
-      }
-    },
-    "babel-plugin-transform-strict-mode": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-strict-mode/download/babel-plugin-transform-strict-mode-6.24.1.tgz",
-      "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
-      }
-    },
-    "babel-polyfill": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-polyfill/download/babel-polyfill-6.26.0.tgz",
-      "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0",
-        "core-js": "2.5.1",
-        "regenerator-runtime": "0.10.5"
-      },
-      "dependencies": {
-        "regenerator-runtime": {
-          "version": "0.10.5",
-          "resolved": "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.10.5.tgz",
-          "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
-          "dev": true
-        }
-      }
-    },
-    "babel-preset-es2015": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-preset-es2015/download/babel-preset-es2015-6.24.1.tgz",
-      "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=",
-      "dev": true,
-      "requires": {
-        "babel-plugin-check-es2015-constants": "6.22.0",
-        "babel-plugin-transform-es2015-arrow-functions": "6.22.0",
-        "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
-        "babel-plugin-transform-es2015-block-scoping": "6.26.0",
-        "babel-plugin-transform-es2015-classes": "6.24.1",
-        "babel-plugin-transform-es2015-computed-properties": "6.24.1",
-        "babel-plugin-transform-es2015-destructuring": "6.23.0",
-        "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
-        "babel-plugin-transform-es2015-for-of": "6.23.0",
-        "babel-plugin-transform-es2015-function-name": "6.24.1",
-        "babel-plugin-transform-es2015-literals": "6.22.0",
-        "babel-plugin-transform-es2015-modules-amd": "6.24.1",
-        "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
-        "babel-plugin-transform-es2015-modules-systemjs": "6.24.1",
-        "babel-plugin-transform-es2015-modules-umd": "6.24.1",
-        "babel-plugin-transform-es2015-object-super": "6.24.1",
-        "babel-plugin-transform-es2015-parameters": "6.24.1",
-        "babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
-        "babel-plugin-transform-es2015-spread": "6.22.0",
-        "babel-plugin-transform-es2015-sticky-regex": "6.24.1",
-        "babel-plugin-transform-es2015-template-literals": "6.22.0",
-        "babel-plugin-transform-es2015-typeof-symbol": "6.23.0",
-        "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
-        "babel-plugin-transform-regenerator": "6.26.0"
-      }
-    },
-    "babel-preset-stage-1": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-preset-stage-1/download/babel-preset-stage-1-6.24.1.tgz",
-      "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=",
-      "dev": true,
-      "requires": {
-        "babel-plugin-transform-class-constructor-call": "6.24.1",
-        "babel-plugin-transform-export-extensions": "6.22.0",
-        "babel-preset-stage-2": "6.24.1"
-      }
-    },
-    "babel-preset-stage-2": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-preset-stage-2/download/babel-preset-stage-2-6.24.1.tgz",
-      "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=",
-      "dev": true,
-      "requires": {
-        "babel-plugin-syntax-dynamic-import": "6.18.0",
-        "babel-plugin-transform-class-properties": "6.24.1",
-        "babel-plugin-transform-decorators": "6.24.1",
-        "babel-preset-stage-3": "6.24.1"
-      }
-    },
-    "babel-preset-stage-3": {
-      "version": "6.24.1",
-      "resolved": "http://registry.npm.taobao.org/babel-preset-stage-3/download/babel-preset-stage-3-6.24.1.tgz",
-      "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=",
-      "dev": true,
-      "requires": {
-        "babel-plugin-syntax-trailing-function-commas": "6.22.0",
-        "babel-plugin-transform-async-generator-functions": "6.24.1",
-        "babel-plugin-transform-async-to-generator": "6.24.1",
-        "babel-plugin-transform-exponentiation-operator": "6.24.1",
-        "babel-plugin-transform-object-rest-spread": "6.26.0"
-      }
-    },
-    "babel-register": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-register/download/babel-register-6.26.0.tgz",
-      "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
-      "dev": true,
-      "requires": {
-        "babel-core": "6.26.0",
-        "babel-runtime": "6.26.0",
-        "core-js": "2.5.1",
-        "home-or-tmp": "2.0.0",
-        "lodash": "4.17.4",
-        "mkdirp": "0.5.1",
-        "source-map-support": "0.4.18"
-      }
-    },
-    "babel-runtime": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz",
-      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
-      "dev": true,
-      "requires": {
-        "core-js": "2.5.1",
-        "regenerator-runtime": "0.11.0"
-      }
-    },
-    "babel-template": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-template/download/babel-template-6.26.0.tgz",
-      "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-traverse": "6.26.0",
-        "babel-types": "6.26.0",
-        "babylon": "6.18.0",
-        "lodash": "4.17.4"
-      }
-    },
-    "babel-traverse": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-traverse/download/babel-traverse-6.26.0.tgz",
-      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
-      "dev": true,
-      "requires": {
-        "babel-code-frame": "6.26.0",
-        "babel-messages": "6.23.0",
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0",
-        "babylon": "6.18.0",
-        "debug": "2.6.8",
-        "globals": "9.18.0",
-        "invariant": "2.2.2",
-        "lodash": "4.17.4"
-      }
-    },
-    "babel-types": {
-      "version": "6.26.0",
-      "resolved": "http://registry.npm.taobao.org/babel-types/download/babel-types-6.26.0.tgz",
-      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0",
-        "esutils": "2.0.2",
-        "lodash": "4.17.4",
-        "to-fast-properties": "1.0.3"
-      }
-    },
-    "babylon": {
-      "version": "6.18.0",
-      "resolved": "http://registry.npm.taobao.org/babylon/download/babylon-6.18.0.tgz",
-      "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=",
-      "dev": true
-    },
-    "balanced-match": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
-    },
-    "binary-extensions": {
-      "version": "1.10.0",
-      "resolved": "http://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.10.0.tgz",
-      "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA="
-    },
-    "boxen": {
-      "version": "0.6.0",
-      "resolved": "http://registry.npm.taobao.org/boxen/download/boxen-0.6.0.tgz",
-      "integrity": "sha1-g2TUJIrDT/DvGy8r9JpsYM4NgbY=",
-      "requires": {
-        "ansi-align": "1.1.0",
-        "camelcase": "2.1.1",
-        "chalk": "1.1.3",
-        "cli-boxes": "1.0.0",
-        "filled-array": "1.1.0",
-        "object-assign": "4.1.1",
-        "repeating": "2.0.1",
-        "string-width": "1.0.2",
-        "widest-line": "1.0.0"
-      }
-    },
-    "brace-expansion": {
-      "version": "1.1.8",
-      "resolved": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.8.tgz",
-      "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
-      "requires": {
-        "balanced-match": "1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "braces": {
-      "version": "1.8.5",
-      "resolved": "http://registry.npm.taobao.org/braces/download/braces-1.8.5.tgz",
-      "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
-      "requires": {
-        "expand-range": "1.8.2",
-        "preserve": "0.2.0",
-        "repeat-element": "1.1.2"
-      }
-    },
-    "camelcase": {
-      "version": "2.1.1",
-      "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz",
-      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8="
-    },
-    "capture-stack-trace": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/capture-stack-trace/download/capture-stack-trace-1.0.0.tgz",
-      "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0="
-    },
-    "chalk": {
-      "version": "1.1.3",
-      "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz",
-      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-      "requires": {
-        "ansi-styles": "2.2.1",
-        "escape-string-regexp": "1.0.5",
-        "has-ansi": "2.0.0",
-        "strip-ansi": "3.0.1",
-        "supports-color": "2.0.0"
-      },
-      "dependencies": {
-        "supports-color": {
-          "version": "2.0.0",
-          "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz",
-          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
-        }
-      }
-    },
-    "chokidar": {
-      "version": "1.7.0",
-      "resolved": "http://registry.npm.taobao.org/chokidar/download/chokidar-1.7.0.tgz",
-      "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
-      "requires": {
-        "anymatch": "1.3.2",
-        "async-each": "1.0.1",
-        "fsevents": "1.1.2",
-        "glob-parent": "2.0.0",
-        "inherits": "2.0.3",
-        "is-binary-path": "1.0.1",
-        "is-glob": "2.0.1",
-        "path-is-absolute": "1.0.1",
-        "readdirp": "2.1.0"
-      }
-    },
-    "cli-boxes": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/cli-boxes/download/cli-boxes-1.0.0.tgz",
-      "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM="
-    },
-    "code-point-at": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz",
-      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
-    },
-    "colors": {
-      "version": "1.1.2",
-      "resolved": "http://registry.npm.taobao.org/colors/download/colors-1.1.2.tgz",
-      "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM="
-    },
-    "commander": {
-      "version": "2.11.0",
-      "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.11.0.tgz",
-      "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM="
-    },
-    "compare-versions": {
-      "version": "3.0.1",
-      "resolved": "http://registry.npm.taobao.org/compare-versions/download/compare-versions-3.0.1.tgz",
-      "integrity": "sha1-5gkVt/spTim7tghpGIdivuuHFEM="
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
-    },
-    "configstore": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npm.taobao.org/configstore/download/configstore-2.1.0.tgz",
-      "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=",
-      "requires": {
-        "dot-prop": "3.0.0",
-        "graceful-fs": "4.1.11",
-        "mkdirp": "0.5.1",
-        "object-assign": "4.1.1",
-        "os-tmpdir": "1.0.2",
-        "osenv": "0.1.4",
-        "uuid": "2.0.3",
-        "write-file-atomic": "1.3.4",
-        "xdg-basedir": "2.0.0"
-      }
-    },
-    "convert-source-map": {
-      "version": "1.5.0",
-      "resolved": "http://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.5.0.tgz",
-      "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=",
-      "dev": true
-    },
-    "core-js": {
-      "version": "2.5.1",
-      "resolved": "http://registry.npm.taobao.org/core-js/download/core-js-2.5.1.tgz",
-      "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=",
-      "dev": true
-    },
-    "core-util-is": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
-    },
-    "create-error-class": {
-      "version": "3.0.2",
-      "resolved": "http://registry.npm.taobao.org/create-error-class/download/create-error-class-3.0.2.tgz",
-      "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
-      "requires": {
-        "capture-stack-trace": "1.0.0"
-      }
-    },
-    "debug": {
-      "version": "2.6.8",
-      "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.8.tgz",
-      "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
-      "dev": true,
-      "requires": {
-        "ms": "2.0.0"
-      }
-    },
-    "deep-extend": {
-      "version": "0.4.2",
-      "resolved": "http://registry.npm.taobao.org/deep-extend/download/deep-extend-0.4.2.tgz",
-      "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8="
-    },
-    "detect-indent": {
-      "version": "4.0.0",
-      "resolved": "http://registry.npm.taobao.org/detect-indent/download/detect-indent-4.0.0.tgz",
-      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
-      "dev": true,
-      "requires": {
-        "repeating": "2.0.1"
-      }
-    },
-    "dot-prop": {
-      "version": "3.0.0",
-      "resolved": "http://registry.npm.taobao.org/dot-prop/download/dot-prop-3.0.0.tgz",
-      "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=",
-      "requires": {
-        "is-obj": "1.0.1"
-      }
-    },
-    "duplexer2": {
-      "version": "0.1.4",
-      "resolved": "http://registry.npm.taobao.org/duplexer2/download/duplexer2-0.1.4.tgz",
-      "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
-      "requires": {
-        "readable-stream": "2.3.3"
-      }
-    },
-    "error-ex": {
-      "version": "1.3.1",
-      "resolved": "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.1.tgz",
-      "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
-      "requires": {
-        "is-arrayish": "0.2.1"
-      }
-    },
-    "escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
-    },
-    "esutils": {
-      "version": "2.0.2",
-      "resolved": "http://registry.npm.taobao.org/esutils/download/esutils-2.0.2.tgz",
-      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
-      "dev": true
-    },
-    "expand-brackets": {
-      "version": "0.1.5",
-      "resolved": "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-0.1.5.tgz",
-      "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
-      "requires": {
-        "is-posix-bracket": "0.1.1"
-      }
-    },
-    "expand-range": {
-      "version": "1.8.2",
-      "resolved": "http://registry.npm.taobao.org/expand-range/download/expand-range-1.8.2.tgz",
-      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
-      "requires": {
-        "fill-range": "2.2.3"
-      }
-    },
-    "extglob": {
-      "version": "0.3.2",
-      "resolved": "http://registry.npm.taobao.org/extglob/download/extglob-0.3.2.tgz",
-      "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
-      "requires": {
-        "is-extglob": "1.0.0"
-      }
-    },
-    "filename-regex": {
-      "version": "2.0.1",
-      "resolved": "http://registry.npm.taobao.org/filename-regex/download/filename-regex-2.0.1.tgz",
-      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY="
-    },
-    "fill-range": {
-      "version": "2.2.3",
-      "resolved": "http://registry.npm.taobao.org/fill-range/download/fill-range-2.2.3.tgz",
-      "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
-      "requires": {
-        "is-number": "2.1.0",
-        "isobject": "2.1.0",
-        "randomatic": "1.1.7",
-        "repeat-element": "1.1.2",
-        "repeat-string": "1.6.1"
-      }
-    },
-    "filled-array": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/filled-array/download/filled-array-1.1.0.tgz",
-      "integrity": "sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q="
-    },
-    "flatten": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/flatten/download/flatten-1.0.2.tgz",
-      "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I="
-    },
-    "for-in": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz",
-      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
-    },
-    "for-own": {
-      "version": "0.1.5",
-      "resolved": "http://registry.npm.taobao.org/for-own/download/for-own-0.1.5.tgz",
-      "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
-      "requires": {
-        "for-in": "1.0.2"
-      }
-    },
-    "fs-readdir-recursive": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/fs-readdir-recursive/download/fs-readdir-recursive-1.0.0.tgz",
-      "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=",
-      "dev": true
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
-    },
-    "fsevents": {
-      "version": "1.1.2",
-      "resolved": "http://registry.npm.taobao.org/fsevents/download/fsevents-1.1.2.tgz",
-      "integrity": "sha1-MoK3E/s62A7eDp/PRhG1qm/AM/Q=",
-      "optional": true,
-      "requires": {
-        "nan": "2.7.0",
-        "node-pre-gyp": "0.6.36"
-      },
-      "dependencies": {
-        "abbrev": {
-          "version": "1.1.0",
-          "bundled": true,
-          "optional": true
-        },
-        "ajv": {
-          "version": "4.11.8",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "co": "4.6.0",
-            "json-stable-stringify": "1.0.1"
-          }
-        },
-        "ansi-regex": {
-          "version": "2.1.1",
-          "bundled": true
-        },
-        "aproba": {
-          "version": "1.1.1",
-          "bundled": true,
-          "optional": true
-        },
-        "are-we-there-yet": {
-          "version": "1.1.4",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "delegates": "1.0.0",
-            "readable-stream": "2.2.9"
-          }
-        },
-        "asn1": {
-          "version": "0.2.3",
-          "bundled": true,
-          "optional": true
-        },
-        "assert-plus": {
-          "version": "0.2.0",
-          "bundled": true,
-          "optional": true
-        },
-        "asynckit": {
-          "version": "0.4.0",
-          "bundled": true,
-          "optional": true
-        },
-        "aws-sign2": {
-          "version": "0.6.0",
-          "bundled": true,
-          "optional": true
-        },
-        "aws4": {
-          "version": "1.6.0",
-          "bundled": true,
-          "optional": true
-        },
-        "balanced-match": {
-          "version": "0.4.2",
-          "bundled": true
-        },
-        "bcrypt-pbkdf": {
-          "version": "1.0.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "tweetnacl": "0.14.5"
-          }
-        },
-        "block-stream": {
-          "version": "0.0.9",
-          "bundled": true,
-          "requires": {
-            "inherits": "2.0.3"
-          }
-        },
-        "boom": {
-          "version": "2.10.1",
-          "bundled": true,
-          "requires": {
-            "hoek": "2.16.3"
-          }
-        },
-        "brace-expansion": {
-          "version": "1.1.7",
-          "bundled": true,
-          "requires": {
-            "balanced-match": "0.4.2",
-            "concat-map": "0.0.1"
-          }
-        },
-        "buffer-shims": {
-          "version": "1.0.0",
-          "bundled": true
-        },
-        "caseless": {
-          "version": "0.12.0",
-          "bundled": true,
-          "optional": true
-        },
-        "co": {
-          "version": "4.6.0",
-          "bundled": true,
-          "optional": true
-        },
-        "code-point-at": {
-          "version": "1.1.0",
-          "bundled": true
-        },
-        "combined-stream": {
-          "version": "1.0.5",
-          "bundled": true,
-          "requires": {
-            "delayed-stream": "1.0.0"
-          }
-        },
-        "concat-map": {
-          "version": "0.0.1",
-          "bundled": true
-        },
-        "console-control-strings": {
-          "version": "1.1.0",
-          "bundled": true
-        },
-        "core-util-is": {
-          "version": "1.0.2",
-          "bundled": true
-        },
-        "cryptiles": {
-          "version": "2.0.5",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "boom": "2.10.1"
-          }
-        },
-        "dashdash": {
-          "version": "1.14.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "assert-plus": "1.0.0"
-          },
-          "dependencies": {
-            "assert-plus": {
-              "version": "1.0.0",
-              "bundled": true,
-              "optional": true
-            }
-          }
-        },
-        "debug": {
-          "version": "2.6.8",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "deep-extend": {
-          "version": "0.4.2",
-          "bundled": true,
-          "optional": true
-        },
-        "delayed-stream": {
-          "version": "1.0.0",
-          "bundled": true
-        },
-        "delegates": {
-          "version": "1.0.0",
-          "bundled": true,
-          "optional": true
-        },
-        "ecc-jsbn": {
-          "version": "0.1.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "jsbn": "0.1.1"
-          }
-        },
-        "extend": {
-          "version": "3.0.1",
-          "bundled": true,
-          "optional": true
-        },
-        "extsprintf": {
-          "version": "1.0.2",
-          "bundled": true
-        },
-        "forever-agent": {
-          "version": "0.6.1",
-          "bundled": true,
-          "optional": true
-        },
-        "form-data": {
-          "version": "2.1.4",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "asynckit": "0.4.0",
-            "combined-stream": "1.0.5",
-            "mime-types": "2.1.15"
-          }
-        },
-        "fs.realpath": {
-          "version": "1.0.0",
-          "bundled": true
-        },
-        "fstream": {
-          "version": "1.0.11",
-          "bundled": true,
-          "requires": {
-            "graceful-fs": "4.1.11",
-            "inherits": "2.0.3",
-            "mkdirp": "0.5.1",
-            "rimraf": "2.6.1"
-          }
-        },
-        "fstream-ignore": {
-          "version": "1.0.5",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "fstream": "1.0.11",
-            "inherits": "2.0.3",
-            "minimatch": "3.0.4"
-          }
-        },
-        "gauge": {
-          "version": "2.7.4",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "aproba": "1.1.1",
-            "console-control-strings": "1.1.0",
-            "has-unicode": "2.0.1",
-            "object-assign": "4.1.1",
-            "signal-exit": "3.0.2",
-            "string-width": "1.0.2",
-            "strip-ansi": "3.0.1",
-            "wide-align": "1.1.2"
-          }
-        },
-        "getpass": {
-          "version": "0.1.7",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "assert-plus": "1.0.0"
-          },
-          "dependencies": {
-            "assert-plus": {
-              "version": "1.0.0",
-              "bundled": true,
-              "optional": true
-            }
-          }
-        },
-        "glob": {
-          "version": "7.1.2",
-          "bundled": true,
-          "requires": {
-            "fs.realpath": "1.0.0",
-            "inflight": "1.0.6",
-            "inherits": "2.0.3",
-            "minimatch": "3.0.4",
-            "once": "1.4.0",
-            "path-is-absolute": "1.0.1"
-          }
-        },
-        "graceful-fs": {
-          "version": "4.1.11",
-          "bundled": true
-        },
-        "har-schema": {
-          "version": "1.0.5",
-          "bundled": true,
-          "optional": true
-        },
-        "har-validator": {
-          "version": "4.2.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "ajv": "4.11.8",
-            "har-schema": "1.0.5"
-          }
-        },
-        "has-unicode": {
-          "version": "2.0.1",
-          "bundled": true,
-          "optional": true
-        },
-        "hawk": {
-          "version": "3.1.3",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "boom": "2.10.1",
-            "cryptiles": "2.0.5",
-            "hoek": "2.16.3",
-            "sntp": "1.0.9"
-          }
-        },
-        "hoek": {
-          "version": "2.16.3",
-          "bundled": true
-        },
-        "http-signature": {
-          "version": "1.1.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "assert-plus": "0.2.0",
-            "jsprim": "1.4.0",
-            "sshpk": "1.13.0"
-          }
-        },
-        "inflight": {
-          "version": "1.0.6",
-          "bundled": true,
-          "requires": {
-            "once": "1.4.0",
-            "wrappy": "1.0.2"
-          }
-        },
-        "inherits": {
-          "version": "2.0.3",
-          "bundled": true
-        },
-        "ini": {
-          "version": "1.3.4",
-          "bundled": true,
-          "optional": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "bundled": true,
-          "requires": {
-            "number-is-nan": "1.0.1"
-          }
-        },
-        "is-typedarray": {
-          "version": "1.0.0",
-          "bundled": true,
-          "optional": true
-        },
-        "isarray": {
-          "version": "1.0.0",
-          "bundled": true
-        },
-        "isstream": {
-          "version": "0.1.2",
-          "bundled": true,
-          "optional": true
-        },
-        "jodid25519": {
-          "version": "1.0.2",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "jsbn": "0.1.1"
-          }
-        },
-        "jsbn": {
-          "version": "0.1.1",
-          "bundled": true,
-          "optional": true
-        },
-        "json-schema": {
-          "version": "0.2.3",
-          "bundled": true,
-          "optional": true
-        },
-        "json-stable-stringify": {
-          "version": "1.0.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "jsonify": "0.0.0"
-          }
-        },
-        "json-stringify-safe": {
-          "version": "5.0.1",
-          "bundled": true,
-          "optional": true
-        },
-        "jsonify": {
-          "version": "0.0.0",
-          "bundled": true,
-          "optional": true
-        },
-        "jsprim": {
-          "version": "1.4.0",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "assert-plus": "1.0.0",
-            "extsprintf": "1.0.2",
-            "json-schema": "0.2.3",
-            "verror": "1.3.6"
-          },
-          "dependencies": {
-            "assert-plus": {
-              "version": "1.0.0",
-              "bundled": true,
-              "optional": true
-            }
-          }
-        },
-        "mime-db": {
-          "version": "1.27.0",
-          "bundled": true
-        },
-        "mime-types": {
-          "version": "2.1.15",
-          "bundled": true,
-          "requires": {
-            "mime-db": "1.27.0"
-          }
-        },
-        "minimatch": {
-          "version": "3.0.4",
-          "bundled": true,
-          "requires": {
-            "brace-expansion": "1.1.7"
-          }
-        },
-        "minimist": {
-          "version": "0.0.8",
-          "bundled": true
-        },
-        "mkdirp": {
-          "version": "0.5.1",
-          "bundled": true,
-          "requires": {
-            "minimist": "0.0.8"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "bundled": true,
-          "optional": true
-        },
-        "node-pre-gyp": {
-          "version": "0.6.36",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "mkdirp": "0.5.1",
-            "nopt": "4.0.1",
-            "npmlog": "4.1.0",
-            "rc": "1.2.1",
-            "request": "2.81.0",
-            "rimraf": "2.6.1",
-            "semver": "5.3.0",
-            "tar": "2.2.1",
-            "tar-pack": "3.4.0"
-          }
-        },
-        "nopt": {
-          "version": "4.0.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "abbrev": "1.1.0",
-            "osenv": "0.1.4"
-          }
-        },
-        "npmlog": {
-          "version": "4.1.0",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "are-we-there-yet": "1.1.4",
-            "console-control-strings": "1.1.0",
-            "gauge": "2.7.4",
-            "set-blocking": "2.0.0"
-          }
-        },
-        "number-is-nan": {
-          "version": "1.0.1",
-          "bundled": true
-        },
-        "oauth-sign": {
-          "version": "0.8.2",
-          "bundled": true,
-          "optional": true
-        },
-        "object-assign": {
-          "version": "4.1.1",
-          "bundled": true,
-          "optional": true
-        },
-        "once": {
-          "version": "1.4.0",
-          "bundled": true,
-          "requires": {
-            "wrappy": "1.0.2"
-          }
-        },
-        "os-homedir": {
-          "version": "1.0.2",
-          "bundled": true,
-          "optional": true
-        },
-        "os-tmpdir": {
-          "version": "1.0.2",
-          "bundled": true,
-          "optional": true
-        },
-        "osenv": {
-          "version": "0.1.4",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "os-homedir": "1.0.2",
-            "os-tmpdir": "1.0.2"
-          }
-        },
-        "path-is-absolute": {
-          "version": "1.0.1",
-          "bundled": true
-        },
-        "performance-now": {
-          "version": "0.2.0",
-          "bundled": true,
-          "optional": true
-        },
-        "process-nextick-args": {
-          "version": "1.0.7",
-          "bundled": true
-        },
-        "punycode": {
-          "version": "1.4.1",
-          "bundled": true,
-          "optional": true
-        },
-        "qs": {
-          "version": "6.4.0",
-          "bundled": true,
-          "optional": true
-        },
-        "rc": {
-          "version": "1.2.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "deep-extend": "0.4.2",
-            "ini": "1.3.4",
-            "minimist": "1.2.0",
-            "strip-json-comments": "2.0.1"
-          },
-          "dependencies": {
-            "minimist": {
-              "version": "1.2.0",
-              "bundled": true,
-              "optional": true
-            }
-          }
-        },
-        "readable-stream": {
-          "version": "2.2.9",
-          "bundled": true,
-          "requires": {
-            "buffer-shims": "1.0.0",
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
-            "isarray": "1.0.0",
-            "process-nextick-args": "1.0.7",
-            "string_decoder": "1.0.1",
-            "util-deprecate": "1.0.2"
-          }
-        },
-        "request": {
-          "version": "2.81.0",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "aws-sign2": "0.6.0",
-            "aws4": "1.6.0",
-            "caseless": "0.12.0",
-            "combined-stream": "1.0.5",
-            "extend": "3.0.1",
-            "forever-agent": "0.6.1",
-            "form-data": "2.1.4",
-            "har-validator": "4.2.1",
-            "hawk": "3.1.3",
-            "http-signature": "1.1.1",
-            "is-typedarray": "1.0.0",
-            "isstream": "0.1.2",
-            "json-stringify-safe": "5.0.1",
-            "mime-types": "2.1.15",
-            "oauth-sign": "0.8.2",
-            "performance-now": "0.2.0",
-            "qs": "6.4.0",
-            "safe-buffer": "5.0.1",
-            "stringstream": "0.0.5",
-            "tough-cookie": "2.3.2",
-            "tunnel-agent": "0.6.0",
-            "uuid": "3.0.1"
-          }
-        },
-        "rimraf": {
-          "version": "2.6.1",
-          "bundled": true,
-          "requires": {
-            "glob": "7.1.2"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.0.1",
-          "bundled": true
-        },
-        "semver": {
-          "version": "5.3.0",
-          "bundled": true,
-          "optional": true
-        },
-        "set-blocking": {
-          "version": "2.0.0",
-          "bundled": true,
-          "optional": true
-        },
-        "signal-exit": {
-          "version": "3.0.2",
-          "bundled": true,
-          "optional": true
-        },
-        "sntp": {
-          "version": "1.0.9",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "hoek": "2.16.3"
-          }
-        },
-        "sshpk": {
-          "version": "1.13.0",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "asn1": "0.2.3",
-            "assert-plus": "1.0.0",
-            "bcrypt-pbkdf": "1.0.1",
-            "dashdash": "1.14.1",
-            "ecc-jsbn": "0.1.1",
-            "getpass": "0.1.7",
-            "jodid25519": "1.0.2",
-            "jsbn": "0.1.1",
-            "tweetnacl": "0.14.5"
-          },
-          "dependencies": {
-            "assert-plus": {
-              "version": "1.0.0",
-              "bundled": true,
-              "optional": true
-            }
-          }
-        },
-        "string_decoder": {
-          "version": "1.0.1",
-          "bundled": true,
-          "requires": {
-            "safe-buffer": "5.0.1"
-          }
-        },
-        "string-width": {
-          "version": "1.0.2",
-          "bundled": true,
-          "requires": {
-            "code-point-at": "1.1.0",
-            "is-fullwidth-code-point": "1.0.0",
-            "strip-ansi": "3.0.1"
-          }
-        },
-        "stringstream": {
-          "version": "0.0.5",
-          "bundled": true,
-          "optional": true
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "bundled": true,
-          "requires": {
-            "ansi-regex": "2.1.1"
-          }
-        },
-        "strip-json-comments": {
-          "version": "2.0.1",
-          "bundled": true,
-          "optional": true
-        },
-        "tar": {
-          "version": "2.2.1",
-          "bundled": true,
-          "requires": {
-            "block-stream": "0.0.9",
-            "fstream": "1.0.11",
-            "inherits": "2.0.3"
-          }
-        },
-        "tar-pack": {
-          "version": "3.4.0",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "debug": "2.6.8",
-            "fstream": "1.0.11",
-            "fstream-ignore": "1.0.5",
-            "once": "1.4.0",
-            "readable-stream": "2.2.9",
-            "rimraf": "2.6.1",
-            "tar": "2.2.1",
-            "uid-number": "0.0.6"
-          }
-        },
-        "tough-cookie": {
-          "version": "2.3.2",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "punycode": "1.4.1"
-          }
-        },
-        "tunnel-agent": {
-          "version": "0.6.0",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "5.0.1"
-          }
-        },
-        "tweetnacl": {
-          "version": "0.14.5",
-          "bundled": true,
-          "optional": true
-        },
-        "uid-number": {
-          "version": "0.0.6",
-          "bundled": true,
-          "optional": true
-        },
-        "util-deprecate": {
-          "version": "1.0.2",
-          "bundled": true
-        },
-        "uuid": {
-          "version": "3.0.1",
-          "bundled": true,
-          "optional": true
-        },
-        "verror": {
-          "version": "1.3.6",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "extsprintf": "1.0.2"
-          }
-        },
-        "wide-align": {
-          "version": "1.1.2",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "string-width": "1.0.2"
-          }
-        },
-        "wrappy": {
-          "version": "1.0.2",
-          "bundled": true
-        }
-      }
-    },
-    "glob": {
-      "version": "7.1.2",
-      "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.2.tgz",
-      "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=",
-      "dev": true,
-      "requires": {
-        "fs.realpath": "1.0.0",
-        "inflight": "1.0.6",
-        "inherits": "2.0.3",
-        "minimatch": "3.0.4",
-        "once": "1.4.0",
-        "path-is-absolute": "1.0.1"
-      }
-    },
-    "glob-base": {
-      "version": "0.3.0",
-      "resolved": "http://registry.npm.taobao.org/glob-base/download/glob-base-0.3.0.tgz",
-      "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
-      "requires": {
-        "glob-parent": "2.0.0",
-        "is-glob": "2.0.1"
-      }
-    },
-    "glob-parent": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/glob-parent/download/glob-parent-2.0.0.tgz",
-      "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
-      "requires": {
-        "is-glob": "2.0.1"
-      }
-    },
-    "globals": {
-      "version": "9.18.0",
-      "resolved": "http://registry.npm.taobao.org/globals/download/globals-9.18.0.tgz",
-      "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=",
-      "dev": true
-    },
-    "got": {
-      "version": "5.7.1",
-      "resolved": "http://registry.npm.taobao.org/got/download/got-5.7.1.tgz",
-      "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=",
-      "requires": {
-        "create-error-class": "3.0.2",
-        "duplexer2": "0.1.4",
-        "is-redirect": "1.0.0",
-        "is-retry-allowed": "1.1.0",
-        "is-stream": "1.1.0",
-        "lowercase-keys": "1.0.0",
-        "node-status-codes": "1.0.0",
-        "object-assign": "4.1.1",
-        "parse-json": "2.2.0",
-        "pinkie-promise": "2.0.1",
-        "read-all-stream": "3.1.0",
-        "readable-stream": "2.3.3",
-        "timed-out": "3.1.3",
-        "unzip-response": "1.0.2",
-        "url-parse-lax": "1.0.0"
-      }
-    },
-    "graceful-fs": {
-      "version": "4.1.11",
-      "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.11.tgz",
-      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
-    },
-    "has-ansi": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz",
-      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
-      "requires": {
-        "ansi-regex": "2.1.1"
-      }
-    },
-    "has-flag": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz",
-      "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
-    },
-    "hash-sum": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz",
-      "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ="
-    },
-    "home-or-tmp": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/home-or-tmp/download/home-or-tmp-2.0.0.tgz",
-      "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
-      "dev": true,
-      "requires": {
-        "os-homedir": "1.0.2",
-        "os-tmpdir": "1.0.2"
-      }
-    },
-    "ignore": {
-      "version": "3.3.5",
-      "resolved": "http://registry.npm.taobao.org/ignore/download/ignore-3.3.5.tgz",
-      "integrity": "sha1-xOcVRV9gc6jX5drnLS/J1xZj26Y="
-    },
-    "imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "http://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
-    },
-    "indexes-of": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz",
-      "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
-    },
-    "inflight": {
-      "version": "1.0.6",
-      "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dev": true,
-      "requires": {
-        "once": "1.4.0",
-        "wrappy": "1.0.2"
-      }
-    },
-    "inherits": {
-      "version": "2.0.3",
-      "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz",
-      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
-    },
-    "ini": {
-      "version": "1.3.4",
-      "resolved": "http://registry.npm.taobao.org/ini/download/ini-1.3.4.tgz",
-      "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4="
-    },
-    "invariant": {
-      "version": "2.2.2",
-      "resolved": "http://registry.npm.taobao.org/invariant/download/invariant-2.2.2.tgz",
-      "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
-      "dev": true,
-      "requires": {
-        "loose-envify": "1.3.1"
-      }
-    },
-    "is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz",
-      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
-    },
-    "is-binary-path": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz",
-      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
-      "requires": {
-        "binary-extensions": "1.10.0"
-      }
-    },
-    "is-buffer": {
-      "version": "1.1.5",
-      "resolved": "http://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.5.tgz",
-      "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw="
-    },
-    "is-dotfile": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/is-dotfile/download/is-dotfile-1.0.3.tgz",
-      "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE="
-    },
-    "is-equal-shallow": {
-      "version": "0.1.3",
-      "resolved": "http://registry.npm.taobao.org/is-equal-shallow/download/is-equal-shallow-0.1.3.tgz",
-      "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
-      "requires": {
-        "is-primitive": "2.0.0"
-      }
-    },
-    "is-extendable": {
-      "version": "0.1.1",
-      "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
-    },
-    "is-extglob": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/is-extglob/download/is-extglob-1.0.0.tgz",
-      "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
-    },
-    "is-finite": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/is-finite/download/is-finite-1.0.2.tgz",
-      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
-      "requires": {
-        "number-is-nan": "1.0.1"
-      }
-    },
-    "is-fullwidth-code-point": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz",
-      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-      "requires": {
-        "number-is-nan": "1.0.1"
-      }
-    },
-    "is-glob": {
-      "version": "2.0.1",
-      "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-2.0.1.tgz",
-      "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
-      "requires": {
-        "is-extglob": "1.0.0"
-      }
-    },
-    "is-npm": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/is-npm/download/is-npm-1.0.0.tgz",
-      "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ="
-    },
-    "is-number": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-2.1.0.tgz",
-      "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
-      "requires": {
-        "kind-of": "3.2.2"
-      }
-    },
-    "is-obj": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/is-obj/download/is-obj-1.0.1.tgz",
-      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
-    },
-    "is-posix-bracket": {
-      "version": "0.1.1",
-      "resolved": "http://registry.npm.taobao.org/is-posix-bracket/download/is-posix-bracket-0.1.1.tgz",
-      "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q="
-    },
-    "is-primitive": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/is-primitive/download/is-primitive-2.0.0.tgz",
-      "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU="
-    },
-    "is-redirect": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/is-redirect/download/is-redirect-1.0.0.tgz",
-      "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ="
-    },
-    "is-retry-allowed": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/is-retry-allowed/download/is-retry-allowed-1.1.0.tgz",
-      "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ="
-    },
-    "is-stream": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz",
-      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
-    },
-    "isarray": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-    },
-    "isobject": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz",
-      "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-      "requires": {
-        "isarray": "1.0.0"
-      }
-    },
-    "js-base64": {
-      "version": "2.3.2",
-      "resolved": "http://registry.npm.taobao.org/js-base64/download/js-base64-2.3.2.tgz",
-      "integrity": "sha1-p5qSNmY3K1gPjif1GEXG9+j7+68="
-    },
-    "js-tokens": {
-      "version": "3.0.2",
-      "resolved": "http://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz",
-      "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
-      "dev": true
-    },
-    "jsesc": {
-      "version": "1.3.0",
-      "resolved": "http://registry.npm.taobao.org/jsesc/download/jsesc-1.3.0.tgz",
-      "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
-      "dev": true
-    },
-    "json5": {
-      "version": "0.5.1",
-      "resolved": "http://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz",
-      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
-      "dev": true
-    },
-    "kind-of": {
-      "version": "3.2.2",
-      "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "requires": {
-        "is-buffer": "1.1.5"
-      }
-    },
-    "latest-version": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/latest-version/download/latest-version-2.0.0.tgz",
-      "integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=",
-      "requires": {
-        "package-json": "2.4.0"
-      }
-    },
-    "lazy-req": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/lazy-req/download/lazy-req-1.1.0.tgz",
-      "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w="
-    },
-    "lodash": {
-      "version": "4.17.4",
-      "resolved": "http://registry.npm.taobao.org/lodash/download/lodash-4.17.4.tgz",
-      "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
-      "dev": true
-    },
-    "loose-envify": {
-      "version": "1.3.1",
-      "resolved": "http://registry.npm.taobao.org/loose-envify/download/loose-envify-1.3.1.tgz",
-      "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
-      "dev": true,
-      "requires": {
-        "js-tokens": "3.0.2"
-      }
-    },
-    "lowercase-keys": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/lowercase-keys/download/lowercase-keys-1.0.0.tgz",
-      "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY="
-    },
-    "micromatch": {
-      "version": "2.3.11",
-      "resolved": "http://registry.npm.taobao.org/micromatch/download/micromatch-2.3.11.tgz",
-      "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
-      "requires": {
-        "arr-diff": "2.0.0",
-        "array-unique": "0.2.1",
-        "braces": "1.8.5",
-        "expand-brackets": "0.1.5",
-        "extglob": "0.3.2",
-        "filename-regex": "2.0.1",
-        "is-extglob": "1.0.0",
-        "is-glob": "2.0.1",
-        "kind-of": "3.2.2",
-        "normalize-path": "2.1.1",
-        "object.omit": "2.0.1",
-        "parse-glob": "3.0.4",
-        "regex-cache": "0.4.4"
-      }
-    },
-    "minimatch": {
-      "version": "3.0.4",
-      "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz",
-      "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
-      "requires": {
-        "brace-expansion": "1.1.8"
-      }
-    },
-    "minimist": {
-      "version": "0.0.8",
-      "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz",
-      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
-    },
-    "mkdirp": {
-      "version": "0.5.1",
-      "resolved": "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz",
-      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
-      "requires": {
-        "minimist": "0.0.8"
-      }
-    },
-    "ms": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "nan": {
-      "version": "2.7.0",
-      "resolved": "http://registry.npm.taobao.org/nan/download/nan-2.7.0.tgz",
-      "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=",
-      "optional": true
-    },
-    "node-status-codes": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/node-status-codes/download/node-status-codes-1.0.0.tgz",
-      "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8="
-    },
-    "normalize-path": {
-      "version": "2.1.1",
-      "resolved": "http://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz",
-      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-      "requires": {
-        "remove-trailing-separator": "1.1.0"
-      }
-    },
-    "number-is-nan": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz",
-      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
-    },
-    "object-assign": {
-      "version": "4.1.1",
-      "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
-    },
-    "object.omit": {
-      "version": "2.0.1",
-      "resolved": "http://registry.npm.taobao.org/object.omit/download/object.omit-2.0.1.tgz",
-      "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
-      "requires": {
-        "for-own": "0.1.5",
-        "is-extendable": "0.1.1"
-      }
-    },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
-      "requires": {
-        "wrappy": "1.0.2"
-      }
-    },
-    "os-homedir": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz",
-      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
-    },
-    "os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
-    },
-    "osenv": {
-      "version": "0.1.4",
-      "resolved": "http://registry.npm.taobao.org/osenv/download/osenv-0.1.4.tgz",
-      "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=",
-      "requires": {
-        "os-homedir": "1.0.2",
-        "os-tmpdir": "1.0.2"
-      }
-    },
-    "output-file-sync": {
-      "version": "1.1.2",
-      "resolved": "http://registry.npm.taobao.org/output-file-sync/download/output-file-sync-1.1.2.tgz",
-      "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "4.1.11",
-        "mkdirp": "0.5.1",
-        "object-assign": "4.1.1"
-      }
-    },
-    "package-json": {
-      "version": "2.4.0",
-      "resolved": "http://registry.npm.taobao.org/package-json/download/package-json-2.4.0.tgz",
-      "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=",
-      "requires": {
-        "got": "5.7.1",
-        "registry-auth-token": "3.3.1",
-        "registry-url": "3.1.0",
-        "semver": "5.4.1"
-      }
-    },
-    "parse-glob": {
-      "version": "3.0.4",
-      "resolved": "http://registry.npm.taobao.org/parse-glob/download/parse-glob-3.0.4.tgz",
-      "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
-      "requires": {
-        "glob-base": "0.3.0",
-        "is-dotfile": "1.0.3",
-        "is-extglob": "1.0.0",
-        "is-glob": "2.0.1"
-      }
-    },
-    "parse-json": {
-      "version": "2.2.0",
-      "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz",
-      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
-      "requires": {
-        "error-ex": "1.3.1"
-      }
-    },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
-    },
-    "pinkie": {
-      "version": "2.0.4",
-      "resolved": "http://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
-    },
-    "pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "http://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "requires": {
-        "pinkie": "2.0.4"
-      }
-    },
-    "postcss": {
-      "version": "5.2.17",
-      "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-5.2.17.tgz",
-      "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=",
-      "requires": {
-        "chalk": "1.1.3",
-        "js-base64": "2.3.2",
-        "source-map": "0.5.7",
-        "supports-color": "3.2.3"
-      }
-    },
-    "postcss-selector-parser": {
-      "version": "2.2.3",
-      "resolved": "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-2.2.3.tgz",
-      "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=",
-      "requires": {
-        "flatten": "1.0.2",
-        "indexes-of": "1.0.1",
-        "uniq": "1.0.1"
-      }
-    },
-    "prepend-http": {
-      "version": "1.0.4",
-      "resolved": "http://registry.npm.taobao.org/prepend-http/download/prepend-http-1.0.4.tgz",
-      "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
-    },
-    "preserve": {
-      "version": "0.2.0",
-      "resolved": "http://registry.npm.taobao.org/preserve/download/preserve-0.2.0.tgz",
-      "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks="
-    },
-    "private": {
-      "version": "0.1.7",
-      "resolved": "http://registry.npm.taobao.org/private/download/private-0.1.7.tgz",
-      "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=",
-      "dev": true
-    },
-    "process-nextick-args": {
-      "version": "1.0.7",
-      "resolved": "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-1.0.7.tgz",
-      "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
-    },
-    "randomatic": {
-      "version": "1.1.7",
-      "resolved": "http://registry.npm.taobao.org/randomatic/download/randomatic-1.1.7.tgz",
-      "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=",
-      "requires": {
-        "is-number": "3.0.0",
-        "kind-of": "4.0.0"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "3.0.0",
-          "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz",
-          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-          "requires": {
-            "kind-of": "3.2.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "requires": {
-                "is-buffer": "1.1.5"
-              }
-            }
-          }
-        },
-        "kind-of": {
-          "version": "4.0.0",
-          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz",
-          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-          "requires": {
-            "is-buffer": "1.1.5"
-          }
-        }
-      }
-    },
-    "rc": {
-      "version": "1.2.1",
-      "resolved": "http://registry.npm.taobao.org/rc/download/rc-1.2.1.tgz",
-      "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=",
-      "requires": {
-        "deep-extend": "0.4.2",
-        "ini": "1.3.4",
-        "minimist": "1.2.0",
-        "strip-json-comments": "2.0.1"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
-        }
-      }
-    },
-    "read-all-stream": {
-      "version": "3.1.0",
-      "resolved": "http://registry.npm.taobao.org/read-all-stream/download/read-all-stream-3.1.0.tgz",
-      "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=",
-      "requires": {
-        "pinkie-promise": "2.0.1",
-        "readable-stream": "2.3.3"
-      }
-    },
-    "readable-stream": {
-      "version": "2.3.3",
-      "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.3.tgz",
-      "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=",
-      "requires": {
-        "core-util-is": "1.0.2",
-        "inherits": "2.0.3",
-        "isarray": "1.0.0",
-        "process-nextick-args": "1.0.7",
-        "safe-buffer": "5.1.1",
-        "string_decoder": "1.0.3",
-        "util-deprecate": "1.0.2"
-      }
-    },
-    "readdirp": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npm.taobao.org/readdirp/download/readdirp-2.1.0.tgz",
-      "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
-      "requires": {
-        "graceful-fs": "4.1.11",
-        "minimatch": "3.0.4",
-        "readable-stream": "2.3.3",
-        "set-immediate-shim": "1.0.1"
-      }
-    },
-    "regenerate": {
-      "version": "1.3.2",
-      "resolved": "http://registry.npm.taobao.org/regenerate/download/regenerate-1.3.2.tgz",
-      "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=",
-      "dev": true
-    },
-    "regenerator-runtime": {
-      "version": "0.11.0",
-      "resolved": "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.0.tgz",
-      "integrity": "sha1-flT+W1zNXWYk6mJVw0c74JC4AuE=",
-      "dev": true
-    },
-    "regenerator-transform": {
-      "version": "0.10.1",
-      "resolved": "http://registry.npm.taobao.org/regenerator-transform/download/regenerator-transform-0.10.1.tgz",
-      "integrity": "sha1-HkmWg3Ix2ot/PPQRTXG1aRoGgN0=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0",
-        "private": "0.1.7"
-      }
-    },
-    "regex-cache": {
-      "version": "0.4.4",
-      "resolved": "http://registry.npm.taobao.org/regex-cache/download/regex-cache-0.4.4.tgz",
-      "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=",
-      "requires": {
-        "is-equal-shallow": "0.1.3"
-      }
-    },
-    "regexpu-core": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/regexpu-core/download/regexpu-core-2.0.0.tgz",
-      "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
-      "dev": true,
-      "requires": {
-        "regenerate": "1.3.2",
-        "regjsgen": "0.2.0",
-        "regjsparser": "0.1.5"
-      }
-    },
-    "registry-auth-token": {
-      "version": "3.3.1",
-      "resolved": "http://registry.npm.taobao.org/registry-auth-token/download/registry-auth-token-3.3.1.tgz",
-      "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=",
-      "requires": {
-        "rc": "1.2.1",
-        "safe-buffer": "5.1.1"
-      }
-    },
-    "registry-url": {
-      "version": "3.1.0",
-      "resolved": "http://registry.npm.taobao.org/registry-url/download/registry-url-3.1.0.tgz",
-      "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
-      "requires": {
-        "rc": "1.2.1"
-      }
-    },
-    "regjsgen": {
-      "version": "0.2.0",
-      "resolved": "http://registry.npm.taobao.org/regjsgen/download/regjsgen-0.2.0.tgz",
-      "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
-      "dev": true
-    },
-    "regjsparser": {
-      "version": "0.1.5",
-      "resolved": "http://registry.npm.taobao.org/regjsparser/download/regjsparser-0.1.5.tgz",
-      "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
-      "dev": true,
-      "requires": {
-        "jsesc": "0.5.0"
-      },
-      "dependencies": {
-        "jsesc": {
-          "version": "0.5.0",
-          "resolved": "http://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz",
-          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
-          "dev": true
-        }
-      }
-    },
-    "remove-trailing-separator": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz",
-      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
-    },
-    "repeat-element": {
-      "version": "1.1.2",
-      "resolved": "http://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.2.tgz",
-      "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo="
-    },
-    "repeat-string": {
-      "version": "1.6.1",
-      "resolved": "http://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz",
-      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
-    },
-    "repeating": {
-      "version": "2.0.1",
-      "resolved": "http://registry.npm.taobao.org/repeating/download/repeating-2.0.1.tgz",
-      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
-      "requires": {
-        "is-finite": "1.0.2"
-      }
-    },
-    "safe-buffer": {
-      "version": "5.1.1",
-      "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.1.tgz",
-      "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM="
-    },
-    "semver": {
-      "version": "5.4.1",
-      "resolved": "http://registry.npm.taobao.org/semver/download/semver-5.4.1.tgz",
-      "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4="
-    },
-    "semver-diff": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npm.taobao.org/semver-diff/download/semver-diff-2.1.0.tgz",
-      "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
-      "requires": {
-        "semver": "5.4.1"
-      }
-    },
-    "set-immediate-shim": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/set-immediate-shim/download/set-immediate-shim-1.0.1.tgz",
-      "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
-    },
-    "slash": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz",
-      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
-      "dev": true
-    },
-    "slide": {
-      "version": "1.1.6",
-      "resolved": "http://registry.npm.taobao.org/slide/download/slide-1.1.6.tgz",
-      "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc="
-    },
-    "source-map": {
-      "version": "0.5.7",
-      "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
-    },
-    "source-map-support": {
-      "version": "0.4.18",
-      "resolved": "http://registry.npm.taobao.org/source-map-support/download/source-map-support-0.4.18.tgz",
-      "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=",
-      "dev": true,
-      "requires": {
-        "source-map": "0.5.7"
-      }
-    },
-    "string_decoder": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.0.3.tgz",
-      "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=",
-      "requires": {
-        "safe-buffer": "5.1.1"
-      }
-    },
-    "string-width": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz",
-      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
-      "requires": {
-        "code-point-at": "1.1.0",
-        "is-fullwidth-code-point": "1.0.0",
-        "strip-ansi": "3.0.1"
-      }
-    },
-    "strip-ansi": {
-      "version": "3.0.1",
-      "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz",
-      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-      "requires": {
-        "ansi-regex": "2.1.1"
-      }
-    },
-    "strip-json-comments": {
-      "version": "2.0.1",
-      "resolved": "http://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz",
-      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
-    },
-    "supports-color": {
-      "version": "3.2.3",
-      "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz",
-      "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
-      "requires": {
-        "has-flag": "1.0.0"
-      }
-    },
-    "timed-out": {
-      "version": "3.1.3",
-      "resolved": "http://registry.npm.taobao.org/timed-out/download/timed-out-3.1.3.tgz",
-      "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc="
-    },
-    "to-fast-properties": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-1.0.3.tgz",
-      "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
-      "dev": true
-    },
-    "trim-right": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/trim-right/download/trim-right-1.0.1.tgz",
-      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
-      "dev": true
-    },
-    "uniq": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz",
-      "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8="
-    },
-    "unzip-response": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/unzip-response/download/unzip-response-1.0.2.tgz",
-      "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4="
-    },
-    "update-notifier": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/update-notifier/download/update-notifier-1.0.3.tgz",
-      "integrity": "sha1-j5LFFUgr1oMbfJMBPnD4dVLHz1o=",
-      "requires": {
-        "boxen": "0.6.0",
-        "chalk": "1.1.3",
-        "configstore": "2.1.0",
-        "is-npm": "1.0.0",
-        "latest-version": "2.0.0",
-        "lazy-req": "1.1.0",
-        "semver-diff": "2.1.0",
-        "xdg-basedir": "2.0.0"
-      }
-    },
-    "url-parse-lax": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/url-parse-lax/download/url-parse-lax-1.0.0.tgz",
-      "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
-      "requires": {
-        "prepend-http": "1.0.4"
-      }
-    },
-    "user-home": {
-      "version": "1.1.1",
-      "resolved": "http://registry.npm.taobao.org/user-home/download/user-home-1.1.1.tgz",
-      "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
-      "dev": true
-    },
-    "util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
-    },
-    "uuid": {
-      "version": "2.0.3",
-      "resolved": "http://registry.npm.taobao.org/uuid/download/uuid-2.0.3.tgz",
-      "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho="
-    },
-    "v8flags": {
-      "version": "2.1.1",
-      "resolved": "http://registry.npm.taobao.org/v8flags/download/v8flags-2.1.1.tgz",
-      "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
-      "dev": true,
-      "requires": {
-        "user-home": "1.1.1"
-      }
-    },
-    "widest-line": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/widest-line/download/widest-line-1.0.0.tgz",
-      "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=",
-      "requires": {
-        "string-width": "1.0.2"
-      }
-    },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
-    },
-    "write-file-atomic": {
-      "version": "1.3.4",
-      "resolved": "http://registry.npm.taobao.org/write-file-atomic/download/write-file-atomic-1.3.4.tgz",
-      "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=",
-      "requires": {
-        "graceful-fs": "4.1.11",
-        "imurmurhash": "0.1.4",
-        "slide": "1.1.6"
-      }
-    },
-    "xdg-basedir": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/xdg-basedir/download/xdg-basedir-2.0.0.tgz",
-      "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=",
-      "requires": {
-        "os-homedir": "1.0.2"
-      }
-    },
-    "xmldom": {
-      "version": "0.1.27",
-      "resolved": "http://registry.npm.taobao.org/xmldom/download/xmldom-0.1.27.tgz",
-      "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk="
-    }
-  }
-}
diff --git a/packages/wepy-cli/package.json b/packages/wepy-cli/package.json
deleted file mode 100644
index a81cd2a00..000000000
--- a/packages/wepy-cli/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "name": "wepy-cli",
-  "version": "1.6.1-alpha2",
-  "description": "",
-  "main": "bin/wepy.js",
-  "bin": {
-    "wepy": "bin/wepy.js"
-  },
-  "scripts": {
-    "prepublish": "npm run build",
-    "build": "babel --presets es2015,stage-1 src/ --out-dir lib/ --source-maps",
-    "watch-compile": "npm run build -- --watch",
-    "watch": "npm run watch-compile",
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git@github.com:wepyjs/wepy.git"
-  },
-  "author": "Gcaufy",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/wepyjs/wepy/issues"
-  },
-  "homepage": "https://github.com/wepyjs/wepy#readme",
-  "devDependencies": {
-    "babel": "^6.5.2",
-    "babel-cli": "^6.18.0",
-    "babel-preset-es2015": "^6.18.0",
-    "babel-preset-stage-1": "^6.16.0"
-  },
-  "dependencies": {
-    "chokidar": "^1.6.1",
-    "colors": "^1.1.2",
-    "commander": "^2.9.0",
-    "compare-versions": "^3.0.0",
-    "hash-sum": "^1.0.2",
-    "ignore": "^3.2.0",
-    "js-base64": "^2.1.9",
-    "mkdirp": "^0.5.1",
-    "postcss": "^5.2.16",
-    "postcss-selector-parser": "^2.2.3",
-    "update-notifier": "^1.0.2",
-    "xmldom": "^0.1.27"
-  }
-}
diff --git a/packages/wepy-cli/src/cache.js b/packages/wepy-cli/src/cache.js
deleted file mode 100644
index d56da9f1d..000000000
--- a/packages/wepy-cli/src/cache.js
+++ /dev/null
@@ -1,95 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import util from './util';
-
-const cachePath = '.wepycache';
-let _buildCache = null;
-let _cacheChanged = false;
-let _filelistCache = {};
-
-export default {
-    setParams (v) {
-        this._params = v;
-    },
-    getParams () {
-        return this._params;
-    },
-    setExt (v) {
-        this._ext = v;
-    },
-    getExt () {
-        return this._ext || '.wpy';
-    },
-    getSrc () {
-        return this._src || 'src';
-    },
-    setSrc (v = 'src') {
-        this._src = v;
-    },
-    getDist () {
-        return this._dist || 'dist';
-    },
-    setDist (v = 'dist') {
-        this._dist = v;
-    },
-    setPages (v = []) {
-        this._pages = v;
-    },
-    getPages () {
-        return this._pages || [];
-    },
-    getConfig () {
-        return this._config || null;
-    },
-    setConfig (v = null) {
-        this._config = v;
-    },
-    setFileList (key, v) {
-        _filelistCache[key] = v;
-    },
-    getFileList (key) {
-        return _filelistCache[key] || null;
-    },
-    getBuildCache (file) {
-        if (_buildCache)
-            return _buildCache;
-
-        if (util.isFile(cachePath)) {
-            _buildCache = util.readFile(cachePath);
-            try {
-                _buildCache = JSON.parse(_buildCache);
-            } catch (e) {
-                _buildCache = null;
-            }
-        }
-
-        return _buildCache || {};
-    },
-    setBuildCache (file) {
-        let cache = this.getBuildCache();
-        cache[file] = util.getModifiedTime(file);
-        _buildCache = cache;
-        _cacheChanged = true;
-    },
-    clearBuildCache() {
-        util.unlink(cachePath);
-    },
-    saveBuildCache() {
-        if (_cacheChanged) {
-            util.writeFile(cachePath, JSON.stringify(_buildCache));
-            _cacheChanged = false;
-        }
-    },
-    checkBuildCache(file) {
-        let cache = this.getBuildCache();
-        return cache[file] && cache[file] === util.getModifiedTime(file);
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy-cli/src/compile-config.js b/packages/wepy-cli/src/compile-config.js
deleted file mode 100644
index cb7349858..000000000
--- a/packages/wepy-cli/src/compile-config.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import path from  'path';
-
-import util from './util';
-import cache from './cache';
-import loader from './loader';
-
-
-export default {
-    compile (config, opath) {
-        let src = cache.getSrc();
-        let dist = cache.getDist();
-        let wepyrc = cache.getConfig();
-        if (wepyrc.output === 'ant' && config.navigationBarTitleText && !config.defaultTitle) {
-            config.defaultTitle = config.navigationBarTitleText;
-        }
-        let target = util.getDistPath(opath, 'json', src, dist);
-        let plg = new loader.PluginHelper(wepyrc.plugins, {
-            type: 'config',
-            code: JSON.stringify(config),
-            file: target,
-            output (p) {
-                util.output(p.action, p.file);
-            },
-            done (result) {
-                util.output('写入', result.file);
-                util.writeFile(target, result.code);
-            }
-        });
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy-cli/src/compile-script.js b/packages/wepy-cli/src/compile-script.js
deleted file mode 100644
index 771427c19..000000000
--- a/packages/wepy-cli/src/compile-script.js
+++ /dev/null
@@ -1,269 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import path from 'path';
-import util from './util';
-import cache from './cache';
-import cWpy from './compile-wpy';
-
-import loader from './loader';
-
-import resolve from './resolve';
-
-
-const currentPath = util.currentDir;
-
-let appPath, npmPath, src, dist;
-
-export default {
-    resolveDeps (code, type, opath) {
-
-        let params = cache.getParams();
-        let config = cache.getConfig();
-        let wpyExt = params.wpyExt;
-        let npmInfo = opath.npm;
-
-
-        return code.replace(/require\(['"]([\w\d_\-\.\/@]+)['"]\)/ig, (match, lib) => {
-            if (lib === './_wepylogs.js') {
-                return match;
-            }
-            let resolved = lib;
-
-
-            let target = '', source = '', ext = '', needCopy = false;
-
-            if (config.output === 'ant' && lib === 'wepy') {
-                lib = 'wepy-ant';
-            }
-            lib = resolve.resolveAlias(lib);
-            if (path.isAbsolute(lib)) {
-                source = lib;
-                target = util.getDistPath(source);
-            } else if (lib[0] === '.') { // require('./something'');
-                source = path.join(opath.dir, lib);  // e:/src/util
-                if (type === 'npm') {
-                    target = path.join(npmPath, path.relative(npmInfo.modulePath, source));
-                    needCopy = true;
-                } else {
-                    // e:/dist/util
-                    target = util.getDistPath(source);
-                    needCopy = false;
-                }
-            } else if (lib.indexOf('/') === -1 || // require('asset');
-                lib.indexOf('/') === lib.length - 1 || // reqiore('a/b/something/')
-                (lib[0] === '@' && lib.indexOf('/') !== -1 && lib.lastIndexOf('/') === lib.indexOf('/')) // require('@abc/something')
-            ) {  
-
-                let mainFile = resolve.getMainFile(lib);
-
-                if (!mainFile) {
-                    throw Error('找不到模块: ' + lib + '\n被依赖于: ' + path.join(opath.dir, opath.base) + '。\n请尝试手动执行 npm install ' + lib + ' 进行安装。');
-                }
-                npmInfo = {
-                    lib: lib,
-                    dir: mainFile.dir,
-                    modulePath: mainFile.modulePath,
-                    file: mainFile.file
-                };
-                source = path.join(mainFile.dir, mainFile.file);
-                target = path.join(npmPath, lib, mainFile.file);
-
-                lib += path.sep + mainFile.file;
-                ext = '';
-                needCopy = true;
-            } else { // require('babel-runtime/regenerator')
-                let requieInfo = lib.split('/');
-                let mainFile = resolve.getMainFile(requieInfo[0]);
-
-                if (!mainFile) {
-                    throw Error('找不到模块: ' + lib + '\n被依赖于: ' + path.join(opath.dir, opath.base) + '。\n请尝试手动执行 npm install ' + lib + ' 进行安装。');
-                }
-                npmInfo = {
-                    lib: requieInfo[0],
-                    dir: mainFile.dir,
-                    modulePath: mainFile.modulePath,
-                    file: mainFile.file
-                };
-                requieInfo.shift();
-
-                source = path.join(mainFile.dir, requieInfo.join('/'));
-                target = path.join(npmPath, npmInfo.lib, requieInfo.join('/'));
-                ext = '';
-                needCopy = true;
-            }
-
-            if (util.isFile(source + wpyExt)) {
-                ext = '.js';
-            } else if (util.isFile(source + '.js')) {
-                ext = '.js';
-            } else if (util.isDir(source) && util.isFile(source + path.sep + 'index.js')) {
-                ext = path.sep + 'index.js';
-            }else if (util.isFile(source)) {
-                ext = '';
-            } else {
-                throw ('找不到文件: ' + source);
-            }
-            source += ext;
-            target += ext;
-            lib += ext;
-            resolved = lib;
-
-            // 第三方组件
-            if (/\.wpy$/.test(resolved)) {
-                target = target.replace(/\.wpy$/, '') + '.js';
-                resolved = resolved.replace(/\.wpy$/, '') + '.js';
-                lib = resolved;
-            }
-
-            if (needCopy) {
-                if (!cache.checkBuildCache(source)) {
-                    cache.setBuildCache(source);
-                    util.log('依赖: ' + path.relative(process.cwd(), target), '拷贝');
-                    let newOpath = path.parse(source);
-                    newOpath.npm = npmInfo;
-                    this.compile('js', null, 'npm', newOpath);
-
-                }
-            }
-            if (type === 'npm') {
-                if (lib[0] !== '.') {
-                    resolved = path.join('..' + path.sep, path.relative(opath.dir, npmInfo.modulePath), lib);
-                } else {
-                    if (lib[0] === '.' && lib[1] === '.')
-                        resolved = './' + resolved;
-                }
-
-            } else {
-                resolved = path.relative(util.getDistPath(opath, opath.ext, src, dist), target);
-            }
-            resolved = resolved.replace(/\\/g, '/').replace(/^\.\.\//, './');
-            return `require('${resolved}')`;
-        });
-    },
-
-    npmHack (opath, code) {
-        // 一些库（redux等） 可能会依赖 process.env.NODE_ENV 进行逻辑判断
-        // 这里在编译这一步直接做替换 否则报错
-        code = code.replace(/process\.env\.NODE_ENV/g, JSON.stringify(process.env.NODE_ENV));
-        switch(opath.base) {
-            case 'lodash.js':
-            case '_global.js':
-                code = code.replace('Function(\'return this\')()', 'this');
-                break;
-            case '_html.js':
-                code = 'module.exports = false;';
-                break;
-            case '_microtask.js':
-                code = code.replace('if(Observer)', 'if(false && Observer)');
-                // IOS 1.10.2 Promise BUG
-                code = code.replace('Promise && Promise.resolve', 'false && Promise && Promise.resolve');
-                break;
-            case '_freeGlobal.js':
-                code = code.replace('module.exports = freeGlobal;', 'module.exports = freeGlobal || this;')
-        }
-        let config = util.getConfig();
-        if (config.output === 'ant' && opath.dir.substr(-19) === 'wepy-async-function') {
-            code = '';
-        }
-        return code;
-    },
-
-    compile (lang, code, type, opath) {
-        let config = util.getConfig();
-        src = cache.getSrc();
-        dist = cache.getDist();
-        npmPath = path.join(currentPath, dist, 'npm' + path.sep);
-
-        if (!code) {
-            code = util.readFile(path.join(opath.dir, opath.base));
-            if (code === null) {
-                throw '打开文件失败: ' + path.join(opath.dir, opath.base);
-            }
-        }
-
-        let compiler = loader.loadCompiler(lang);
-
-        if (!compiler) {
-            return;
-        }
-
-        compiler(code, config.compilers[lang] || {}).then(compileResult => {
-            let sourceMap;
-            if (typeof(compileResult) === 'string') {
-                code = compileResult;
-            } else {
-                sourceMap = compileResult.map;
-                code = compileResult.code;
-            }
-            if (type !== 'npm') {
-                if (type === 'page' || type === 'app') {
-                    code = code.replace(/exports\.default\s*=\s*(\w+);/ig, function (m, defaultExport) {
-                        if (defaultExport === 'undefined') {
-                            return '';
-                        }
-                        if (type === 'page') {
-                            let pagePath = path.join(path.relative(appPath.dir, opath.dir), opath.name).replace(/\\/ig, '/');
-                            return `\nPage(require('wepy').default.$createPage(${defaultExport} , '${pagePath}'));\n`;
-                        } else {
-                            appPath = opath;
-                            let appConfig = JSON.stringify(config.appConfig || {});
-                            let appCode = `\nApp(require('wepy').default.$createApp(${defaultExport}, ${appConfig}));\n`;
-                            if (config.cliLogs) {
-                                appCode += 'require(\'./_wepylogs.js\')\n';
-                            }
-                            return appCode;
-                        }
-                    });
-                }
-            }
-
-            code = this.resolveDeps(code, type, opath);
-
-            if (type === 'npm' && opath.ext === '.wpy') { // 第三方npm组件，后缀恒为wpy
-                cWpy.compile(opath);
-                return;
-            }
-
-            let target;
-            if (type !== 'npm') {
-                target = util.getDistPath(opath, 'js');
-            } else {
-                code = this.npmHack(opath, code);
-                target = path.join(npmPath, path.relative(opath.npm.modulePath, path.join(opath.dir, opath.base)));
-            }
-
-            if (sourceMap) {
-                sourceMap.sources = [opath.name + '.js'];
-                sourceMap.file = opath.name + '.js';
-                var Base64 = require('js-base64').Base64;
-                code += `\r\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,${Base64.encode(JSON.stringify(sourceMap))}`;
-            }
-
-            let plg = new loader.PluginHelper(config.plugins, {
-                type: type,
-                code: code,
-                file: target,
-                output (p) {
-                    util.output(p.action, p.file);
-                },
-                done (result) {
-                    util.output('写入', result.file);
-                    util.writeFile(target, result.code);
-                }
-            });
-            // 缓存文件修改时间戳
-            cache.saveBuildCache();
-        }).catch((e) => {
-            util.error(e);
-        });
-    }
-
-}
diff --git a/packages/wepy-cli/src/compile-style.js b/packages/wepy-cli/src/compile-style.js
deleted file mode 100644
index 071837d17..000000000
--- a/packages/wepy-cli/src/compile-style.js
+++ /dev/null
@@ -1,165 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import path from 'path';
-import fs from 'fs';
-import util from './util';
-import cache from './cache';
-
-import loader from './loader';
-import resolve from './resolve';
-import scopedHandler from './style-compiler/scoped';
-
-const LANG_MAP = {
-    'less': '.less',
-    'sass': '.sass;.scss'
-};
-
-export default {
-    compile (styles, requires, opath, moduleId) {
-        let config = util.getConfig();
-        let src = cache.getSrc();
-        let dist = cache.getDist();
-        let ext = cache.getExt();
-        let isNPM = false;
-
-        let outputExt = config.output === 'ant' ? 'acss' : 'wxss';
-
-        if (typeof styles === 'string') {
-            // .compile('less', opath) 这种形式
-            opath = requires;
-            requires = [];
-            moduleId = '';
-            styles = [{
-                type: styles,
-                scoped: false,
-                code: util.readFile(path.join(opath.dir, opath.base)) || ''
-            }];
-        }
-        let allPromises = [];
-
-        // styles can be an empty array
-        styles.forEach((style) => {
-            let lang = style.type || 'css';
-            const content = style.code;
-            const scoped = style.scoped;
-            let filepath = style.src ? style.src : path.join(opath.dir, opath.base);
-
-
-            let options = Object.assign({}, config.compilers[lang] || {});
-
-            if (lang === 'sass' || lang === 'scss') {
-                let indentedSyntax = false;
-                options = Object.assign({}, config.compilers.sass || {});
-                
-                if (lang === 'sass') { // sass is using indented syntax
-                    indentedSyntax = true;
-                }
-                if (options.indentedSyntax === undefined) {
-                    options.indentedSyntax = indentedSyntax;
-                }
-                lang = 'sass';
-            }
-
-            let compiler = loader.loadCompiler(lang);
-
-            if (!compiler) {
-                throw `未发现相关 ${lang} 编译器配置，请检查wepy.config.js文件。`
-            }
-
-            const p = compiler(content, options || {}, filepath).then((css) => {
-                // 处理 scoped
-                if (scoped) {
-                    // 存在有 scoped 的 style
-                    return scopedHandler(moduleId, css).then((cssContent) => {
-                        return cssContent;
-                    });
-                } else {
-                    return css;
-                }
-            });
-
-            allPromises.push(p);
-        });
-
-        // 父组件没有写style标签，但是有子组件的。
-        if (requires.length > 0 && styles.length === 0) {
-            allPromises = [Promise.resolve('')];
-        }
-        Promise.all(allPromises).then((rets) => {
-            let allContent = rets.join('');
-            if (requires && requires.length) {
-                requires.forEach((r) => {
-                    let comsrc = null;
-                    isNPM = false;
-                    if (path.isAbsolute(r)) {
-                        if (path.extname(r) === '' && util.isFile(r + ext)) {
-                            comsrc = r + ext;
-                        }
-                    } else {
-                        let lib = resolve.resolveAlias(r);
-                        if (path.isAbsolute(lib)) {
-                            comsrc = lib;
-                        } else {
-                            let o = resolve.getMainFile(r);
-                            comsrc = path.join(o.dir, o.file);
-                            let newOpath = path.parse(comsrc);
-                            newOpath.npm = {
-                                lib: r,
-                                dir: o.dir,
-                                file: o.file,
-                                modulePath: o.modulePath
-                            };
-                            comsrc = util.getDistPath(newOpath);
-                            isNPM = true;
-                        }
-                    }
-                    if (!comsrc) {
-                        util.error('找不到组件：' + r + `\n请尝试使用 npm install ${r} 安装`, '错误');
-                    } else {
-                        if (path.extname(comsrc) === '') {
-                            comsrc += ext;
-                        }
-                        let relative = path.relative(opath.dir + path.sep + opath.base, comsrc);
-                        let code = util.readFile(comsrc);
-                        if (isNPM || /<style/.test(code)) {
-                            if (isNPM) {
-                                let srcRelative = path.relative(opath.dir + path.sep + opath.base, path.join(util.currentDir, src));
-                                let distFile = path.relative(path.join(util.currentDir, dist), comsrc);
-                                relative = path.join(srcRelative, distFile);
-                            }
-                            if (/\.wpy$/.test(relative)) { // wpy 第三方组件
-                                relative = relative.replace(/\.wpy$/, '.' + outputExt);
-                            }
-                            relative = relative.replace(ext, '.' + outputExt).replace(/\\/ig, '/').replace('../', './');
-                            allContent = '@import "' + relative + '";\n' + allContent;
-                        }
-                    }
-                });
-            }
-            let target = util.getDistPath(opath, outputExt, src, dist);
-
-            let plg = new loader.PluginHelper(config.plugins, {
-                type: 'css',
-                code: allContent,
-                file: target,
-                output (p) {
-                    util.output(p.action, p.file);
-                },
-                done (rst) {
-                    util.output('写入', rst.file);
-                    util.writeFile(target, rst.code);
-                }
-            });
-        }).catch((e) => {
-            util.error(e);
-        });
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy-cli/src/compile-template.js b/packages/wepy-cli/src/compile-template.js
deleted file mode 100644
index b6787c2b6..000000000
--- a/packages/wepy-cli/src/compile-template.js
+++ /dev/null
@@ -1,558 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import {DOMParser, DOMImplementation} from 'xmldom';
-import path from 'path';
-import util from './util';
-import cache from './cache';
-import cWpy from './compile-wpy';
-
-import loader from './loader';
-
-const PREFIX = '$';
-const JOIN = '$';
-
-const BOOLEAN_ATTRS = ['a:else', 'wx:else', 'show-info', 'active', 'controls', 'danmu-btn', 'enable-danmu', 'autoplay', 'disabled', 'show-value', 'checked', 'scroll-x', 'scroll-y', 'auto-focus', 'focus', 'auto-height', 'password', 'indicator-dots', 'report-submit', 'hidden', 'plain', 'loading', 'redirect', 'loop', 'controls'];
-
-export default {
-    comPrefix: {},
-    comCount: 0,
-    getPrefix (prefix) {
-        if (!this.comPrefix[prefix]) {
-            this.comPrefix[prefix] = util.camelize(prefix || '');;
-        }
-        return this.comPrefix[prefix];
-    },
-    getTemplate (content) {
-        content = `<template>${content}</template>`;
-        content = util.attrReplace(content);
-        let doc = new DOMImplementation().createDocument();
-        let node = cWpy.createParser().parseFromString(content);
-        let template = [].slice.call(node.childNodes || []).filter((n) => n.nodeName === 'template');
-
-        [].slice.call(template[0].childNodes || []).forEach((n) => {
-            doc.appendChild(n);
-        });
-        return doc;
-    },
-
-    isInQuote (str, n) {
-        let firstIndex = str.search(/"|'/);
-        if (firstIndex === -1 || firstIndex > n) return false;
-        let char = '';
-        let last = '';
-        for (let i = 0; i < n; i++) {
-            let c = str[i];
-            if (c === '"' || c === '\'') {
-                if (!char) {
-                    char = c;
-                } else if (char === c && last !== '\\') {
-                    char = '';
-                }
-            }
-            last = c;
-        }
-        return char !== '';
-    },
-
-    getFunctionInfo (str) {
-        let rst = {name: '', params: []}, char = '', tmp = '', stack = [];
-        for (let i = 0, len = str.length; i < len; i++) {
-            char = str[i];
-            if (!rst.name) {
-                if (char === '(') {
-                    rst.name = tmp;
-                    tmp = '';
-                    continue;
-                }
-            }
-            if ((char === ',' || char === ')') && stack.length === 0) {
-                let p = tmp.replace(/^\s*/ig, '').replace(/\s*$/ig, '');
-                if (p && (p[0] === '"' || p[0] === '\'') && p[0] === p[p.length - 1]) {
-                    p = p.substring(1, p.length - 1);
-                }
-                rst.params.push(p);
-                tmp = '';
-                continue;
-            }
-            if (char === '\'' || char === '"') {
-                if (stack.length && stack[stack.length - 1] === char)
-                    stack.pop();
-                else
-                    stack.push(char);
-            }
-            tmp += char;
-        }
-        return rst;
-    },
-
-    // 替换xmldom生成的无值属性
-    replaceBooleanAttr(code) {
-        let reg;
-        BOOLEAN_ATTRS.forEach((v) => {
-            reg = new RegExp(`${v}=['"]${v}['"]`, 'ig');
-            code = code.replace(reg, v);
-        })
-        return code;
-    },
-
-    parseExp (content, prefix, ignores, mapping) {
-        if (!prefix)
-            return content;
-        // replace {{ param ? 'abc' : 'efg' }} => {{ $prefix_param ? 'abc' : 'efg' }}
-        return content.replace(/\{\{([^}]+)\}\}/ig, (matchs, words) => {
-            return matchs.replace(/[^\.\w'"](\.{0}|\.{3})([a-z_\$][\w\d\._\$]*)/ig, (match, expand, word, n) => {
-                //console.log(matchs + '------' + match + '--' + word + '--' + n);
-                let char = match[0];
-                let tmp = word.match(/^([\w\$]+)(.*)/);
-                let w = tmp[1];
-                let rest = tmp[2];
-                if (ignores[w] || this.isInQuote(matchs, n)) {
-                    return match;
-                } else {
-                    if (mapping.items && mapping.items[w] && mapping.items[w].bind) {
-                        // prefix 减少一层
-                        let upper = prefix.split(PREFIX);
-                        upper.pop();
-                        upper = upper.join(PREFIX);
-                        upper = upper ? `${PREFIX}${upper}${JOIN}` : '';
-                        return `${char}${expand}${upper}${mapping.items[w].mapping}${rest}`;
-                    }
-                    return `${char}${expand}${PREFIX}${prefix}${JOIN}${word}`;
-                }
-            });
-        });
-    },
-
-    /**
-     * Get :class expression
-     * e.g. getClassExp('{"abc": num < 1}');
-     */
-    parseClassExp (exp) {
-        exp = exp.replace(/^\s/ig, '').replace(/\s$/ig, '');
-        if (exp[0] === '{' && exp[exp.length - 1] === '}') {
-            exp = exp.substring(1, exp.length - 1);
-            let i = 0, len = exp.length;
-            let flagStack = [], flag = 'start';
-            let classNames = [], result = {}, str = '';
-            for (i = 0; i < len; i++) {
-                if ((exp[i] === '\'' || exp[i] === '"')) {
-                    if (flagStack.length && flagStack[0] === exp[i]) {
-                        flagStack.pop();
-                        if (flag === 'class') {
-                            flag = ':';
-                            continue;
-                        } else if (flag === 'expression') {
-                            str += exp[i];
-                            continue;
-                        }
-                    } else {
-                        if (flagStack.length === 0) {
-                            flagStack.push(exp[i]);
-                            if (flag === 'start') {
-                                flag = 'class';
-                                continue;
-                            } else if (flag === 'expression') {
-                                str += exp[i];
-                                continue;
-                            }
-                        }
-                    }
-                }
-                // {abc: num < 1} or {'abc': num <１}
-                if (exp[i] === ':' && (flag === ':' || flag === 'class') && flagStack.length === 0) {
-                    flag = 'expression';
-                    classNames.push(str);
-                    str = '';
-                    continue;
-                }
-                if (exp[i] === ',' && flag === 'expression' && flagStack.length === 0) {
-                    result[classNames[classNames.length - 1]] = str.replace(/^\s/ig, '').replace(/\s$/ig, '');;
-                    str = '';
-                    flag = 'start';
-                    continue;
-                }
-                // get rid of the begining space
-                if (!str.length && exp[i] === ' ')
-                    continue;
-     
-                // not started with '', like {abc: num < 1}
-                if (flag === 'start') {
-                    flag = 'class';
-                }
-     
-                if (flag === 'class' || flag === 'expression') {
-                    str += exp[i];
-                }
-            }
-            if (str.length) {
-                result[classNames[classNames.length - 1]] = str.replace(/^\s/ig, '').replace(/\s$/ig, '');
-            }
-            return result;
-        } else {
-            throw ':class expression is not correct, it has to be {\'className\': mycondition}';
-        }
-    },
-
-
-    // 通过mapping一层层映射，反应到属性上
-    getMappingIndex (mapping, arr) {
-        if (!arr)
-            arr = [];
-
-        if (mapping === null)
-            return arr.reverse();
-
-        let val = mapping.prefix ? `${PREFIX}${mapping.prefix}${JOIN}${mapping.for.index}` : mapping.for.index;
-        arr.push(`{{${val}}}`);
-        return this.getMappingIndex(mapping.parent, arr);
-    },
-
-    /**
-     * 组件图片引用会被直接编译进页面，因此需要对组件中的相对路径进行路径修正
-     */
-    fixRelativePath (node, template, parentTemplate) {
-        if (node.nodeName === 'image' && parentTemplate) {
-            let src = node.getAttribute('src')
-            if (src[0] === '.') {
-                let realpath = path.join(path.parse(template.src).dir, node.getAttribute('src'));
-                let fixedpath = path.relative(path.parse(parentTemplate.src).dir, realpath);
-                fixedpath = fixedpath.replace(/\\/g, '/');
-                node.setAttribute('src', fixedpath);
-            }
-        }
-        return node;
-    },
-
-    updateBind (node, template, parentTemplate, prefix, ignores = {}, mapping = {}) {
-
-        let config = cache.getConfig();
-        let tagprefix = config.output === 'ant' ? 'a' : 'wx';
-
-        node = this.fixRelativePath(node, template, parentTemplate);
-
-        if (node.nodeName === '#text' && prefix) {
-            if (node.data && node.data.indexOf('{{') > -1) {
-                node.replaceData(0, node.data.length, this.parseExp(node.data, prefix, ignores, mapping));
-            }
-        } else {
-            [].slice.call(node.attributes || []).forEach((attr) => {
-                if (attr.name === 'v-bind:class.once') {
-                    let classObject = this.parseClassExp(attr.value);
-                    let classArray = (node.getAttribute('class') || '').split(' ').map(v => v.replace(/^\s/ig, '').replace(/\s$/ig, ''));
-                    if (classArray.length === 1 && classArray[0] === '')
-                        classArray = [];
-                    for (let k in classObject) {
-                        let exp = classObject[k].replace(/\'/ig, '\\\'').replace(/\"/ig, '\\"');
-                        let name = k.replace(/\'/ig, '\\\'').replace(/\"/ig, '\\"');
-                        let index = classArray.indexOf(name);
-                        if (index !== -1) {
-                            classArray.splice(index, 1);
-                        }
-                        exp = `{{${exp} ? '${name}' : ''}}`;
-                        classArray.push(this.parseExp(exp, prefix, ignores, mapping));
-                    }
-                    node.setAttribute('class', classArray.join(' '));
-                    node.removeAttribute(attr.name);
-                }
-                if (prefix) {
-                    if (attr.value.indexOf('{{') > -1) {
-                        attr.value = this.parseExp(attr.value, prefix, ignores, mapping);
-                    }
-                    if (attr.name === tagprefix + ':for' || attr.name === tagprefix + ':for-items') {
-                        let index = node.getAttribute(tagprefix + ':for-index') || 'index';
-                        let item = node.getAttribute(tagprefix + ':for-item') || 'item';
-                        ignores[index] = true;
-                        ignores[item] = true;
-                        //attr.value = parseExp(attr.value, prefix, ignores);
-                    }
-                }
-                // bindtap="abc" => bindtap="prefix_abc"
-                if (
-                    (config.output !== 'ant' && (attr.name.indexOf('bind') === 0 || attr.name.indexOf('catch') === 0)) ||
-                    (config.output === 'ant' && (attr.name.indexOf('on') === 0 || attr.name.indexOf('catch') === 0))
-                    ) {
-                    // added index for all events;
-                    if (mapping.items && mapping.items.length > 0) {
-                        // prefix 减少一层
-                        let upper = prefix.split(PREFIX);
-                        upper.pop();
-                        upper = upper.join(PREFIX);
-                        upper = upper ? `${PREFIX}${upper}${JOIN}` : '';
-                        let comIndex = this.getMappingIndex(mapping);
-                        node.setAttribute('data-com-index', comIndex.join('-'));
-                    }
-                    if (attr.value.indexOf('(') > 0) {  // method('{{p}}', 123);
-                        let funcInfo = this.getFunctionInfo(attr.value);
-                        attr.value = funcInfo.name;
-                        funcInfo.params.forEach((p, i) => {
-                            node.setAttribute('data-wpy' + funcInfo.name.toLowerCase() + '-' + String.fromCharCode(97 + i), p);
-                        });
-                    }
-                    if (prefix)
-                        attr.value = `${PREFIX}${prefix}${JOIN}` + attr.value;
-                }
-                if (attr.name === 'a:for-items' && config.output === 'ant') {
-                    node.setAttribute('a:for', attr.value);
-                    node.removeAttribute(attr.name);
-                }
-            });
-            [].slice.call(node.childNodes || []).forEach((child) => {
-                this.updateBind(child, template, parentTemplate, prefix, ignores, mapping);
-            });
-        }
-        return node;
-    },
-
-    updateSlot (node, childNodes) {
-        let slots = {}, has;
-        if (!childNodes || childNodes.length === 0)
-            slots = {};
-        else {
-            [].slice.call(childNodes || []).forEach((child) => {
-                let name = (child.nodeName === '#text' || child.nodeName === '#comment') ? '' : child.getAttribute('slot');
-
-                if (!name) {
-                    name = '$$default';
-                }
-                if (slots[name])
-                    slots[name].push(child);
-                else
-                    slots[name] = [child];
-            });
-        }
-
-        let slotsElems = util.elemToArray(node.getElementsByTagName('slot'));
-
-        slotsElems.forEach((slot) => {
-            let name = slot.getAttribute('name');
-            if (!name)
-                name = '$$default';
-
-            // 无内容时，用子内容替换
-            let replacements = (slots[name] && slots[name].length > 0) ? slots[name] : [].slice.call(slot.childNodes || []);
-
-            let doc = new DOMImplementation().createDocument();
-            replacements.forEach((n) => {
-                if (name !== '$$default' && n.nodeName !== '#text' && n.nodeName !== '#comment')
-                    n.removeAttribute('slot');
-                doc.appendChild(n);
-            });
-
-            node.replaceChild(doc, slot);
-        });
-        return node;
-    },
-
-    compileXML (node, template, parentTemplate, prefix, childNodes, comAppendAttribute = {}, propsMapping = {}) {
-
-        let config = cache.getConfig();
-        let tagprefix = config.output === 'ant' ? 'a' : 'wx';
-        this.updateSlot(node, childNodes);
-
-        this.updateBind(node, template, parentTemplate, prefix, {}, propsMapping);
-
-        if (node && node.documentElement) {
-            Object.keys(comAppendAttribute).forEach((key) => {
-                if (key === 'class') {
-                    let classNames = node.documentElement.getAttribute('class').split(' ').concat(comAppendAttribute[key].split(' ')).join(' ');
-                    node.documentElement.setAttribute('class', classNames);
-                } else {
-                    node.documentElement.setAttribute(key, comAppendAttribute[key]);
-                }
-            });
-        }
-
-        let repeats = util.elemToArray(node.getElementsByTagName('repeat'));
-
-
-        
-        let forDetail = {};
-        template.props = {};
-        repeats.forEach(repeat => {
-            let repeatComs = [];
-            // <repeat for="xxx" index="idx" item="xxx" key="xxx"></repeat>
-            //                    To
-            // <block wx:for="xxx" wx:for-index="xxx" wx:for-item="xxx" wx:key="xxxx"></block>
-            repeat.tagName = 'block'; 
-            let val = repeat.getAttribute('for');
-            if (val) {
-                repeat.setAttribute(tagprefix + ':for', val);
-                repeat.removeAttribute('for');
-                ['index', 'item', 'key'].forEach(attr => {
-                    let val = repeat.getAttribute(attr);
-                    let tag = attr === 'key' ? `${tagprefix}:key` : `${tagprefix}:for-${attr}`;
-                    val = val || attr;
-                    forDetail[attr] = val;
-                    if (prefix) {
-                        repeat.setAttribute(tag, `${PREFIX}${prefix}${JOIN}${val}`);
-                    } else {
-                        repeat.setAttribute(tag, val);
-                    }
-                    repeat.removeAttribute(attr);
-                });
-            }
-            Object.keys(template.components).forEach((com) => {
-                repeatComs = repeatComs.concat(util.elemToArray(repeat.getElementsByTagName(com)));
-            });
-            repeatComs.forEach(com => {
-                let comAttributes = {};
-                template.props[com.tagName] = {
-                    items: {length: 0},
-                    for: forDetail,
-                    prefix: prefix,
-                    parent: propsMapping.for ? propsMapping : null
-                };
-                [].slice.call(com.attributes || []).forEach(attr => {
-
-                    if (['hidden', 'wx:if', 'wx:elif', 'wx:else', 'class', 'a:if', 'a:elif', 'a:else'].indexOf(attr.name) > -1) {
-                        comAttributes[attr.name] = attr.value;
-                    }
-                    let name = attr.name;
-
-                    let prop = template.props[com.tagName], tmp = {};
-
-
-                    if (name.indexOf('v-bind') === 0) {
-                        tmp.bind = true;
-                        name = name.replace(/^v\-bind\:/, '');
-                    }
-
-                    if (name.indexOf('.once') === name.length - 5) {
-                        name = name.replace(/\.once$/, '');
-                        tmp.type = 'once';
-                    } else if (name.indexOf('.sync') === name.length - 5) {
-                        tmp.type = 'sync';
-                        name = name.replace(/\.sync$/, '');
-                    }
-                    tmp.mapping = attr.value;
-
-                    prop.items[name] = tmp;
-                    prop.items.length++;
-                });
-
-                let comid = util.getComId(com);
-                let src = util.findComponentInTemplate(com, template);
-                if (!src) {
-                    util.error('找不到组件：' + com.tagName, '\n请尝试使用 npm install ' + com.tagName + ' 安装', '错误');
-                } else {
-                    let comWpy = cWpy.resolveWpy(src);
-                    let newnode = this.compileXML(this.getTemplate(comWpy.template.code), comWpy.template, template, this.getPrefix(prefix ? `${prefix}$${comid}` : `${comid}`), com.childNodes, comAttributes, template.props[comid]);
-                    node.replaceChild(newnode, com);
-                }
-            });
-        });
-
-
-        let componentElements = util.elemToArray(node.getElementsByTagName('component'));
-        let customElements = [];
-        Object.keys(template.components).forEach((com) => {
-            customElements = customElements.concat(util.elemToArray(node.getElementsByTagName(com)));
-        });
-
-        componentElements = componentElements.concat(customElements);
-
-        componentElements.forEach((com) => {
-            let comid, definePath, isCustom = false, comAttributes = {};
-            [].slice.call(com.attributes || []).forEach((attr) => {
-                if (['hidden', tagprefix + ':if', tagprefix + ':elif', tagprefix + ':else', 'class'].indexOf(attr.name) > -1) {
-                    comAttributes[attr.name] = attr.value;
-                }
-            });
-            if (com.nodeName === 'component') {
-                comid = util.getComId(com);
-                definePath = util.getComPath(com);
-                if (!comid)
-                    throw new Error('Unknow component id');
-            } else {
-                isCustom = true;
-                comid = util.getComId(com);
-                definePath = template.components[comid];
-                definePath = definePath.indexOf('.') === -1 ? definePath : path.resolve(template.src, '..' + path.sep + template.components[comid])
-            }
-
-            let src = util.findComponent(definePath, isCustom);
-            if (!src) {
-                util.error('找不到组件：' + definePath, '\n请尝试使用 npm install ' + definePath + ' 安装', '错误');
-            } else {
-                let comWpy = cWpy.resolveWpy(src);
-                let newnode = this.compileXML(this.getTemplate(comWpy.template.code), comWpy.template, template, this.getPrefix(prefix ? `${prefix}$${comid}` : `${comid}`), com.childNodes, comAttributes);
-                
-                node.replaceChild(newnode, com);
-            }
-        });
-        return node;
-    },
-
-    compile (template) {
-        let lang = template.type;
-        let content = util.attrReplace(template.code);
-
-        let config = util.getConfig();
-        let src = cache.getSrc();
-        let dist = cache.getDist();
-        let self = this;
-
-
-        let compiler = loader.loadCompiler(lang);
-
-        if (!compiler) {
-            return;
-        }
-
-        if (lang === 'pug') { // fix indent for pug, https://github.com/wepyjs/wepy/issues/211
-            let indent = util.getIndent(content);
-            if (indent.firstLineIndent) {
-                content = util.fixIndent(content, indent.firstLineIndent * -1, indent.char);
-            }
-        }
-
-        compiler(content, config.compilers[lang] || {}).then(content => {
-            let opath = path.parse(template.src);
-            let node = cWpy.createParser(opath).parseFromString(content);
-            node = this.compileXML(node, template);
-            opath.npm = template.npm;
-            let target = util.getDistPath(opath, config.output === 'ant' ? 'axml' : 'wxml', src, dist);
-
-            if (node.childNodes.length === 0) {
-                // empty node tostring will cause an error.
-                node = '';
-            } else {
-                // https://github.com/jindw/xmldom/blob/master/dom.js#L585
-                // https://github.com/jindw/xmldom/blob/master/dom.js#L919
-                // if childNode is only one Text, then will get an error in doc.toString
-                if (node.documentElement === null && node.nodeType === 9) {
-                    node.nodeType = 11;
-                }
-                // xmldom will auto generate something like xmlns:wx.
-                node = node.toString().replace(/xmlns[^\s>]*/g, '');
-            }
-
-            let plg = new loader.PluginHelper(config.plugins, {
-                type: 'wxml',
-                code: util.decode(node.toString()),
-                file: target,
-                output (p) {
-                    util.output(p.action, p.file);
-                },
-                done (rst) {
-                    util.output('写入', rst.file);
-                    rst.code = self.replaceBooleanAttr(rst.code);
-                    util.writeFile(target, rst.code);
-                }
-            });
-        }).catch((e) => {
-            console.log(e);
-        });
-
-        //util.log('WXML: ' + path.relative(process.cwd(), target), '写入');
-        //util.writeFile(target, util.decode(node.toString()));
-    }
-}
diff --git a/packages/wepy-cli/src/compile-wpy.js b/packages/wepy-cli/src/compile-wpy.js
deleted file mode 100644
index cd9d5e6c4..000000000
--- a/packages/wepy-cli/src/compile-wpy.js
+++ /dev/null
@@ -1,508 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import path from 'path';
-import fs from 'fs';
-import {DOMParser} from 'xmldom';
-import eslint from './eslint';
-import cache from './cache';
-import util from './util';
-
-import cConfig from './compile-config';
-/*import cLess from './compile-less';
-import cSass from './compile-sass';
-import cCss from './compile-css';*/
-import cStyle from './compile-style';
-import cTemplate from './compile-template';
-import cScript from './compile-script';
-import toWeb from './web/index';
-import loader from './loader';
-
-export default {
-    _cacheWpys: {},
-    createParser (opath) {
-        return new DOMParser({errorHandler: {
-            warning (x) {
-                if (x.indexOf('missed value!!') > -1) {
-                    // ignore warnings
-                } else {
-                    if (!opath) {
-                        util.warning(x);
-                    } else {
-                        util.warning('WARNING IN : ' + path.relative(util.currentDir, path.join(opath.dir, opath.base)) + '\n' + x);
-                    }
-                }
-            },
-            error (x) {
-                if (!opath) {
-                    util.error(x);
-                } else {
-                    util.error('ERROR IN : ' + path.relative(util.currentDir, path.join(opath.dir, opath.base)) + '\n' + x);
-                }
-            }
-        }});
-    },
-
-    grabConfigFromScript(str, n) {
-        let stash = [], rst = '';
-        for (let i = n, l = str.length; i < l; i++) {
-            if (str[i] === '{')
-                stash.push('{');
-            if (str[i] === '}') {
-                stash.pop();
-                if (stash.length === 0) {
-                    rst += '}';
-                    break;
-                }
-            }
-            if (stash.length) {
-                rst += str[i];
-            }
-        }
-        return rst;
-    },
-    /*
-    Use components instead, unused functions
-     */
-    resolveRelation (xml) {
-        let requires = [];
-        let matchs = xml.match(/<component[^/>]*\/>/ig);
-
-        (matchs || []).forEach(function (m) {
-            let rst;
-            if (m.indexOf('path') > -1) {
-                rst = m.match(/path\s*=\s*['"](.*)['"]/);
-            } else {
-                rst = m.match(/id\s*=\s*['"](.*)['"]/);
-            }
-            if (rst[1] && requires.indexOf(rst[1]) === -1)
-                requires.push(rst[1]);
-        });
-        return requires;
-    },
-
-    resolveWpy (xml, opath) {
-        let config = util.getConfig();
-        let filepath;
-
-        if (typeof(xml) === 'object' && xml.dir) {
-            opath = xml;
-            filepath = path.join(xml.dir, xml.base);
-        } else {
-            opath = path.parse(xml);
-            filepath = xml;
-        }
-        filepath = path.resolve(filepath); // to fixed windows path bug
-        let content = util.readFile(filepath);
-
-
-        const moduleId = util.genId(filepath);
-
-        let rst = {
-            moduleId: moduleId,
-            style: [],
-            template: {
-                code: '',
-                src: '',
-                type: ''
-            },
-            script: {
-                code: '',
-                src: '',
-                type: ''
-            }
-        };
-
-        if (content === null) {
-            util.error('打开文件失败: ' + filepath);
-            return rst;
-        }
-        if (content === '') {
-            util.warning('发现空文件: ' + filepath);
-            return rst;
-        }
-
-        let startlen = content.indexOf('<script') + 7;
-        if (startlen >= 7 && content.length >= 8) { // this is no scripts
-            while(content[startlen++] !== '>') {
-                // do nothing;
-            }
-            content = util.encode(content, startlen, content.indexOf('</script>') - 1);
-        }
-        // replace :attr to v-bind:attr
-        /*content = content.replace(/<[\w-\_]*\s[^>]*>/ig, (tag) => {
-            return tag.replace(/\s+:([\w-_]*)([\.\w]*)\s*=/ig, (attr, name, type) => { // replace :param.sync => v-bind:param.sync
-                if (type === '.once' || type === '.sync') {
-                }
-                else
-                    type = '.once';
-                return ` v-bind:${name}${type}=`;
-            }).replace(/\s+\@([\w-_]*)\s*=/ig, (attr, name) => { // replace @change => v-on:change
-                return `v-on:${name}`;
-            });
-        })*/
-
-        if (content.indexOf('<template') !== -1) {
-            content = util.attrReplace(content);
-        }
-
-        xml = this.createParser(opath).parseFromString(content);
-
-        [].slice.call(xml.childNodes || []).forEach((child) => {
-            const nodeName = child.nodeName;
-            if (nodeName === 'style' || nodeName === 'template' || nodeName === 'script') {
-                let rstTypeObj;
-
-                if (nodeName === 'style') {
-                    rstTypeObj = {code: ''};
-                    rst[nodeName].push(rstTypeObj);
-                } else {
-                    rstTypeObj = rst[nodeName];
-                }
-
-                rstTypeObj.src = child.getAttribute('src');
-                rstTypeObj.type = child.getAttribute('lang') || child.getAttribute('type');
-                if (nodeName === 'style') {
-                    // 针对于 style 增加是否包含 scoped 属性
-                    rstTypeObj.scoped = child.getAttribute('scoped') ? true : false;
-                }
-
-                if (rstTypeObj.src) {
-                    rstTypeObj.src = path.resolve(opath.dir, rstTypeObj.src);
-                    rstTypeObj.link = true;
-                } else {
-                    rstTypeObj.link = false;
-                }
-
-                if (rstTypeObj.src && util.isFile(rstTypeObj.src)) {
-                    const fileCode = util.readFile(rstTypeObj.src, 'utf-8');
-                    if (fileCode === null) {
-                        throw '打开文件失败: ' + rstTypeObj.src;
-                    } else {
-                        rstTypeObj.code += fileCode;
-                    }
-                } else {
-                    [].slice.call(child.childNodes || []).forEach((c) => {
-                        rstTypeObj.code += util.decode(c.toString());
-                    });
-                }
-
-                if (!rstTypeObj.src)
-                    rstTypeObj.src = path.join(opath.dir, opath.name + opath.ext);
-            }
-        });
-
-        /*
-        Use components instead
-        if (rst.template.code) {
-            rst.template.requires = this.resolveRelation(rst.template.code);
-        }*/
-
-        // default type
-        rst.template.type = rst.template.type || 'wxml';
-        rst.script.type = rst.script.type || 'babel';
-
-        // get config
-        (() => {
-            let match = rst.script.code.match(/[\s\r\n]config\s*=[\s\r\n]*/);
-            match = match ? match[0] : undefined;
-
-            rst.config = match ? this.grabConfigFromScript(rst.script.code, rst.script.code.indexOf(match) + match.length) : false;
-            try {
-                if (rst.config) {
-                    rst.config = new Function(`return ${rst.config}`)();
-                }
-            } catch (e) {
-                util.output('错误', path.join(opath.dir, opath.base));
-                util.error(`解析config出错，报错信息：${e}\r\n${rst.config}`);
-            }
-        })();
-
-        // pre compile wxml
-        (() => {
-            if (rst.template.type !== 'wxml' && rst.template.type !== 'xml') {
-                let compiler = loader.loadCompiler(rst.template.type);
-                if (compiler && compiler.sync) {
-                    if (rst.template.type === 'pug') { // fix indent for pug, https://github.com/wepyjs/wepy/issues/211
-                        let indent = util.getIndent(rst.template.code);
-                        if (indent.firstLineIndent) {
-                            rst.template.code = util.fixIndent(rst.template.code, indent.firstLineIndent * -1, indent.char);
-                        }
-                    }
-                    let compilerConfig = config.compilers[rst.template.type];
-
-                    // xmldom replaceNode have some issues when parsing pug minify html, so if it's not set, then default to un-minify html.
-                    if (compilerConfig.pretty === undefined) {
-                        compilerConfig.pretty = true;
-                    }
-                    rst.template.code = compiler.sync(rst.template.code, config.compilers[rst.template.type] || {});
-                    rst.template.type = 'wxml';
-                }
-            }
-            if (rst.template.code)
-                rst.template.node = this.createParser(opath).parseFromString(util.attrReplace(rst.template.code));
-        })();
-
-        // get imports
-        (() => {
-            let coms = {};
-            rst.script.code.replace(/import\s*([\w\-\_]*)\s*from\s*['"]([\w\-\_\.\/\@]*)['"]/ig, (match, com, path) => {
-                coms[com] = path;
-            });
-
-            let match = rst.script.code.match(/[\s\r\n]components\s*=[\s\r\n]*/);
-            match = match ? match[0] : undefined;
-            let components = match ? this.grabConfigFromScript(rst.script.code, rst.script.code.indexOf(match) + match.length) : false;
-            let vars = Object.keys(coms).map((com, i) => `var ${com} = "${coms[com]}";`).join('\r\n');
-            try {
-                if (components) {
-                    rst.template.components = new Function(`${vars}\r\nreturn ${components}`)();
-                } else {
-                    rst.template.components = {};
-                }
-            } catch (e) {
-                util.output('错误', path.join(opath.dir, opath.base));
-                util.error(`解析components出错，报错信息：${e}\r\n${vars}\r\nreturn ${components}`);
-            }
-        })();
-
-
-        // get props and events
-        (() => {
-            if (!rst.template.node)
-                return;
-            let coms = Object.keys(rst.template.components);
-            let elems = [];
-            let props = {};
-            let events = {};
-            let $repeat = {};
-
-            let repeatItem = '';
-
-            let calculatedComs = [];
-
-            // Get components in repeat
-            util.elemToArray(rst.template.node.getElementsByTagName('repeat')).forEach(repeat => {
-                elems = [];
-                if (repeat.getAttribute('for')) {
-                    let tmp = {
-                        for: repeat.getAttribute('for').replace(/^\s*\{\{\s*/, '').replace(/\s*\}\}\s*$/, ''),
-                        item: repeat.getAttribute('item') || 'item',
-                        index: repeat.getAttribute('index') || 'index',
-                        key: repeat.getAttribute('key') || 'key',
-                    }
-                    coms.concat('component').forEach((com) => {
-                        elems = elems.concat(util.elemToArray(repeat.getElementsByTagName(com)));
-                    });
-
-                    elems.forEach((elem) => {
-                        calculatedComs.push(elem);
-                        let comid = util.getComId(elem);
-                        let forexp = tmp.for;
-                        if (forexp.indexOf('.') > -1) {  // for="{{mydata.list}}"
-                            forexp = forexp.split('.')[0];
-                        }
-                        $repeat[forexp] = { com: comid };
-                        [].slice.call(elem.attributes || []).forEach((attr) => {
-                            if (attr.name !== 'xmlns:v-bind=""') {
-                                if (attr.name !== 'id' && attr.name !== 'path') {
-                                    if (/v-on:/.test(attr.name)) { // v-on:fn user custom event
-                                        if (!events[comid])
-                                            events[comid] = {};
-                                        events[comid][attr.name] = attr.value;
-                                    } else {
-                                        if (!props[comid])
-                                            props[comid] = {};
-                                        if (['hidden', 'wx:if', 'wx:elif', 'wx:else'].indexOf(attr.name) === -1) {
-                                            let assign = { value: attr.value };
-                                            switch (assign.value) {
-                                                case tmp.item:
-                                                    assign.type = 'item';
-                                                    repeatItem = attr.name.replace('v-bind:', '').replace('.once', '');
-                                                    break;
-                                                case tmp.index:
-                                                    assign.type = 'index';
-                                                    break;
-                                                case tmp.key:
-                                                    assign.type = 'key';
-                                                    break;
-                                            }
-                                            props[comid][attr.name] = Object.assign(assign, tmp);
-                                        }
-                                    }
-                                }
-                            }
-                        });
-
-                        $repeat[forexp].props = repeatItem;
-                    });
-                }
-            });
-
-            elems = [];
-            coms.concat('component').forEach((com) => {
-                elems = elems.concat(util.elemToArray(rst.template.node.getElementsByTagName(com)));
-            });
-
-            elems.forEach((elem) => {
-                // ignore the components calculated in repeat.
-                if (calculatedComs.indexOf(elem) === -1) {
-                    let comid = util.getComId(elem);
-                    [].slice.call(elem.attributes || []).forEach((attr) => {
-                        if (attr.name !== 'id' && attr.name !== 'path') {
-                            if (/v-on:/.test(attr.name)) { // v-on:fn user custom event
-                                if (!events[comid])
-                                    events[comid] = {};
-                                events[comid][attr.name] = attr.value;
-                            } else {
-                                if (!props[comid])
-                                    props[comid] = {};
-                                if (['hidden', 'wx:if', 'wx:elif', 'wx:else'].indexOf(attr.name) === -1) {
-                                    props[comid][attr.name] = attr.value;
-                                }
-                            }
-                        }
-                    });
-                }
-            });
-            if (Object.keys(props).length) {
-                rst.script.code =rst.script.code.replace(/[\s\r\n]components\s*=[\s\r\n]*/, (match, item, index) => {
-                    return `$repeat = ${JSON.stringify($repeat)};\r\n$props = ${JSON.stringify(props)};\r\n$events = ${JSON.stringify(events)};\r\n${match}`;
-                });
-            }
-        })();
-
-        if (rst.style.some(v => v.scoped) && rst.template.code) {
-            // 存在有 scoped 部分就需要 更新 template.code
-            var node = this.createParser(opath).parseFromString(rst.template.code);
-            walkNode(node, rst.moduleId);
-            // 更新 template.code
-            rst.template.code = node.toString();
-        }
-        this._cacheWpys[filepath] = rst;
-        return this._cacheWpys[filepath];
-        // return rst;
-    },
-
-    remove (opath, ext) {
-        let src = cache.getSrc();
-        let dist = cache.getDist();
-        ext = ext || opath.substr(1);
-        let target = util.getDistPath(opath, ext, src, dist);
-        if (util.isFile(target)) {
-            util.log('配置: ' + path.relative(util.currentDir, target), '删除');
-            fs.unlinkSync(target);
-        }
-    },
-
-    lint (filepath) {
-        eslint(filepath);
-    },
-
-    compile (opath) {
-        let filepath = path.join(opath.dir, opath.base);
-        let src = cache.getSrc();
-        let dist = cache.getDist();
-        let wpyExt = cache.getExt();
-        let pages = cache.getPages();
-
-        let type = '';
-        let relative = path.relative(util.currentDir, filepath);
-
-        if (filepath === path.join(util.currentDir, src, 'app' + wpyExt)) {
-            type = 'app';
-            util.log('入口: ' + relative, '编译');
-        } else if (pages.indexOf(relative) > -1) {
-            type = 'page';
-            util.log('页面: ' + relative, '编译');
-        } else if (relative.indexOf(path.sep + 'components' + path.sep) > -1){
-            type = 'component';
-            util.log('组件: ' + relative, '编译');
-        } else {
-            util.log('Other: ' + relative, '编译');
-        }
-
-        // Ignore all node modules, avoid eslint warning.
-        // https://github.com/eslint/eslint/blob/75b7ba4113db4d9bc1661a4600c8728cf3bfbf2b/lib/cli-engine.js#L325
-        if (!opath.npm) {
-            this.lint(filepath);
-        }
-
-        let wpy = this.resolveWpy(opath);
-
-        if (!wpy) {
-            return;
-        }
-
-        if (type === 'app') { // 第一个编译
-            cache.setPages(wpy.config.pages.map(v => path.join(src, v + wpyExt)));
-
-            // scoped 设置无效
-            wpy.style.forEach(rst => rst.scoped = false);
-
-            // 无template
-            delete wpy.template;
-
-        } else if (type === 'component') {
-            delete wpy.config;
-        }
-
-        if (wpy.config) {
-            cConfig.compile(wpy.config, opath);
-        } else {
-            this.remove(opath, 'json');
-        }
-
-        if (wpy.style.length || (wpy.template  && wpy.template.components && Object.keys(wpy.template.components).length)) {
-            let requires = [];
-            let k, tmp;
-            if (wpy.template) {
-                for (k in wpy.template.components) {
-                    tmp = wpy.template.components[k];
-                    if (tmp.indexOf('.') === -1) {
-                        requires.push(tmp); // 第三方组件
-                    } else {
-                        requires.push(path.join(opath.dir, wpy.template.components[k]));
-                    }
-                }
-            }
-            try {
-                cStyle.compile(wpy.style, requires, opath, wpy.moduleId);
-            } catch (e) {
-                util.error(e);
-            }
-        } else {
-            this.remove(opath, 'wxss');
-        }
-
-        if (wpy.template && wpy.template.code && type !== 'component') { // App 和 Component 不编译 wxml
-            //cTemplate.compile(wpy.template.type, wpy.template.code, opath);
-            wpy.template.npm = opath.npm;
-            cTemplate.compile(wpy.template);
-        }
-
-        if (wpy.script.code) {
-            cScript.compile(wpy.script.type, wpy.script.code, type, opath);
-        }
-    }
-};
-
-function walkNode (node, moduleId) {
-    if (node.childNodes) {
-        [].slice.call(node.childNodes || []).forEach((child) => {
-            if (child.tagName) {
-                // 是标签 则增加class
-                const cls = child.getAttribute('class');
-                child.setAttribute('class', (cls + ' ' + moduleId).trim());
-                walkNode(child, moduleId);
-            }
-        });
-    }
-}
diff --git a/packages/wepy-cli/src/compile.js b/packages/wepy-cli/src/compile.js
deleted file mode 100644
index ba1e52654..000000000
--- a/packages/wepy-cli/src/compile.js
+++ /dev/null
@@ -1,396 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import path from 'path';
-import chokidar from 'chokidar';
-import compareVersions from 'compare-versions';
-import ignore from 'ignore';
-
-import cache from './cache';
-import util from './util';
-import cWpy from './compile-wpy';
-import cStyle from './compile-style';
-import cScript from './compile-script';
-
-import loader from './loader';
-import resolve from './resolve';
-
-import toWeb from './web/index';
-
-let watchReady = false;
-let preventDup = {};
-
-
-export default {
-    /**
-     * find parent, import xxxx from xxx;
-     */
-    findParents (file) {
-        let src = cache.getSrc();
-        let files = util.getFiles(src);
-        let ext = cache.getExt();
-
-        let parents = [];
-
-        let reg = new RegExp('\\.(' + ext.substr(1) + '|js)$');
-
-        files = files.filter((v) => reg.test(v));
-
-        files.forEach((f) => {
-            let opath = path.parse(path.join(util.currentDir, src, f));
-            let content = util.readFile(opath);
-            content && content.replace(/import\s*([{\w\d-_}]*)\s*from\s*['"](.*)['"]/ig, (match, name, importpath) => {
-                reg = new RegExp('\\' + ext + '$');
-                if (!reg.test(importpath))
-                    importpath = importpath + ext;
-                let resolved = resolve.resolveAlias(importpath);
-                let compath;
-                if (path.isAbsolute(resolved)) {
-                    compath = path.resolve(resolved);
-                } else {
-                    compath = path.join(opath.dir, resolved);
-                }
-                if (compath === path.join(util.currentDir, src, file)) {
-                    if (!reg.test(f)) {
-                        parents = parents.concat(this.findReference(f));
-                    } else {
-                        // 组件的父组件无需更新，只有父页面需要更新
-                        if (f.indexOf('components') !== -1) { // 如果是父组件，继续查找父组件的父页面。
-                            parents = parents.concat(this.findParents(f));
-                        } else
-                            parents.push(f);
-                    }
-                }
-            });
-        });
-        return util.unique(parents).filter((v) => v.indexOf('components') === -1);
-    },
-    _cacheReferences: null,
-    /**
-     * find src, <script src="">
-     */
-    findReference (file) {
-        let src = cache.getSrc();
-        let files = util.getFiles(src);
-        let ext = cache.getExt();
-
-        let refs = [];
-        let filepath = path.join(util.currentDir, src, file);
-
-        if (this._cacheReferences === null) {
-            this._cacheReferences = {};
-            let reg = new RegExp('\\' + ext + '$');
-
-            files = files.filter((v) => reg.test(v));
-
-            files.forEach((f) => {
-                let opath = path.parse(path.join(util.currentDir, src, f));
-                let content = util.readFile(opath);
-
-                let wpy = cWpy.resolveWpy(opath);
-                let links = {};
-
-                ['script', 'template', 'style'].forEach(t => {
-                    if (wpy[t]) {
-                        if (wpy[t].link === true) {
-                            this._cacheReferences[wpy[t].src] = this._cacheReferences[wpy[t].src] || [];
-                            this._cacheReferences[wpy[t].src].push(f);
-                        } else if (wpy[t].link === undefined && wpy[t].length) { // styles
-                            wpy[t].forEach(s => {
-                                if (s.link) {
-                                    this._cacheReferences[s.src] = this._cacheReferences[s.src] || [];
-                                    this._cacheReferences[s.src].push(f);
-                                }
-                            });
-                        }
-                    }
-                });
-            });
-        }
-        return this._cacheReferences[filepath] || [];
-    },
-    watch (config) {
-        config.watch = false;
-
-        let wepyrc = util.getConfig();
-        let src = config.source || wepyrc.src || 'src';
-        let dist = config.output || wepyrc.output || 'dist';
-        chokidar.watch(`.${path.sep}${src}`, config.watchOption || {}).on('all', (evt, filepath) => {
-            if ((evt === 'change' || evt === 'add') && watchReady && !preventDup[filepath]) {
-                preventDup[filepath] = evt;
-                config.file = path.join('..', filepath);
-                util.log('文件: ' + filepath, '变更');
-                this.build(config);
-                setTimeout(() => {
-                    preventDup[filepath] = false;
-                }, 500);
-            }
-        }).on('ready', () => {
-            watchReady = true;
-            util.log('开始监听文件改动。', '信息');
-        });
-    },
-    checkCompiler (compilers) {
-        if (compilers === undefined) {
-            util.log('检测到老版本config文件，请先更新配置文件版本，参考链接：https://github.com/wepyjs/wepy#wepyconfigjs-配置文件说明', '错误');
-            return false;
-        }
-        let k, exsit = true;
-        for (k in compilers) {
-            if (!loader.loadCompiler(k)) {
-                return false;
-            }
-        }
-        return true;
-    },
-    checkPlugin (plugins = {}) {
-        return loader.loadPlugin(plugins);
-    },
-
-    wepyUpdate(required = '1.6.0') {
-        let o = resolve.getPkg('wepy') || {};
-        let pkg = o.pkg || {version: '0.0.0'};
-        return compareVersions(required, pkg.version) === 1;
-    },
-
-    init (config) {
-        let wepyrc = util.getConfig();
-        if (!wepyrc) {
-            util.error('没有检测到wepy.config.js文件, 请执行`wepy new demo`创建');
-            return false;
-        }
-        resolve.init(wepyrc.resolve || {});
-        loader.attach(resolve);
-
-        if (this.wepyUpdate()) { // 需要更新wepy版本
-            util.log('检测到wepy版本不符合要求，正在尝试更新，请稍等。', '信息');
-            util.exec(`npm install wepy --save`).then(d => {
-                util.log(`已完成更新，重新启动编译。`, '完成');
-                config.cache = false;
-                this.build(config);
-            }).catch(e => {
-                util.log(`安装wepy失败，请尝试运行命令 "npm install wepy --save" 进行安装。`, '错误');
-                console.log(e);
-            });
-            return false;
-        }
-
-        if (!this.checkCompiler(wepyrc.compilers) || !this.checkPlugin(wepyrc.plugins)) {
-            util.exec(`npm info ${loader.missingNPM}`, true).then(d => {
-                util.log('检测到有效NPM包资源，正在尝试安装，请稍等。', '信息');
-                util.exec(`npm install ${loader.missingNPM} --save-dev`).then(d => {
-                    util.log(`已完成安装 ${loader.missingNPM}，重新启动编译。`, '完成');
-                    this.build(config);
-                }).catch(e => {
-                    util.log(`安装插件失败：${loader.missingNPM}，请尝试运行命令 "npm install ${loader.missingNPM} --save-dev" 进行安装。`, '错误');
-                    console.log(e);
-                });
-            }).catch(e => {
-                util.log(`不存在插件：${loader.missingNPM}，请检测是否拼写错误。`, '错误');
-                console.log(e);
-            });
-            return false;
-        }
-
-
-
-        if (config.output === 'web') {
-            wepyrc.web = wepyrc.web || {};
-            wepyrc.web.dist = wepyrc.web.dist || 'web';
-            wepyrc.web.src = wepyrc.web.src || 'src';
-            wepyrc.output = 'web';
-
-            if (!resolve.getPkg('wepy-web')) {
-                util.log('正在尝试安装缺失资源 wepy-web，请稍等。', '信息');
-                util.exec(`npm install wepy-web --save`).then(d => {
-                    util.log(`已完成安装 wepy-web，重新启动编译。`, '完成');
-                    this.build(config);
-                }).catch(e => {
-                    util.log(`安装插件失败：wepy-web，请尝试运行命令 "npm install wepy-web --save" 进行安装。`, '错误');
-                    console.log(e);
-                });
-                return false;
-            }
-        } else if (config.output === 'ant') {
-            wepyrc.ant = wepyrc.ant || {};
-            wepyrc.ant.dist = wepyrc.ant.dist || 'ant';
-            wepyrc.ant.src = wepyrc.ant.src || 'src';
-            wepyrc.output = 'ant';
-
-            if (!resolve.getPkg('wepy-ant')) {
-                util.log('正在尝试安装缺失资源 wepy-ant，请稍等。', '信息');
-                util.exec(`npm install wepy-ant --save`).then(d => {
-                    util.log(`已完成安装 wepy-ant，重新启动编译。`, '完成');
-                    this.build(config);
-                }).catch(e => {
-                    util.log(`安装插件失败：wepy-ant，请尝试运行命令 "npm install wepy-ant --save" 进行安装。`, '错误');
-                    console.log(e);
-                });
-                return false;
-            }
-        }
-        return true;
-    },
-
-    build (config) {
-
-        let wepyrc = util.getConfig();
-
-        let src = config.source || wepyrc.src;
-        let dist = config.output || wepyrc.output;
-        let ext = config.wpyExt || wepyrc.wpyExt;
-
-        if (src === undefined)
-            src = 'src';
-        if (dist === undefined)
-            dist = 'dist';
-        if (ext === undefined)
-            ext = '.wpy';
-
-        config.source = src;
-        config.dist = dist;
-        config.wpyExt = ext;
-
-        if (ext.indexOf('.') === -1)
-            ext = '.' + ext;
-
-        // WEB 模式下，不能指定文件编译
-        let file = (config.output !== 'web') ? config.file : '';
-
-        let current = process.cwd();
-        let files = file ? [file] : util.getFiles(src);
-
-        cache.setParams(config);
-        cache.setSrc(src);
-        cache.setDist(dist);
-        cache.setExt(ext);
-
-
-        // If dist/npm/wepy is not exsit, then clear the build cache.
-        if (!util.isDir(path.join(util.currentDir, dist, 'npm', 'wepy'))) {
-            config.cache = false;
-        }
-        if (!config.cache) {
-            cache.clearBuildCache();
-        }
-
-        if (file) { // 指定文件编译时
-            if (file.indexOf(ext) === -1) { // 是wpy文件，则直接编译，否则检查引用源
-                let refs = this.findReference(file);
-                if (refs.length === 0) { // 无引用源时，编译当前文件，否则编译引用源。
-                    files = [file];
-                } else {
-                    files = refs;
-                }
-            } else if (file.indexOf('components') !== -1) { // 是wpy 文件，而且是组件
-                let parents = this.findParents(file);
-                files = parents.concat([file]);
-            }
-        }
-
-        if (files.some((v) => v === 'app' + ext)) { // 如果编译文件包含app.wpy，且第一个不是 app.wpy
-            if (util.isFile(path.join(current, src, 'app' + ext))) { // src/app.wpy 存在, 则把它放在第一位, 因为后面需要取页面路径
-                let newFiles = ['app' + ext].concat(files.filter(v => v !== 'app' + ext));
-                files = newFiles;
-            } else {
-                util.error('根目录不存在app' + ext);
-            }
-        }
-
-        let igfiles = util.getIgnore();
-        if (igfiles) {
-            let ig = ignore().add(igfiles);
-            files = ig.filter(files);
-        }
-        if (wepyrc.cliLogs) {
-            util.cliLogs = true;
-            util.clearLog();
-        } else {
-            util.removeLog();
-        }
-
-        if (config.output === 'web') {
-            files.forEach((f, i) => {
-                if (i === 0) {
-                    toWeb.toWeb(f, config.platform || 'browser');
-                } else {
-                    toWeb.copy(path.join(util.currentDir, src, f));
-                }
-            })
-        } else {
-            files.forEach((f) => {
-                let opath = path.parse(path.join(current, src, f));
-                if (file) {
-                    this.compile(opath);
-                } else { // 不指定文件编译时，跳过引用文件编译
-                    let refs = this.findReference(f);
-                    if (!refs.length)
-                        this.compile(opath);
-                }
-            });
-        }
-        if (config.watch) {
-            util.isWatch = true;
-            this.watch(config);
-        }
-    },
-    compile(opath) {
-        let src = cache.getSrc();
-        let dist = cache.getDist();
-        let ext = cache.getExt();
-        let config = util.getConfig();
-
-        if (!util.isFile(opath)) {
-            util.error('文件不存在：' + util.getRelative(opath));
-            return;
-        }
-
-        switch(opath.ext) {
-            case ext:
-                cWpy.compile(opath);
-                break;
-            case '.less':
-                cStyle.compile('less', opath);
-                break;
-            case '.sass':
-                cStyle.compile('sass', opath);
-                break;
-            case '.scss':
-                cStyle.compile('scss', opath);
-                break;
-            case '.js':
-                cScript.compile('babel', null, 'js', opath);
-                break;
-            default:
-                util.output('拷贝', path.join(opath.dir, opath.base));
-
-                let plg = new loader.PluginHelper(config.plugins, {
-                    type: opath.ext.substr(1),
-                    code: null,
-                    file: path.join(opath.dir, opath.base),
-                    output (p) {
-                        util.output(p.action, p.file);
-                    },
-                    done (rst) {
-                        if (rst.code) {
-                            let target = util.getDistPath(path.parse(rst.file));
-                            util.writeFile(target, rst.code);
-                        } else {
-                            util.copy(path.parse(rst.file));
-                        }
-                    },
-                    error (rst) {
-                        util.warning(rst.err);
-                        util.copy(path.parse(rst.file));
-                    }
-                });
-        }
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy-cli/src/eslint.js b/packages/wepy-cli/src/eslint.js
deleted file mode 100644
index ec2b40814..000000000
--- a/packages/wepy-cli/src/eslint.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import loader from './loader';
-import util from './util';
-
-export default function (filepath) {
-    let config = util.getConfig();
-
-    if (config.eslint) {
-        const compiler = loader.load('wepy-eslint');
-
-        if (!compiler) {
-            util.warning('未安装wepy-eslint，执行npm install wepy-eslint --save-dev 或者在wepy.config.js中关闭eslint选项');
-            return;
-        }
-        // 使用 eslint
-        const esConfig = Object.assign({
-            useEslintrc: true,
-            extensions: ['.js', config.wpyExt || '.wpy']
-        }, config.eslint === true ? {} : config.eslint);
-        esConfig.output = false;
-        let rst = compiler(esConfig, filepath);
-        if (rst) {
-            util.writeLog({stack: rst}, 'error');
-            console.log(rst);
-        }
-    }
-};
diff --git a/packages/wepy-cli/src/loader.js b/packages/wepy-cli/src/loader.js
deleted file mode 100644
index c8e91b1bf..000000000
--- a/packages/wepy-cli/src/loader.js
+++ /dev/null
@@ -1,133 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import Module from 'module';
-import path from 'path';
-
-import util from './util';
-
-
-let relativeModules = {};
-let requiredModules = {};
-
-let loadedPlugins = [];
-
-
-class PluginHelper {
-    constructor (plugins, op) {
-        this.applyPlugin(0, op);
-        return true;
-    }
-    applyPlugin (index, op) {
-        let plg = loadedPlugins[index];
-
-        if (!plg) {
-            op.done && op.done(op);
-        } else {
-            op.next = () => {
-                this.applyPlugin(index + 1, op);
-            };
-            op.catch = () => {
-                op.error && op.error(op);
-            };
-            if (plg)
-                plg.apply(op);
-        }
-    }
-}
-
-export default {
-    attach (resolve) {
-        this.resolve = resolve;
-    },
-    loadCompiler (lang) {
-        if (['wxml', 'xml', 'css', 'js'].indexOf(lang) > -1) {
-            return (c) => {
-                return Promise.resolve(c);
-            };
-        }
-
-        let name = 'wepy-compiler-' + lang;
-        let compiler = this.load(name);
-
-        if (!compiler) {
-            this.missingNPM = name;
-            util.log(`找不到编译器：${name}。`, 'warning');
-        }
-        return compiler;
-    },
-
-    getNodeModulePath(loc, relative) {
-        relative = relative || util.currentDir;
-        if (typeof Module === 'object') return null;
-
-        let relativeMod = relativeModules[relative];
-        let paths = [];
-
-        if (!relativeMod) {
-            relativeMod = new Module;
-
-            let filename = path.join(relative, './');
-            relativeMod.id = filename;
-            relativeMod.filename = filename;
-            relativeMod.paths = [].concat(this.resolve.modulePaths);
-
-            paths = Module._nodeModulePaths(relative);
-            relativeModules[relative] = relativeMod;
-        }
-        paths.forEach((v) => {
-            if (relativeMod.paths.indexOf(v) === -1) {
-                relativeMod.paths.push(v);
-            }
-        });
-        try {
-            return Module._resolveFilename(loc, relativeMod);
-        } catch (err) {
-            return null;
-        }
-    },
-    load(loc, relative) {
-
-        if (requiredModules[loc])
-            return requiredModules[loc];
-
-        let modulePath = this.getNodeModulePath(loc, relative);
-        let m = null;
-        try {
-            m = require(modulePath);
-        } catch (e) {
-            if (e.message !== 'missing path')
-                console.log(e);
-        }
-        if (m) {
-            m = m.default ? m.default : m;
-            requiredModules[loc] = m;
-        }
-        return m;
-    },
-
-    loadPlugin(plugins, op) {
-        let plg, plgkey, setting, config;
-        for (plgkey in plugins) {
-            let name = 'wepy-plugin-' + plgkey;
-            setting = plugins[plgkey];
-            plg = this.load(name);
-
-            if (!plg) {
-                this.missingNPM = name;
-                util.log(`找不到插件：${name}。`, 'warning');
-                return false;
-            }
-            loadedPlugins.push(new plg(setting));
-        }
-        return true;
-    },
-    PluginHelper: PluginHelper
-}
\ No newline at end of file
diff --git a/packages/wepy-cli/src/resolve.js b/packages/wepy-cli/src/resolve.js
deleted file mode 100644
index a9473799b..000000000
--- a/packages/wepy-cli/src/resolve.js
+++ /dev/null
@@ -1,140 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import path from 'path';
-import util from './util';
-
-export default {
-    init (config) {
-        this.modules = config.modules || ['node_modules'];
-        this.alias = config.alias;
-
-        if (typeof this.modules === 'string') {
-            this.modules = [this.modules];
-        }
-
-        let cwd = process.cwd();
-
-        this.modulePaths = this.modules.map(v => {
-            if (path.isAbsolute(v)) {
-                return v;
-            } else {
-                return path.join(cwd, v);
-            }
-        });
-        this._cacheModules = {};
-        this._cacheAlias = {};
-    },
-
-    walk (file) {
-        if (this._cacheModules[file]) {
-            return this._cacheModules[file];
-        }
-
-        let f = null, ext = path.extname(file), dir, modulePath, filename;
-        for (let i = 0, l = this.modulePaths.length; i < l; i++) {
-            modulePath = this.modulePaths[i];
-            filename = path.join(modulePath, file);
-            let tmp = filename;
-            if (ext) {
-                f = util.isFile(tmp);
-            } else {
-                f = util.isFile(filename + '.js');
-            }
-            if (!f && util.isDir(tmp)) {
-                tmp = path.join(filename, 'index.js');
-                f = util.isFile(tmp);
-            }
-            if (f) {
-                filename = tmp;
-                break;
-            }
-        }
-        if (!f) {
-            return null;
-        }
-        this._cacheModules[file] = {
-            modulePath: modulePath,
-            file: filename
-        };
-        return this._cacheModules[file];
-    },
-
-    getPkg (lib) {
-        let pkg = null, dir = null;
-        let o = this.walk(lib + path.sep + 'package.json');
-        if (!o)
-            return null;
-
-        pkg = util.readFile(o.file);
-        if (pkg) {
-            try {
-                pkg = JSON.parse(pkg);
-            } catch (e) {
-                pkg = null;
-            }
-        }
-        if (!pkg)
-            return null;
-        return {
-            pkg: pkg,
-            modulePath: o.modulePath,
-            dir: path.join(o.modulePath, lib)
-        };
-    },
-
-    getMainFile (lib) {
-        let o = this.getPkg(lib);
-        if (!o) {
-            return null;
-        }
-        let main = o.pkg.main || 'index.js';
-        if (o.pkg.browser && typeof o.pkg.browser === 'string') {
-            main = o.pkg.browser;
-        }
-        return {
-            file: main,
-            modulePath: o.modulePath,
-            pkg: o.pkg,
-            dir: o.dir
-        };
-    },
-
-    resolveAlias (lib) {
-        if (!this.alias)
-            return lib;
-        if (this._cacheAlias[lib]) {
-            return this._cacheAlias[lib];
-        }
-        let rst = lib;
-
-        for (let k in this.alias) {
-            let alias = this.alias[k];
-            if (k[k.length - 1] === '$') {
-                k = k.substring(0, k.length - 1);
-                if (k === lib) {
-                    if (path.extname(alias) === '') { // this is directory
-                        this._cacheAlias[lib] = path.join(alias, 'index.js');
-                    } else {
-                        this._cacheAlias[lib] = alias;
-                    }
-                }
-            } else {
-                if ((lib.indexOf(k) === 0 && lib === k) || (lib !== k && lib.indexOf(k + '/') === 0)) {
-                    this._cacheAlias[lib] = path.resolve(lib.replace(k, alias));
-                }
-            }
-        }
-        if (!this._cacheAlias[lib]) {
-            this._cacheAlias[lib] = lib;
-        }
-        return this._cacheAlias[lib];
-    }   
-}
\ No newline at end of file
diff --git a/packages/wepy-cli/src/style-compiler/rpx-convert.js b/packages/wepy-cli/src/style-compiler/rpx-convert.js
deleted file mode 100644
index 6d05b84aa..000000000
--- a/packages/wepy-cli/src/style-compiler/rpx-convert.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import postcss from 'postcss';
-
-let rpxConvert = postcss.plugin('rpx-convert', function () {
-  return function (root) {
-    root.walkDecls(function(decl, i) {
-      // replace page to body
-      if (decl.parent.selector === 'page') {
-        decl.parent.selector = 'body';
-      }
-      if (decl.value.indexOf('px') === -1) {
-        return;
-      }
-      let value = decl.value.replace(/"[^"]+"|'[^']+'|url\([^\)]+\)|(\d*\.?\d+)rpx/ig, (m, $1) => {
-        if (!$1) {
-            return m;
-        }
-        let pixels = parseFloat($1);
-        let fixedVal = pixels / 2;
-        return (fixedVal === 0) ? '0' : fixedVal + 'px';
-      });
-      decl.value = value;
-    });
-  };
-});
-
-export default function handler (content, cb) {
-  return postcss(rpxConvert()).process(content).css;
-}
\ No newline at end of file
diff --git a/packages/wepy-cli/src/style-compiler/scope-id.js b/packages/wepy-cli/src/style-compiler/scope-id.js
deleted file mode 100644
index 4ea9265d7..000000000
--- a/packages/wepy-cli/src/style-compiler/scope-id.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-// copy https://github.com/vuejs/vue-loader/blob/master/lib/style-compiler/plugins/scope-id.js and fix by wepy
-
-import postcss from 'postcss';
-import selectorParser from 'postcss-selector-parser';
-
-export default postcss.plugin('add-id', function (id) {
-    return function (root) {
-        root.each(function rewriteSelector (node) {
-            if (!node.selector) {
-                // handle media queries
-                if (node.type === 'atrule' && node.name === 'media') {
-                    node.each(rewriteSelector);
-                }
-                return;
-            }
-            node.selector = selectorParser(function (selectors) {
-                selectors.each(function (selector) {
-                    var node = null;
-                    selector.each(function (n) {
-                        if (n.type !== 'pseudo') node = n;
-                    });
-                    selector.insertAfter(node, selectorParser.className({
-                        value: id
-                    }));
-                });
-            }).process(node.selector).result;
-        });
-    };
-});
\ No newline at end of file
diff --git a/packages/wepy-cli/src/style-compiler/scoped.js b/packages/wepy-cli/src/style-compiler/scoped.js
deleted file mode 100644
index 3f00250c8..000000000
--- a/packages/wepy-cli/src/style-compiler/scoped.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import postcss from 'postcss';
-import scopeId from './scope-id';
-
-export default function scopedHandler (id, content) {
-  // postcss process 返回结果是 LazyResult
-  // lazy 的 catch then 返回的是 Promise
-  return postcss([scopeId(id)])
-    .process(content)
-    .then(function (result) {
-      return result.css
-    }).catch((e) => {
-      return Promise.reject(e)
-    })
-}
\ No newline at end of file
diff --git a/packages/wepy-cli/src/util.js b/packages/wepy-cli/src/util.js
deleted file mode 100644
index f89420827..000000000
--- a/packages/wepy-cli/src/util.js
+++ /dev/null
@@ -1,611 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-
-import colors from 'colors/safe';
-import fs from 'fs';
-import mkdirp from 'mkdirp';
-import path from 'path';
-import {exec} from 'child_process';
-import hash from 'hash-sum';
-import cache from './cache';
-import resolve from './resolve';
-
-colors.enabled = true;
-
-colors.setTheme({
-    /*SILLY: 'rainbow',
-    INPUT: 'grey',
-    VERBOSE: 'cyan',
-    PROMPT: 'grey',
-    INFO: 'green',
-    DATA: 'grey',
-    HELP: 'cyan',
-    WARN: 'yellow',
-    DEBUG: 'blue',
-    ERROR: 'red',*/
-    'info': 'grey',
-    '变更': 'bgYellow',
-    '删除': 'bgMagenta',
-    '执行': 'blue',
-    '压缩': 'blue',
-    '信息': 'grey',
-    '完成': 'green',
-    '创建': 'green',
-    '监听': 'magenta',
-    '错误': 'red',
-    '测试': 'red',
-    '拷贝': 'yellow',
-    '编译': 'blue',
-    '写入': 'green'
-});
-
-let ID_CACHE = {};
-const utils = {
-
-    seqPromise(promises) {
-        return new Promise((resolve, reject) => {
-
-            let count = 0;
-            let results = [];
-
-            const iterateeFunc = (previousPromise, currentPromise) => {
-                return previousPromise
-                    .then(function (result) {
-                        if (count++ !== 0) results = results.concat(result);
-                        return currentPromise(result, results, count);
-                    })
-                    .catch((err) => {
-                        return reject(err);
-                    });
-            }
-
-            promises = promises.concat(() => Promise.resolve());
-
-            promises.reduce(iterateeFunc, Promise.resolve(false))
-            .then(function (res) {
-                resolve(results);
-            });
-
-        });
-    },
-    exec(cmd, quite) {
-        return new Promise((resolve, reject) => {
-            let fcmd = exec(cmd, (err, stdout, stderr) => {
-                if (err) { reject(err); }
-                else { resolve(stdout, stderr); }
-            });
-            fcmd.stdout.on('data', (chunk) => {
-                !quite && process.stdout.write(chunk);
-            });
-            fcmd.stderr.on('data', (chunk) => {
-                !quite && process.stdout.write(chunk);
-            });
-        });
-    },
-    timeoutExec(sec, cmd, quite) {
-        let timeout = new Promise(function(resolve, reject) { 
-            setTimeout(() => {
-                reject('timeout');
-            }, sec * 1000); 
-        });
-        let task = this.exec(cmd, quite);
-        return Promise.race([timeout, task]);
-    },
-    elemToArray(elems) {
-        let rst = [];
-        for (let i = 0, len = elems.$$length; i < len; i++) {
-            rst.push(elems[i]);
-        }
-        return rst;
-    },
-    getComId(elem) {
-        let tagName = elem.nodeName;
-        let path = elem.getAttribute('path');
-        let id = elem.getAttribute('id');
-        if (tagName !== 'component')
-            return tagName;
-        if (id)
-            return id;
-        if (path && !id)
-            return path;
-    },
-    getComPath(elem) {
-        return elem.getAttribute('path') || this.getComId(elem);
-    },
-    findComponentInTemplate (com, template) {
-        if (typeof(com) !== 'string') {
-            com = this.getComId(com);
-        }
-        let definePath = template.components[com];
-        definePath = definePath.indexOf('.') === -1 ? definePath : path.resolve(template.src, '..' + path.sep + definePath)
-        return this.findComponent(definePath, true);
-    },
-    findComponent(com) {
-        let wpyExt = cache.getExt();
-
-        let src = '';
-        if (com.indexOf(path.sep) !== -1 && com.indexOf('@') === -1) {
-            if (this.isFile(com + wpyExt)) {
-                src = com + wpyExt;
-            }
-        } else {
-            let o = resolve.getMainFile(com);
-            
-            if (o) {
-                src = path.join(o.dir, o.file);
-            } else {
-                let comPath = resolve.resolveAlias(com);
-                if (this.isFile(comPath + wpyExt)) {
-                    src = comPath + wpyExt;
-                } else if (this.isFile(comPath + '/index' + wpyExt)) {
-                    src = comPath + '/index' + wpyExt;
-                } else if (this.isFile(comPath + '/' + com + wpyExt)) {
-                    src = comPath + '/' + com + wpyExt;
-                }
-            }
-        }
-        return src;
-    },
-
-    currentDir: process.cwd(),
-    cliDir: __dirname,
-
-    isFunction (fn) {
-        return typeof(fn) === 'function';
-    },
-    isString (obj) {
-        return toString.call(obj) === '[object String]';
-    },
-    isObject (obj) {
-        return toString.call(obj) === '[object Object]';
-    },
-    isNumber (obj) {
-        return toString.call(obj) === '[object Number]';
-    },
-    isBoolean (obj) {
-        return toString.call(obj) === '[object Boolean]';
-    },
-    isArray (obj) {
-        return Array.isArray(obj);
-    },
-    isFile (p) {
-        p = (typeof(p) === 'object') ? path.join(p.dir, p.base) : p;
-        if (!fs.existsSync(p)) {
-            return false;
-        }
-        return fs.statSync(p).isFile();
-    },
-    isDir (p) {
-        if (!fs.existsSync(p)) {
-            return false;
-        }
-        return fs.statSync(p).isDirectory();
-    },
-    /**
-    * Hyphenate a camelCase string.
-    */
-    hyphenate (str) {
-        return str
-            .replace(/([^-])([A-Z])/g, '$1-$2')
-            .replace(/([^-])([A-Z])/g, '$1-$2')
-            .toLowerCase();
-    },
-    /**
-     * Camelize a hyphen-delimited string.
-     */
-    camelize (str) {
-        return str.replace(/-(\w)/g, (_, c) => c ? c.toUpperCase() : '');
-    },
-    /**
-     * xml dom 对 TEXT_NODE 和 ATTRIBUTE_NODE 进行转义。
-     */
-    decode (content) {
-        let pmap = ['<', '&', '"'];
-        let amap = ['&lt;', '&amp;', '&quot;'];
-        let reg = new RegExp(`(${amap[0]}|${amap[1]}|${amap[2]})`, 'ig');
-        return content.replace(reg, (match, m) => {
-            return pmap[amap.indexOf(m)];
-        });
-    },
-    encode (content, start, end) {
-        start = start || 0;
-        end = end || content.length;
-
-        let buffer = [];
-        let pmap = ['<', '&', '"'];
-        let amap = ['&lt;', '&amp;', '&quot;'];
-
-        let i = 0, c;
-        for (let i = 0, len = content.length; i < len; i++) {
-            if (i < start || i > end) {
-                buffer.push(content[i]);
-            } else {
-                c = pmap.indexOf(content[i]);
-                buffer.push(c === -1 ? content[i] : amap[c]);
-            }
-        }
-        return buffer.join('');
-    },
-    /**
-     * xml replace
-     */
-    attrReplace(content) {
-        const config = utils.getConfig();
-        const knownTags = [
-            // 视图容器
-            'view',
-            'scroll-view',
-            'swiper',
-            'swiper-item',
-
-            // 基础内容
-            'icon',
-            'text',
-            'progress',
-
-            // 表单组件
-            'button',
-            'checkbox-group',
-            'checkbox',
-            'form',
-            'input',
-            'label',
-            'picker',
-            'picker-view',
-            'picker-view-column',
-            'radio-group',
-            'radio',
-            'slider',
-            'switch',
-            'textarea',
-
-            // 导航
-            'navigator',
-
-            // 媒体组件
-            'audio',
-            'image',
-            'video',
-
-            // 地图
-            'map',
-            
-            // 画布
-            'canvas',
-
-            // 客服会话
-            'contact-button'
-        ];
-        const configTags = config.knownTags;
-        if (configTags && Array.isArray(configTags)) {
-            // 增加可配置的 knownTags
-            // 以防止由于小程序升级 上边的默认tag不完全导致的问题
-            // 如果说小程序升级的话 在 wepy 没升级的情况下
-            // 用户可以通过临时加入 knownTags 的方法兼容
-            knownTags.push.apply(knownTags, configTags);
-        }
-        // Exp error when using this code: <input focus wx:if="{{test >
-        if (config.output === 'ant') {
-            content = content.replace(/\s+wx\:(\w+)/ig, (match, name) => {
-                return ' a:' + name;
-            });
-        } 
-        return content.replace(/<([\w-]+)\s*[\s\S]*?(\/|<\/[\w-]+)>/ig, (tag, tagName) => {
-            tagName = tagName.toLowerCase();
-            return tag.replace(/\s+:([\w-_]*)([\.\w]*)\s*=/ig, (attr, name, type) => { // replace :param.sync => v-bind:param.sync
-                if (type === '.once' || type === '.sync') {
-                }
-                else
-                    type = '.once';
-                return ` v-bind:${name}${type}=`;
-            }).replace(/\s+\@([\w-_]*)([\.\w]*)\s*=/ig, (attr, name, type) => { // replace @change => v-on:change
-                let prefix = type !== '.user' ? (type === '.stop' ? 'catch' : 'bind') : 'v-on:';
-                if (config.output === 'ant' && prefix === 'bind') {
-                    prefix = 'on';
-                    name = name[0].toUpperCase() + name.substring(1);
-                }
-                return ` ${prefix}${name}=`;
-            });
-        });
-    },
-    /**
-     * get indent of a mutiple lines string
-     * return {length: 4, char: ' '}
-     */
-    getIndent (str) {
-        let arr = str.split('\n');
-        while (arr.length && !/\w/.test(arr[0])) { // if the first line is empty line, then get rid of it
-            arr.shift();
-        }
-        let indent = {firstLineIndent: 0, indent: 0, char: ''};
-        let s = arr[0], i = 0;
-        if (s.charCodeAt(0) === 32 || s.charCodeAt(0) === 9) { // 32 is space, 9 is tab
-            indent.char = s[0];
-        }
-        while (s[i] === indent.char) {
-            i++;
-        }
-        indent.firstLineIndent = i;
-        if (!arr[1])
-            return indent;
-        s = arr[1], i = 0;
-        if (!indent.char) {
-            if (s.charCodeAt(0) === 32 || s.charCodeAt(0) === 9) { // 32 is space, 9 is tab
-                indent.char = s[0];
-            }
-        }
-        while (s[i] === indent.char) {
-            i++;
-        }
-        indent.indent = i - indent.firstLineIndent;
-        return indent;
-    },
-    /**
-     * Fix indent for a mutiple lines string
-     * @param  {String} str  string to fix
-     * @param  {Number} num  4 means add 4 chars to each line, -4 means remove 4 chars for each line
-     * @param  {String} char space or tab, indent charactor
-     * @return {String}      fixed indent string
-     */
-    fixIndent (str, num, char) {
-        if (char === undefined) {
-            let indent = getIndent(str);
-            char = indent.char;
-        }
-        let arr = str.split('\n');
-        if (num > 0) { // added char to each line
-            arr.forEach(function (v, i) {
-                let p = 0;
-                while(p++ < num) {
-                    arr[i] = char + arr[i]
-                }
-            });
-        } else { // remove char for each line
-            arr.forEach(function (v, i) {
-                arr[i] = arr[i].substr(-1 * num);
-            });
-        }
-        return arr.join('\n');
-    },
-    unique (arr) {
-        let tmp = {}, out = [];
-        arr.forEach((v) => {
-            if (!tmp[v]) {
-                tmp[v] = 1;
-                out.push(v);
-            }
-        });
-        return out;
-    },
-    unlink (p) {
-        let rst = '';
-        p = (typeof(p) === 'object') ? path.join(p.dir, p.base) : p;
-        try {
-            rst = fs.unlinkSync(p);
-        } catch (e) {
-            rst = null;
-        }
-        return rst;
-    },
-    readFile (p) {
-        let rst = '';
-        p = (typeof(p) === 'object') ? path.join(p.dir, p.base) : p;
-        try {
-            rst = fs.readFileSync(p, 'utf-8');
-        } catch (e) {
-            rst = null;
-        }
-        return rst;
-    },
-    mkdir (name) {
-        let rst = true;
-        try {
-            fs.mkdirSync(name);
-        } catch(e) {
-            rst = e;
-        }
-        return rst;
-    },
-    writeFile (p, data) {
-        let opath = (this.isString(p) ? path.parse(p) : p);
-        if (!this.isDir(opath.dir)) {
-            mkdirp.sync(opath.dir);
-        }
-        fs.writeFileSync(p, data);
-    },
-    copy(opath, ext, src, dist) {
-        let target = this.getDistPath(opath, ext, src, dist);
-        this.writeFile(target, this.readFile(path.join(opath.dir, opath.base)));
-        let readable = fs.createReadStream(path.join(opath.dir, opath.base));
-        let writable = fs.createWriteStream(target);
-        readable.pipe(writable);
-    },
-    getRelative(opath) {
-        return path.relative(this.currentDir, path.join(opath.dir, opath.base));
-    },
-    getDistPath(opath, ext, src, dist) {
-        let relative;
-        src = src || cache.getSrc();
-        dist = dist || cache.getDist();
-        if (typeof(opath) === 'string')
-            opath = path.parse(opath);
-        ext = (ext ? (ext[0] === '.' ? ext : ('.' + ext)) : opath.ext);
-        // 第三组件
-        if (opath.npm) {
-            relative = path.relative(opath.npm.modulePath, opath.npm.dir);
-            relative = path.join('npm', relative);
-        } else {
-            relative = path.relative(path.join(this.currentDir, src), opath.dir);
-        }
-        return path.join(this.currentDir, dist, relative, opath.name + ext);
-    },
-    getModifiedTime (p) {
-        return this.isFile(p) ? +fs.statSync(p).mtime : false;
-    },
-    getConfig () {
-        let config = cache.getConfig();
-        if (config)
-            return config;
-
-        let configFile = path.join(this.currentDir, path.sep, 'wepy.config.js');
-        let configType = 'js';
-
-        if (!this.isFile(configFile)) {
-            configFile = path.join(this.currentDir, path.sep, '.wepyrc');
-
-            config = this.readFile(configFile);
-            try {
-                config = JSON.parse(config);
-            } catch(e) {
-                config = null;
-            }
-        } else {
-            config = require(configFile);
-        }
-
-        cache.setConfig(config);
-        return config;
-    },
-    getIgnore () {
-        let ignoreFile = path.join(this.currentDir, path.sep, '.wepyignore');
-        return this.isFile(ignoreFile) ? this.readFile(ignoreFile) : '';
-    },
-    getFiles (dir = process.cwd(), prefix = '') {
-        let cfiles = cache.getFileList(dir);
-        if (cfiles)
-            return cfiles;
-        dir = path.normalize(dir);
-        if (!fs.existsSync(dir)) {
-            return [];
-        }
-        let files = fs.readdirSync(dir);
-        let rst = [];
-        files.forEach((item) => {
-            let filepath = dir + path.sep + item;
-            let stat = fs.statSync(filepath);
-            if (stat.isFile()) {
-                rst.push(prefix + item);
-            } else if(stat.isDirectory()){
-                rst = rst.concat(this.getFiles(path.normalize(dir + path.sep + item),  path.normalize(prefix + item + path.sep)));
-            }
-        });
-
-        cache.setFileList(dir, rst);
-        return rst;
-    },
-    getVersion () {
-        let filepath = path.resolve(__dirname, '../package.json');
-        let version = JSON.parse(this.readFile(filepath)).version;
-        return version;
-    },
-    datetime (date = new Date(), format = 'HH:mm:ss') {
-        let fn = (d) => {
-            return ('0' + d).slice(-2);
-        };
-        if (date && this.isString(date)) {
-            date = new Date(Date.parse(date));
-        }
-        const formats = {
-            YYYY: date.getFullYear(),
-            MM: fn(date.getMonth() + 1),
-            DD: fn(date.getDate()),
-            HH: fn(date.getHours()),
-            mm: fn(date.getMinutes()),
-            ss: fn(date.getSeconds())
-        };
-        return format.replace(/([a-z])\1+/ig, function (a) {
-            return formats[a] || a;
-        });
-    },
-    error (msg) {
-        this.writeLog(msg, 'error');
-        this.log(msg, 'error', false);
-        if (!this.isWatch) {
-            process.exit(0);
-        }
-    },
-    warning (msg) {
-        this.writeLog(msg, 'warn');
-        this.log(msg, 'warning', false);
-    },
-    log (msg, type, showTime = true) {
-        let dateTime = showTime ? colors.gray(`[${this.datetime()}] `) : '';
-        if(this.isObject(msg) || this.isArray(msg)){
-            msg = JSON.stringify(msg);
-        }
-        if(type && this.isString(type)) {
-            type = type.toUpperCase();
-            if(type === 'ERROR'){
-                if (msg instanceof Error) {
-                    console.error(colors.red('[Error] ' + msg.stack));
-                } else {
-                    console.error(colors.red('[Error] ' + msg));
-                }
-            } else if(type === 'WARNING'){
-                console.error(colors.yellow('[WARNING] ' + msg));
-            } else {
-                let fn = colors[type] ? colors[type] : colors['info'];
-                console.log(dateTime + fn(`[${type}]`) + ' ' + msg);
-            }
-        } else {
-            console.log(dateTime + msg);
-        }
-    },
-    removeLog () {
-        let dist = dist || cache.getDist();
-        let file = path.join(this.currentDir, dist, '_wepylogs.js');
-        this.unlink(file);
-    },
-    clearLog () {
-        let dist = dist || cache.getDist();
-        let file = path.join(this.currentDir, dist, '_wepylogs.js');
-        this.writeFile(file, `console.log('WePY开启错误监控');\r\n`);
-    },
-    writeLog (msg, type) {
-        if (!this.cliLogs)
-            return;
-        let dist = dist || cache.getDist();
-        let file = path.join(this.currentDir, dist, '_wepylogs.js');
-        if (msg.stack) {
-            msg = msg.stack;
-            msg = msg.replace(/\\/g, '\\\\');
-            msg = msg.replace(/\u001b/g, '');
-            msg = msg.replace(/\[\d+m/g, '');
-        }
-        try {
-            fs.appendFileSync(file, `console.${type}(\`CLI报错：${msg}\`);\r\n`);
-        } catch (e) {
-            console.log(e);
-        }
-    },
-    output (type, file, flag) {
-        if (!flag) {
-            flag = file.substr(file.lastIndexOf('.') + 1).toUpperCase();
-            if (flag.length < 4) {
-                let i = 4 - flag.length;
-                while (i--) {
-                    flag += ' ';
-                }
-            }
-        }
-        this.log(flag + ': ' + path.relative(this.currentDir, file), type);
-    },
-    genId (filepath) {
-        if (!ID_CACHE[filepath]) {
-            ID_CACHE[filepath] = '_' + hash(filepath).slice(1, 8);
-        }
-        return ID_CACHE[filepath];
-    }
-}
-export default utils
-
-
-
diff --git a/packages/wepy-cli/src/web/compile-script.js b/packages/wepy-cli/src/web/compile-script.js
deleted file mode 100644
index a4992cd69..000000000
--- a/packages/wepy-cli/src/web/compile-script.js
+++ /dev/null
@@ -1,166 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import path from 'path';
-
-import util from '../util';
-import loader from '../loader';
-import resolve from '../resolve';
-import cache from '../cache';
-
-import { getInstance } from './modulemap';
-
-import main from './index';
-
-
-
-const currentPath = util.currentDir;
-const src = cache.getSrc();
-const dist = cache.getDist();
-const npmPath = path.join(currentPath, dist, 'npm' + path.sep);
-
-let mmap
-
-export default {
-    resolveMap (wpy) {
-
-        let opath = path.parse(wpy.script.src);
-
-        let id = mmap.add(wpy.script.src, {type: 'script', source: wpy});
-        wpy.script.id = id;
-
-        let params = cache.getParams();
-        let wpyExt = params.wpyExt;
-
-        let depences = [];
-        // wpy.script.code = wpy.script.code.replace(/require\(['"]([\w\d_\-\.\/]+)['"]\)/ig, (match, lib) => {
-        wpy.script.code = wpy.script.code.replace(/require\(['"]([\w\d_\-\.\/@]+)['"]\)/ig, (match, lib) => {
-            if (lib === 'wepy') 
-                lib = 'wepy-web';
-
-            let resolved = lib;
-
-            let source = '';
-
-            let dep = {}, npmInfo;
-
-            lib = resolve.resolveAlias(lib);
-
-            if (path.isAbsolute(lib)) {
-                source = lib;
-            } else if (lib[0] === '.') { // require('./something'');
-                source = path.join(opath.dir, lib);  // e:/src/util
-            } else if (lib.indexOf('/') === -1 || lib.indexOf('/') === lib.length - 1) {  //        require('asset');
-
-                let o = resolve.getMainFile(lib);
-                if (!o) {
-                    let relative = path.relative(util.currentDir, wpy.script.src);
-                    throw Error(`文件${relative}中，找不到模块: ${lib}`);
-                }
-                let pkg = o.pkg;
-                let main = pkg.main || 'index.js';
-                if (lib === 'axios') {
-                    main = path.join('dist', 'axios.js');
-                } else if (lib === 'vue') {
-                    main = path.join('dist', 'vue.js');
-                }
-                if (pkg.browser && typeof pkg.browser === 'string') {
-                    main = pkg.browser;
-                }
-                source = path.join(o.dir, main);
-                lib += path.sep + main;
-                npmInfo = o;
-            } else { // require('babel-runtime/regenerator')
-                //console.log('3: ' + lib);
-                source = path.join(wpy.npm.modulePath, lib);
-                npmInfo = wpy.npm;
-            }
-
-            if (path.extname(source)) {
-                if (util.isFile(source)) {
-                } else if (util.isDir(source) && util.isFile(source + path.sep + 'index.js')) {
-                    source = source + path.sep + 'index.js';
-                } else {
-                    source = null;
-                }
-            } else {
-                if (util.isFile(source + wpyExt)) {
-                    source += wpyExt;
-                } else if (util.isFile(source + '.js')) {
-                    source += '.js';
-                } else {
-                    source = null;
-                }
-            }
-
-            if (!source) {
-                throw ('找不到文件: ' + source);
-            }
-            
-            mmap.add(source);
-
-            let wepyRequireId = mmap.get(source);
-            dep.path = source;
-            if (npmInfo) {
-                dep.npm = npmInfo;
-            }
-            dep.id = wepyRequireId;
-            depences.push(dep);
-            return `__wepy_require(${wepyRequireId})`;
-        });
-        return depences;
-    },
-    compile (wpy) {
-        mmap = getInstance();
-        let config = util.getConfig();
-        let compiler = loader.loadCompiler(wpy.script.type);
-        if (!compiler) {
-            return;
-        }
-        mmap.setPending(wpy.script.src);
-        if (wpy.script.type === 'js') {
-            util.output('依赖', wpy.script.src);
-        } else {
-            util.output('编译', wpy.script.src);
-        }
-        return compiler(wpy.script.code, config.compilers[wpy.script.type] || {}).then(rst => {
-            if (rst.code) {
-                wpy.script.code = rst.code;
-                wpy.script.map = rst.map;
-            } else {
-                wpy.script.code = rst;
-            }
-
-            let matchs = wpy.script.code.match(/exports\.default\s*=\s*(((?!undefined).)*);/i), defaultExport;
-            // let matchs = wpy.script.code.match(/exports\.default\s*=\s*(\w+);/i), defaultExport;
-
-            if (matchs && matchs.length) {
-                defaultExport = matchs[1];
-
-                if (wpy.type === 'page') {
-                    main.addPage(wpy.path, wpy);
-                } else if (wpy.type === 'app') {
-                    if (matchs) {
-                        wpy.script.code = wpy.script.code.replace(/exports\.default\s*=\s*(\w+);/i, '');
-                        wpy.script.code += `\nrequire('wepy').default.$createApp(${defaultExport}, $$WEPY_APP_PARAMS_PLACEHOLDER$$);\n`;
-                    }
-                }
-            }
-            return wpy;
-        }).then(wpy => {
-            let depences = this.resolveMap(wpy);
-            let newTasks = [];
-            depences.forEach(dep => {
-                newTasks.push(main.compile(dep));
-            });
-            return Promise.all(newTasks);
-        });
-    }
-}
diff --git a/packages/wepy-cli/src/web/compile-style.js b/packages/wepy-cli/src/web/compile-style.js
deleted file mode 100644
index 30688f050..000000000
--- a/packages/wepy-cli/src/web/compile-style.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import util from '../util';
-import loader from '../loader';
-
-import rpxConvert from '../style-compiler/rpx-convert';
-import scopedHandler from '../style-compiler/scoped';
-
-import { getInstance } from './modulemap';
-
-export default {
-
-    compile (wpy) {
-        let mmap = getInstance();
-        let config = util.getConfig();
-
-        let allPromises = [];
-        wpy.style.forEach((style, i) => {
-            let lang = style.type || 'css';
-            const content = style.code;
-            const scoped = style.scoped;
-
-            if (lang === 'scss')
-                lang = 'sass';
-
-            let compiler = loader.loadCompiler(lang);
-
-            if (!compiler) {
-                throw `未发现相关 ${lang} 编译器配置，请检查wepy.config.js文件。`;
-            }
-
-            allPromises.push(compiler(content, config.compilers[lang] || {}, style.src).then((css) => {
-                // 处理 scoped
-                if (scoped) {
-                    // 存在有 scoped 的 style
-                    return scopedHandler(wpy.moduleId, css).then((cssContent) => {
-                        let styleId = mmap.add(style.src + '-style', {
-                            type: 'style',
-                            source: wpy
-                        });
-                        wpy.style.id = styleId;
-                        style.code = rpxConvert(cssContent);
-                    });
-                } else {
-                    let styleId = mmap.add(style.src + '-style', {
-                        type: 'style',
-                        source: wpy
-                    });
-                    wpy.style.id = styleId;
-                    style.code = rpxConvert(css);
-                }
-            }));
-
-        });
-
-        return Promise.all(allPromises);
-    }
-}
diff --git a/packages/wepy-cli/src/web/compile-template.js b/packages/wepy-cli/src/web/compile-template.js
deleted file mode 100644
index 77c6fcf0a..000000000
--- a/packages/wepy-cli/src/web/compile-template.js
+++ /dev/null
@@ -1,332 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import path from 'path';
-import {DOMParser, DOMImplementation} from 'xmldom';
-
-import util from '../util';
-import cache from '../cache';
-import loader from '../loader';
-import resolve from '../resolve';
-
-import { getInstance } from './modulemap';
-
-let mmap, libCompoents;
-
-const currentPath = util.currentDir;
-const src = cache.getSrc();
-const dist = cache.getDist();
-const srcPath = path.join(currentPath, src);
-
-const WEAPP_TAGS = ['view', 'text', 'navigator', 'image'];
-
-const makeMap = (arr) => {
-    let rst = {};
-    arr.split(',').forEach(v => rst[v] = 1);
-    return rst;
-};
-const HTML_TAGS = makeMap(
-    'html,body,base,head,link,meta,style,title,' +
-    'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' +
-    'div,dd,dl,dt,figcaption,figure,hr,img,li,main,ol,p,pre,ul,' +
-    'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' +
-    's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' +
-    'embed,object,param,source,canvas,script,noscript,del,ins,' +
-    'caption,col,colgroup,table,thead,tbody,td,th,tr,' +
-    'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' +
-    'output,progress,select,textarea,' +
-    'details,dialog,menu,menuitem,summary,' +
-    'content,element,shadow,template');
-
-const SVG_TAGS = makeMap(
-    'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' +
-    'foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' +
-    'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view');
-
-
-const TAGS_MAP = {
-    //'scroll-view': 'div',
-    'block': 'div',
-    'view': 'div',
-    'text': 'span',
-    'navigator': 'a',
-    'image': 'img',
-};
-
-const ATTRS_MAP = {
-    'bindtap': '@click',
-    'catchtap': '@click.stop'
-}
-
-
-
-
-export default {
-
-
-    isReservedTag (tag) {
-        return HTML_TAGS[tag] || SVG_TAGS[tag];
-    },
-    getTemplate (content) {
-        content = `<template>${content}</template>`;
-        let doc = new DOMImplementation().createDocument();
-        let node = new DOMParser().parseFromString(content);
-        let template = [].slice.call(node.childNodes || []).filter((n) => n.nodeName === 'template');
-
-        [].slice.call(template[0].childNodes || []).forEach((n) => {
-            doc.appendChild(n);
-        });
-        // https://github.com/jindw/xmldom/blob/master/dom.js#L585
-        // https://github.com/jindw/xmldom/blob/master/dom.js#L919
-        // if childNode is only one Text, then will get an error in doc.toString
-        if (doc.documentElement === null && doc.nodeType === 9) { // DOCUMENT_NODE
-            doc.nodeType = 11; // change to DOCUMENT_FRAGMENT_NODE
-        }
-        return doc;
-    },
-
-    getFunctionInfo (str) {
-        let rst = {name: '', params: []}, char = '', tmp = '', stack = [];
-        for (let i = 0, len = str.length; i < len; i++) {
-            char = str[i];
-            if (!rst.name) {
-                if (char === '(') {
-                    rst.name = tmp;
-                    tmp = '';
-                    continue;
-                }
-            }
-            if ((char === ',' || char === ')') && stack.length === 0) {
-                let p = tmp.replace(/^\s*/ig, '').replace(/\s*$/ig, '');
-                if (p && (p[0] === '"' || p[0] === '\'') && p[0] === p[p.length - 1]) {
-                    p = p.substring(1, p.length - 1);
-                }
-                rst.params.push(p);
-                tmp = '';
-                continue;
-            }
-            if (char === '\'' || char === '"') {
-                if (stack.length && stack[stack.length - 1] === char)
-                    stack.pop();
-                else
-                    stack.push(char);
-            }
-            tmp += char;
-        }
-        if (!rst.name)
-            rst.name = tmp;
-        return rst;
-    },
-
-    changeExp (str) {
-        let c, i = 0, l = str.length, flag = [], 
-            normalWord = '', expWord = '',
-            rst = [];
-
-        for (i = 0; i < l; i++) {
-            c = str[i];
-            if (c === '{' && i < l - 1 && str[i + 1] === '{') {
-                if (flag.length === 0) {
-                    flag.push('{}');
-                    i++;
-                    if (normalWord) {
-                        rst.push(`'${normalWord}'`);
-                        normalWord = '';
-                    }
-                    continue;
-                }
-            } else if (c === '}' && i < l - 1 && str[i + 1] === '}') {
-                if (flag.length) {
-                    if (flag[flag.length - 1] === '{}') {
-                        flag.pop();
-                        i++;
-                        if (expWord) {
-                            rst.push(`(${expWord})`);
-                            expWord = '';
-                        }
-                        continue;
-                    }
-                }
-            } else if (c === '\'' || c === '"') { // aaa {{bb+'}}'}}
-                if (flag.length) {
-                    if (flag[flag.length - 1] === c) {
-                        flag.pop();
-                    } else {
-                        flag.push(c);
-                    }
-                }
-            }
-            if (flag.length) {
-                expWord += c;
-            } else {
-                normalWord += c;
-            }
-        }
-
-        if (normalWord) {
-            rst.push(`'${normalWord}'`);
-        }
-        if (expWord) {
-            rst.push(`(${expWord})`);
-        }
-        return rst.join(' + ');
-    },
-
-    replaceWXML (content, file) {
-        let node = typeof(content) === 'string' ? this.getTemplate(content) : content;
-
-        let config = util.getConfig();
-        let webConfig = config.build ? config.build.web : {};
-        let components = webConfig.components || [];
-
-        if (!node || !node.childNodes || node.childNodes.length === 0)
-            return;
-        else {
-            [].slice.call(node.childNodes || []).forEach((child) => {
-                if (child.nodeName === '#text') {
-
-                } else {
-                    
-                    // replace tag name.
-                    if (components.indexOf(child.tagName) !== -1) {
-                        // 如果不是wepy-web/lib/components下的组件，那么给组件加个前缀，防止和HTML原生冲突
-                        if (path.relative(libCompoents, file)[0] === '.') {
-                            child.tagName = 'wepy-' + child.tagName;
-                        }
-                        // no nothing 
-                    } else if (TAGS_MAP[child.tagName]) { 
-                        child.tagName = TAGS_MAP[child.tagName];
-                    }
-
-                    if (child.tagName === 'repeat') {
-                        let vfor = this.changeExp(child.getAttribute('for'));
-                        let vkey = child.getAttribute('key') || 'key';
-                        let vitem = child.getAttribute('item') || 'item';
-                        let vindex = child.getAttribute('index') || 'index';
-                        child.tagName = 'div';
-                        child.removeAttribute('for');
-                        child.removeAttribute('item');
-                        child.removeAttribute('index');
-
-                        // Vue 1 does not support $key
-                        child.setAttribute('v-for', `(${vindex}, ${vitem}) in ${vfor}`);
-                    }
-                    [].slice.call(child.attributes || []).forEach(attr => {
-                        if (attr.name.indexOf('xmlns:') === 0) {
-                            child.removeAttribute(attr.name);
-                        } else if (/^(@|bind|catch)/.test(attr.name)) { // 事件
-                            let func = this.getFunctionInfo(attr.value);
-                            attr.value = func.name + '(';
-
-                            func.params = func.params.map(p => {
-                                let exp = this.changeExp(p);
-                                return exp.indexOf('(') !== -1 ? exp : p;
-                            }).concat('$event');
-
-                            attr.value = `${func.name}(${func.params.join(',')})`;
-                            if (ATTRS_MAP[attr.name]) {
-                                attr.name = ATTRS_MAP[attr.name];
-                            } else {
-                                attr.name = attr.name.replace('bind', '@').replace('catch', '@');
-                            }
-                        } else if (attr.name === 'hidden') {
-                            child.setAttribute('v-show', `!(${this.changeExp(attr.value)})`);
-                            child.removeAttribute(attr.name);
-                        } else if (attr.name === 'wx:if') {
-                            child.setAttribute('v-if', this.changeExp(attr.value));
-                            child.removeAttribute(attr.name);
-                        } else if (attr.name === 'wx:for' || attr.name === 'wx:for-items') {
-                            // <block xmlns:wx="" wx:for-index="index" wx:for-item="item" wx:key="id" :wx:for-items="list">
-                            let vfor = this.changeExp(attr.value);
-                            let vkey = child.getAttribute('wx:key') || 'key';
-                            let vitem = child.getAttribute('wx:for-item') || 'item';
-                            let vindex = child.getAttribute('wx:for-index') || 'index';
-                            child.removeAttribute('wx:key');
-                            child.removeAttribute('wx:for-item');
-                            child.removeAttribute('wx:for-index');
-                            child.removeAttribute(attr.name);
-                            // Vue 1 does not support $key
-                            child.setAttribute('v-for', `(${vindex}, ${vitem}) in ${vfor}`);
-                        } else if (attr.value.indexOf('{{') > -1 && attr.value.indexOf('}}') > -1) {
-                            child.setAttribute(':' + attr.name, this.changeExp(attr.value));
-                            child.removeAttribute(attr.name);
-                        }
-                                
-                        // 修复打包后的组件的相对路径问题
-                        if (attr.name === 'src') {
-                            let exp = this.changeExp(attr.value);
-                            let attrName = attr.name, attrValue = attr.value;
-
-                            
-                            if (/^\'http(s)?/.test(exp) || /^\'\/\/?/.test(exp)) {
-                                // 如果路径是url形式，则不做修改
-                            } else if (exp[0] === '\'') { // 如果路径不是参数形式，则不做修改
-                                let src = path.join(path.parse(file).dir, attr.value);
-                                attrValue = path.relative(srcPath, src).replace(/\\/ig, '/');
-                            }
-                            
-                            // If it's a image and it's a exp src path, change src to :src
-                            if (child.tagName === 'img' && exp.indexOf('(') !== -1) {
-                                attrName = ':src';
-                            }
-
-                            child.removeAttribute(attr.name);
-                            child.setAttribute(attrName, attrName[0] === ':' ? this.changeExp(attrValue) : attrValue);
-                        }
-                    });
-                }
-                this.replaceWXML(child, file);
-            });
-        }
-
-        /*let k;
-        for (k in TAGS_MAP) {
-            let openreg = new RegExp(`<${k}`, 'ig'),
-                closereg = new RegExp(`</${k}`, 'ig');
-            str = str.replace(openreg, `<${TAGS_MAP[k]}`).replace(closereg, `</${TAGS_MAP[k]}`);
-        }
-
-        for (k in ATTRS_MAP) {
-            let reg = new RegExp('\s*${k}\s*=?')
-        }
-
-        return str.replace(/[\r\n]/ig, '');*/
-    },
-
-    compile (wpy) {
-
-        let config = util.getConfig();
-        let compiler = loader.loadCompiler(wpy.template.type);
-
-        if (!compiler) {
-            return;
-        }
-
-        mmap = getInstance();
-
-
-        libCompoents = path.join(resolve.getPkg('wepy-web').dir, 'lib');
-
-        return compiler(wpy.template.code, config.compilers[wpy.template.type] || {}).then(rst => {
-
-            let node = this.getTemplate(rst);
-            this.replaceWXML(node, wpy.template.src);
-            // Will replace custom <tag /> to <tag></tag>
-            // https://github.com/jindw/xmldom/blob/56eb39f82dd2052a683b1870fb1f4a105e184f66/dom.js#L113
-            // replace xmlns:wx
-            wpy.template.code = node.toString(true).replace(/xmlns[^\s]*/ig, '');
-            let templateId = mmap.add(wpy.template.src + '-template', {
-                type: 'template',
-                source: wpy
-            });
-            wpy.template.id = templateId;
-        });
-    }
-}
diff --git a/packages/wepy-cli/src/web/index.js b/packages/wepy-cli/src/web/index.js
deleted file mode 100644
index 65063d931..000000000
--- a/packages/wepy-cli/src/web/index.js
+++ /dev/null
@@ -1,445 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import path from 'path';
-import util from '../util';
-import cache from '../cache';
-import compileWpy from '../compile-wpy';
-
-
-import cScript from './compile-script';
-import cTemplate from './compile-template';
-import cStyle from './compile-style';
-import {DOMParser, DOMImplementation} from 'xmldom';
-
-
-import loader from '../loader';
-import resolve from '../resolve';
-
-import {getInstance, createInstance} from './modulemap';
-
-
-const currentPath = util.currentDir;
-const src = cache.getSrc();
-const dist = cache.getDist();
-const npmPath = path.join(currentPath, dist, 'npm' + path.sep);
-
-let appPath;
-
-let pages = {};
-
-let mmap;
-
-export default {
-
-    addPage (k, v) {
-        pages[k] = v;
-    },
-    replaceParams (str, params) {
-        let k, reg;
-        for (k in params) {
-            reg = new RegExp('{{' + k +'}}', 'g');
-            str = str.replace(reg, params[k]);
-        }
-        return str;
-    },
-    injectScript (html, scripts) {
-
-        if (!scripts || !scripts.length)
-            return;
-
-        let head = html.getElementsByTagName('head')[0];
-        let body = html.getElementsByTagName('body')[0];
-        let doc = new DOMImplementation().createDocument();
-        scripts.forEach(v => {
-            let script = doc.createElement('script');
-            if (v.src) {
-                script.setAttribute('src', v.src);    
-            } else if (v.js) {
-                script.appendChild(doc.createTextNode(v.js));
-            }
-            
-            if (v.pos === 'body') {
-                body.appendChild(script);
-            } else {
-                head.appendChild(script);
-            }
-        });
-    },
-    buildHtml (webConfig, platform) {
-        let config = util.getConfig();
-
-        if (webConfig.htmlTemplate) {
-            let template = util.readFile(webConfig.htmlTemplate);
-            if (!template) {
-                util.error('找不到文件：' + webConfig.htmlTemplate);
-                return;
-            }
-
-            let domParser = new DOMParser({errorHandler: {
-                warning (x) {
-                    if (x.indexOf(' unclosed xml attribute') > -1) {
-                        // ignore warnings
-                    } else {
-                        util.warning('WARNING IN : ' + webConfig.htmlTemplate + '\n' + x);
-                    }
-                },
-                error (x) {
-                    util.warning('ERROR IN : ' + webConfig.htmlTemplate + '\n' + x);
-                }
-            }});
-
-            // https://github.com/jindw/xmldom/blob/master/dom-parser.js#L13
-            // https://github.com/jindw/xmldom/blob/master/sax.js#L157
-            // without '/hmtl' it will throw unclosed xml attribute.
-            let node = domParser.parseFromString(template, '/html');
-
-            let target = this.replaceParams(webConfig.htmlOutput, {platform: platform});
-
-            let scripts = [];
-
-            if (platform === 'qq') {
-                scripts.push({
-                    pos: 'head',
-                    src: '//i.gtimg.cn/channel/lib/components/adapt/adapt-3.0.js?_bid=2106&max_age=86400000'
-                });
-                scripts.push({
-                    pos: 'head',
-                    src: '//open.mobile.qq.com/sdk/qqapi.js?_bid=152'
-                });
-            } else if (platform === 'wechat') {
-                scripts.push({
-                    pos: 'head',
-                    src: '//res.wx.qq.com/open/js/jweixin-1.2.0.js'
-                });
-            }
-
-            scripts.push({
-                pos: 'body',
-                src: this.replaceParams(path.relative(path.parse(target).dir, webConfig.jsOutput), {platform: platform})
-            });
-            this.injectScript(node, scripts);
-
-
-            util.output('写入', target);
-            util.writeFile(target, node.toString(true));
-        }
-    },
-    toWeb (file, platform) {
-        let src = cache.getSrc();
-        let ext = cache.getExt();
-        let config = util.getConfig();
-        let appWpy, apppath, platformId;
-
-
-        let webConfig = config.build ? config.build.web : null;
-        if (!webConfig){
-            util.error('请检查 build.web 的配置');
-            return;
-        }
-
-        mmap = createInstance();
-
-        util.log('编译 WEB');
-
-        this.buildHtml(webConfig, platform);
-
-        util.log('入口: ' + file, '编译');
-        if (typeof(file) === 'object') {
-            appWpy = file;
-            apppath = appWpy.script.src;
-        } else {
-            apppath = path.parse(path.join(util.currentDir, src, file));
-            appWpy = compileWpy.resolveWpy(apppath);
-        }
-        let wpypages = [];
-
-        this.app = appWpy;
-        if (appWpy.config.pages && appWpy.config.pages.length) {
-            appWpy.config.pages.forEach(v => {
-                let wpypage = compileWpy.resolveWpy(path.parse(path.join(util.currentDir, src, v + ext)));
-                wpypage.path = v;
-                wpypages.push(wpypage);
-            });
-        } else {
-            util.error('未检测到配置的页面文件。请检查' + util.getRelative(apppath));
-            return;
-        }
-
-        let tasks = [], components = {}, apis = {};
-
-        tasks.push(this.compile([appWpy].concat(wpypages)));
-
-
-        let wepyWebPkg = resolve.getPkg('wepy-web');
-
-        // 注入平台wx hack 代码
-        if (platform !== 'browser') {
-            if (['wechat', 'qq'].indexOf(platform) > -1) {
-                let platformFile = path.join(wepyWebPkg.dir, 'lib', 'platform', platform + '.js');
-                platformId = mmap.add(platformFile);
-                tasks.push(this.compile({
-                    id: platformId,
-                    path: platformFile,
-                    npm: wepyWebPkg
-                }));
-            } else {
-                util.warning('platform参数目前只支持 wechat 和 qq');
-            }
-        }
-
-        // 如果存在引入的components，则将components编译至代码中。
-        if (webConfig.components && webConfig.components.length) {
-            webConfig.components.forEach(k => {
-                let componentFile = path.join(wepyWebPkg.dir, 'lib', 'components', k + '.vue');
-                components[k] = mmap.add(componentFile);
-                tasks.push(this.compile({
-                    id: components[k],
-                    path: componentFile,
-                    npm: wepyWebPkg
-                }));
-            });
-        }
-        // 如果存在引入的apis，则将apis编译至代码中。
-        if (webConfig.apis && webConfig.apis.length) {
-            webConfig.apis.forEach(k => {
-                let apiFile = path.join(wepyWebPkg.dir, 'lib', 'apis', k);
-                if (util.isFile(apiFile + '.vue')) {
-                    apiFile = apiFile + '.vue';
-                } else {
-                    apiFile = apiFile + '.js';
-                }
-                apis[k] = mmap.add(apiFile);
-                tasks.push(this.compile(apiFile));
-            });
-        }
-
-        Promise.all(tasks).then(rst => {
-            let mapArr = mmap.getArray();
-            let code = '';
-
-            let styleList = [];
-            mapArr.forEach((v, i) => {
-                let p = path.relative(util.currentDir, v.source.script.src);
-
-                code += '/***** module ' + i + ' start *****/\n';
-                code += '/***** ' + p + ' *****/\n';
-                code += 'function(module, exports, __wepy_require) {'
-                if (v.type === 'script') {
-                    code += v.source.script.code + '\n';
-                    if (v.source.template && v.source.template.id !== undefined) {
-                        code += '\nexports.default.template=__wepy_require(' + v.source.template.id + ');\n'
-                    }
-                } else if (v.type === 'template') {
-                    code += 'module.exports = "' + v.source.template.code.replace(/\\/ig, '\\\\').replace(/\r/ig, '').replace(/\n/ig, '\\n').replace(/"/ig, '\\"') + '"';
-                } else if (v.type === 'style') {
-                    let styleCode = '';
-                    v.source.style.forEach(s => {
-                        styleCode += s.code + '\r\n';
-                    });
-                    styleList.push(v.source.style.id);
-                    code += 'module.exports = "' + styleCode.replace(/\\/ig, '\\\\').replace(/\r/ig, '').replace(/\n/ig, '\\n').replace(/"/ig, '\\"') + '"';
-                }
-                code += '}';
-                if (i !== mapArr.length - 1) {
-                    code += ',';
-                }
-                code += '/***** module ' + i + ' end *****/\n\n\n';
-            });
-
-code = `
-(function(modules) { 
-   // The module cache
-   var installedModules = {};
-   // The require function
-   function __webpack_require__(moduleId) {
-       // Check if module is in cache
-       if(installedModules[moduleId])
-           return installedModules[moduleId].exports;
-       // Create a new module (and put it into the cache)
-       var module = installedModules[moduleId] = {
-           exports: {},
-           id: moduleId,
-           loaded: false
-       };
-       // Execute the module function
-       modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-       // Flag the module as loaded
-       module.loaded = true;
-       // Return the exports of the module
-       return module.exports;
-   }
-   // expose the modules object (__webpack_modules__)
-   __webpack_require__.m = modules;
-   // expose the module cache
-   __webpack_require__.c = installedModules;
-   // __webpack_public_path__
-   __webpack_require__.p = "/";
-   // Load entry module and return exports
-   $$WEPY_APP_PLATFORM_PLACEHOLDER$$
-   return __webpack_require__(${appWpy.script.id});
-})([
-${code}
-]);
-`
-            let config = {}, routes = {}, k;
-
-            for (k in pages) {
-                routes[k] = mmap.get(pages[k].script.src);
-            }
-
-            config.routes = routes;
-            config.style = styleList;
-            config.components = components;
-            config.apis = apis;
-
-            if (platformId !== undefined) {
-                code = code.replace('$$WEPY_APP_PLATFORM_PLACEHOLDER$$', `__webpack_require__(${platformId})`);
-            } else {
-                code = code.replace('$$WEPY_APP_PLATFORM_PLACEHOLDER$$', '');    
-            }
-            code = code.replace('$$WEPY_APP_PARAMS_PLACEHOLDER$$', JSON.stringify(config));
-
-            webConfig.jsOutput = webConfig.jsOutput || path.join(dist, 'dist.js');
-            let target = this.replaceParams(path.join(util.currentDir, webConfig.jsOutput), {platform: platform});
-            let plg = new loader.PluginHelper(config.plugins, {
-                type: 'dist',
-                code: code,
-                file: target,
-                output (p) {
-                    util.output(p.action, p.file);
-                },
-                done (result) {
-                    util.output('写入', result.file);
-                    util.writeFile(target, result.code);
-                }
-            });
-        }).catch(e => {
-            console.error(e);
-        });
-    },
-
-    compile (wpys) {
-
-        let config = util.getConfig();
-        let params = cache.getParams();
-        let wpyExt = params.wpyExt;
-        let tasks = [];
-
-        let singleFile = false;
-
-        if (wpys.path) {
-            if (mmap.getPending(wpys.path))
-                return Promise.resolve(0);
-
-            let wpy = mmap.getObject(wpys.path);
-            if (wpy) {
-                return Promise.resolve(wpy);
-            }
-
-            let opath = path.parse(wpys.path);
-
-
-            if (opath.ext === wpyExt || opath.ext === '.vue') {
-                let wpy = compileWpy.resolveWpy(wpys.path);
-                if (!wpy) {
-                    util.error(`检测到不存在组件 ${opath.name}`);
-                    return;
-                }
-                wpys = [wpy];
-            } else {
-                let compileType = 'babel';
-                // 如果是npm包, 而且后缀不为 .wpy，那么不进行babel编译
-                if (opath.ext !== wpyExt && wpys.npm) {
-                    compileType = 'js';
-                }
-                wpys = [{
-                    script: {
-                        code: util.readFile(wpys.path),
-                        src: wpys.path,
-                        type: compileType
-                    },
-                    npm: wpys.npm
-                }];
-            }
-            singleFile = true;
-        }
-        wpys.forEach((wpy, i) => {
-            let tmp;
-            wpy.type = singleFile ? 'require' : ((i === 0) ? 'app' : 'page');
-
-            tmp = cScript.compile(wpy);
-
-            if (!tmp) {
-                throw 'error';
-            }
-
-            tasks.push(tmp);
-
-            if (wpy.template && wpy.template.code && !wpy.template.id) {
-                tmp = cTemplate.compile(wpy);
-
-                if (!tmp) {
-                    throw 'error';
-                }
-
-                tasks.push(tmp);
-            }
-
-            if (wpy.style && wpy.style.length) {
-                tmp = cStyle.compile(wpy);
-
-                if (!tmp) {
-                    throw 'error';
-                }
-                tasks.push(tmp);
-            }
-        });
-
-        return Promise.all(tasks);
-    },
-
-    copy (file) {
-        let src = cache.getSrc();
-        let dist = cache.getDist();
-        let ext = cache.getExt();
-        let config = util.getConfig();
-
-        let opath = path.parse(file);
-
-        switch (opath.ext) {
-            case ext:
-                break;
-            case '.js':
-                break;
-            case '.html':
-                break;
-            default:
-                util.output('拷贝', path.join(opath.dir, opath.base));
-
-                let plg = new loader.PluginHelper(config.plugins, {
-                    type: opath.ext.substr(1),
-                    code: null,
-                    file: path.join(opath.dir, opath.base),
-                    output (p) {
-                        util.output(p.action, p.file);
-                    },
-                    done (rst) {
-                        util.copy(path.parse(rst.file));
-                    },
-                    error (rst) {
-                        util.warning(rst.err);
-                        util.copy(path.parse(rst.file));
-                    }
-                });
-
-        }
-    }
-}
diff --git a/packages/wepy-cli/src/web/modulemap.js b/packages/wepy-cli/src/web/modulemap.js
deleted file mode 100644
index f352a64ee..000000000
--- a/packages/wepy-cli/src/web/modulemap.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-
-class  ModuleMap {
-
-    constructor () {
-        this._index = -1;
-        this._map = {};
-        this._objectMap = {};
-        this._objectPending = {};
-    }
-
-    add (file, wpy) {
-        let index = this.get(file);
-        if (index === undefined) {
-            this._index++;
-            this.length = this._index + 1;
-            index = this._index
-            this._map[file] = index;
-        }
-        if (wpy)
-            this._objectMap[index] = wpy;
-        return index;
-    }
-
-    get (file) {
-        return this._map[file];
-    }
-
-    getObject (file) {
-        let index = file;
-        if (typeof(file) === 'string') {
-            index = this.get(file);
-        }
-        return this._objectMap[index];
-    }
-
-    getArray () {
-        this._objectMap.length = this.length;
-        return Array.prototype.slice.apply(this._objectMap);
-    }
-
-
-    setPending (src) {
-        this._objectPending[src] = true;
-    }
-
-    getPending (src) {
-        return this._objectPending[src];
-    }
-
-}
-
-let instance;
-
-exports = module.exports = {
-    getInstance: () => {
-        if (!instance)
-            throw 'Create instance before call getInstance';
-        return instance;
-    },
-    createInstance: () => {
-        instance = new ModuleMap();
-        return instance;
-    }
-};
diff --git a/packages/wepy-cli/src/wepy.js b/packages/wepy-cli/src/wepy.js
deleted file mode 100644
index a59e26cb8..000000000
--- a/packages/wepy-cli/src/wepy.js
+++ /dev/null
@@ -1,308 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import commander from 'commander';
-import path from 'path';
-import {exec} from 'child_process';
-//import updateNotifier from 'update-notifier';
-import util from './util';
-import compile from './compile';
-
-let displayVersion = () => {
-    let version = util.getVersion();
-    let chars = [
-        '   _    _  ____  ____  _  _ ',
-        '( \/\/ )( ___)(  _ \( \/ )',
-        ' )    (  )__)  )___/ \  / ',
-        '(__/\__)(____)(__)   (__) ',
-        '                                         '
-    ].join('\n');
-    console.log('\n v' + version + '\n');
-    console.log(chars);
-};
-
-let generateProject = (name, config) => {
-
-    let inPlace = !name || name === '.';
-
-    if (inPlace) {
-        name = process.cwd().split(path.sep).pop();
-        util.log('使用当前目录：' + name);
-    } else {
-        util.log('目录：' + name, '创建');
-
-        if (util.mkdir(name) !== true) {
-            util.error('创建目录失败。');
-            return;
-        }
-
-        process.chdir(name);
-    }
-
-    util.currentDir = process.cwd();
-
-    let packagePath = path.join(util.currentDir, 'package.json');
-
-    if (util.isFile(packagePath) || util.isDir(path.join(util.currentDir, 'src'))) {
-        util.error('目录不为空, 请请勿重复初始化', '错误');
-        return;
-    }
-
-    const tplDir = '../templates/';
-    const templateDir = path.join(util.cliDir, tplDir + 'template', path.sep);
-    const emptyDir = path.join(util.cliDir, tplDir + 'empty', path.sep);
-    const confDir = path.join(util.cliDir, tplDir + 'conf', path.sep);
-
-    let template = config.empty ? emptyDir : templateDir;
-
-    const useRedux = !config.empty && config.redux;
-
-    let pkg = path.join(template, 'package.json');
-    pkg = util.readFile(pkg);
-    pkg = JSON.parse(pkg);
-    pkg.name = name;
-
-    let dependencies = [
-        'wepy'
-    ];
-    let devDependencies = [
-        'wepy-compiler-babel',
-        'babel-plugin-transform-decorators-legacy',
-        'babel-plugin-transform-export-extensions',
-        'babel-plugin-transform-class-properties',
-        'babel-plugin-transform-object-rest-spread',
-        'babel-preset-env',
-        'wepy-compiler-less',
-        'cross-env'
-    ];
-    const eslintDeps = [
-        'eslint@3.18.0',
-        'babel-eslint@7.2.1',
-        'eslint-config-standard@7.1.0',
-        'eslint-friendly-formatter@2.0.7',
-        'eslint-plugin-html@2.0.1',
-        'eslint-plugin-promise@3.5.0',
-        'eslint-plugin-standard@2.0.1',
-        'wepy-eslint'
-    ];
-    const reduxDeps = [
-        'redux',
-        'wepy-redux',
-        'redux-promise',
-        'redux-actions'
-    ];
-
-    if (!config.empty) {
-        dependencies.push('wepy-com-toast');
-        dependencies.push('wepy-async-function');
-    }
-    if (useRedux) {
-        // concat more faster than push.apply
-        dependencies = dependencies.concat(reduxDeps);
-    }
-
-    if (config.lint) {
-        devDependencies = devDependencies.concat(eslintDeps);
-    }
-
-    util.writeFile(packagePath, JSON.stringify(pkg));
-    util.log('配置: ' + 'package.json', '写入');
-
-    let files = util.getFiles(template).filter(file => file !== 'package.json');
-
-    const copyFn = function (sourcePath) {
-        return function (file) {
-            let target = path.join(util.currentDir, file);
-
-            // --on-lint will not copy eslint config
-            if (['.editorconfig', '.eslintignore', '.eslintrc'].indexOf(file) !== -1 && !config.lint)
-                return;
-
-            // 只有 redux 的项目拷贝 redux 相关内容 且做替换
-            const unReduxFiles = [
-                path.join('src', 'app.wpy'),
-                path.join('src', 'pages', 'index.wpy'),
-                path.join('src' , 'components', 'counter.wpy')
-            ];
-            const reduxFiles = [
-                path.join('src', 'app-redux.wpy'),
-                path.join('src', 'pages', 'index-redux.wpy'),
-                path.join('src', 'components', 'counter-redux.wpy')
-            ];
-            const index = reduxFiles.indexOf(file);
-            if (useRedux) {
-                if (unReduxFiles.indexOf(file) !== -1) {
-                    return;
-                }
-                // 将 reduxFiles 的文件重新命名
-                if (index >= 0) {
-                    target = path.join(util.currentDir, unReduxFiles[index]);
-                }
-            } else if (index !== -1 || file.indexOf(path.join('src', 'store')) === 0) {
-                // 同样排除 store 内容
-                return;
-            }
-
-            let fileContent = util.readFile(path.join(sourcePath, file));
-            if (file === 'wepy.config.js') {
-                if (!config.lint) {
-                    // 去掉 eslint: true,
-                    fileContent = fileContent.replace(/\s*eslint\: true,/ig, '')
-                }
-            }
-            util.writeFile(target, fileContent);
-            util.log('文件: ' + file, '拷贝');
-        }
-    }
-    files.forEach(copyFn(template));
-
-    let cmd = 'npm install --save ' + dependencies.join(' ');
-    let cmdDev = 'npm install --save-dev ' + devDependencies.join(' ');
-    util.log('执行命令: ' + cmd, '执行');
-    util.log('执行命令: ' + cmdDev, '执行');
-    util.log('可能需要几分钟, 请耐心等待...', '信息');
-    // 不能并行执行安装依赖
-    util.exec(cmd).then(d => {
-        return util.exec(cmdDev)
-    }).then(d => {
-        util.log('安装依赖完成', '完成');
-
-        let cmd = 'wepy build';
-        util.log('执行命令: ' + cmd, '执行');
-        util.log('可能需要几分钟, 请耐心等待...', '信息');
-
-        util.exec(cmd).then(d => {
-            util.log('代码编译完成', '完成');
-            util.log('项目初始化完成, 可以开始使用小程序。', '完成');
-        }).catch(e => {
-            util.log('代码编译出错', '错误');
-        })
-    }).catch(e => {
-        util.log('安装依赖出错', '错误');
-    });
-};
-
-let upgradeCLI = (cb) => {
-    let cmd = 'npm install wepy-cli -g';
-    util.log('升级中，可能需要几分钟, 请耐心等待...', '信息');
-    util.log('执行命令: ' + cmd, '执行');
-    let fcmd = exec(cmd, () => {
-        util.log('完成安装最新版本wepy-cli', '完成');
-        cb && cb();
-    });
-    fcmd.stdout.on('data', (d) => {
-        console.log(d.substring(d, d.length - 1));
-    });
-};
-
-let upgradeWepy = (cb) => {
-    let cmd = 'npm install wepy --save';
-    util.log('升级中，可能需要几分钟, 请耐心等待...', '信息');
-    util.log('执行命令: ' + cmd, '执行');
-    let fcmd = exec(cmd, () => {
-        util.log('完成安装最新版本wepy', '完成');
-
-        let cmd = 'wepy build --no-cache';
-        util.log('执行命令: ' + cmd, '执行');
-
-        let fcmd3 = exec(cmd, () => {
-            util.log('完成升级', '完成');
-            cb && cb();
-        });
-        fcmd3.stdout.on('data', (d) => {
-            console.log(d.substring(d, d.length - 1));
-        });
-    })
-    fcmd.stdout.on('data', (d) => {
-        console.log(d.substring(d, d.length - 1));
-    });
-};
-
-
-
-let upgrade = (name) => {
-    upgradeWepy();
-};
-
-
-let checkUpdates = () => {
-    util.timeoutExec(2, 'npm info wepy-cli', true).then(d => {
-    //util.exec('npm info wepy-cli', true).then(d => {
-        let last = d.match(/latest\:\s\'([\d\.]*)\'/);
-        last = last ? last[1] : undefined;
-        let me = util.getVersion();
-        if (last && last !== me) {
-            let lastArr = last.split('.');
-            let meArr = me.split('.');
-            let lastBig = lastArr[0] + '.' + lastArr[1];
-            let meBig = meArr[0] + '.' + meArr[1];
-
-            util.warning(`当前版本${me}，最新版本${last}`);
-            if (lastBig - meBig > 0) {
-                util.warning('跨版本升级可能不去向下兼容，升级前请查看CHANGLOG了解所有更新。');
-            } else {
-                util.warning('请关注版本更新日志：https://github.com/wepyjs/wepy/blob/master/CHANGELOG.md');
-                util.warning('升级命令：npm install wepy-cli -g');
-            }
-        }
-    }).catch(e => {});
-};
-checkUpdates();
-
-if (Number(process.version.match(/^v(\d+\.\d+)/)[1]) < 5) {
-    util.error('检测到当前Node.js版本过低，请升级Node.js到5以上版本，NPM升级到3以上版本。');
-    process.exit(1);
-}
-
-
-
-
-
-commander.usage('[command] <options ...>');
-commander.option('-v, --version', '显示版本号', () => {
-  displayVersion();
-});
-commander.option('-V', '显示版本号', () => {
-  displayVersion();
-});
-commander.option('-s, --source <source>', '源码目录');
-commander.option('-t, --target <target>', '生成代码目录');
-commander.option('-f, --file <file>', '待编译wpy文件');
-commander.option('-o, --output <type>', '编译类型：web，weapp。默认为weapp');
-commander.option('-p, --platform <type>', '编译平台：browser, wechat，qq。默认为browser');
-commander.option('--no-cache', '对于引用到的文件，即使无改动也会再次编译');
-commander.option('--empty', '使用new生成项目时，生成空项目内容');
-commander.option('--no-lint', '使用new生成项目时，禁用eslint');
-commander.option('--redux', '使用new生成项目时，增加redux相关内容');
-commander.option('-w, --watch', '监听文件改动');
-
-commander.command('build').description('编译项目').action(projectPath => {
-
-    if (compile.init(commander)) {
-        compile.build(commander);
-    }
-    /*if (!util.isDir(path.join(util.currentDir, 'node_modules'))) {
-        util.error('请先执行npm install安装所需依赖', '错误');
-        return;
-    } else {
-        compile.build(commander);
-    }*/
-});
-
-commander.command('new <projectName>').description('生成项目').action(name => {
-    generateProject(name || 'temp', commander);
-});
-
-
-commander.command('upgrade').description('升级wepyjs版本').action(name => {
-    upgrade();
-});
-
-commander.parse(process.argv);
diff --git a/packages/wepy-cli/templates/empty/.eslintignore b/packages/wepy-cli/templates/empty/.eslintignore
deleted file mode 100644
index a261f2917..000000000
--- a/packages/wepy-cli/templates/empty/.eslintignore
+++ /dev/null
@@ -1 +0,0 @@
-dist/*
diff --git a/packages/wepy-cli/templates/empty/.eslintrc.js b/packages/wepy-cli/templates/empty/.eslintrc.js
deleted file mode 100644
index e93a33195..000000000
--- a/packages/wepy-cli/templates/empty/.eslintrc.js
+++ /dev/null
@@ -1,29 +0,0 @@
-module.exports = {
-  root: true,
-  parser: 'babel-eslint',
-  parserOptions: {
-    sourceType: 'module'
-  },
-  env: {
-    browser: true
-  },
-  // https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style
-  extends: 'standard',
-  // required to lint *.wpy files
-  plugins: [
-    'html'
-  ],
-  settings: {
-    'html/html-extensions': ['.html', '.wpy']
-  },
-  // add your custom rules here
-  'rules': {
-    // allow paren-less arrow functions
-    'arrow-parens': 0,
-    // allow async-await
-    'generator-star-spacing': 0,
-    // allow debugger during development
-    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
-    'space-before-function-paren': 0
-  }
-}
diff --git a/packages/wepy-cli/templates/empty/.gitignore b/packages/wepy-cli/templates/empty/.gitignore
deleted file mode 100644
index 248859fb8..000000000
--- a/packages/wepy-cli/templates/empty/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-node_modules
-dist
-.DB_store
diff --git a/packages/wepy-cli/templates/empty/.prettierrc b/packages/wepy-cli/templates/empty/.prettierrc
deleted file mode 100644
index 544138be4..000000000
--- a/packages/wepy-cli/templates/empty/.prettierrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "singleQuote": true
-}
diff --git a/packages/wepy-cli/templates/empty/.wepyignore b/packages/wepy-cli/templates/empty/.wepyignore
deleted file mode 100644
index 01e2c5715..000000000
--- a/packages/wepy-cli/templates/empty/.wepyignore
+++ /dev/null
@@ -1,4 +0,0 @@
-node_modules
-dist
-.DB_store
-*.wpy___jb_tmp___
diff --git a/packages/wepy-cli/templates/empty/package.json b/packages/wepy-cli/templates/empty/package.json
deleted file mode 100644
index db59540a7..000000000
--- a/packages/wepy-cli/templates/empty/package.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "name": "test",
-  "version": "0.0.1",
-  "description": "",
-  "main": "dist/app.js",
-  "scripts": {
-    "dev": "wepy build --watch",
-    "build": "cross-env NODE_ENV=production wepy build --no-cache",
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "author": "",
-  "license": "MIT"
-}
diff --git a/packages/wepy-cli/templates/empty/src/app.wpy b/packages/wepy-cli/templates/empty/src/app.wpy
deleted file mode 100644
index e303cca48..000000000
--- a/packages/wepy-cli/templates/empty/src/app.wpy
+++ /dev/null
@@ -1,24 +0,0 @@
-<style lang="less">
-</style>
-
-<script>
-import wepy from 'wepy'
-
-export default class extends wepy.app {
-  config = {
-    pages: [
-      'pages/index'
-    ],
-    window: {
-      backgroundTextStyle: 'light',
-      navigationBarBackgroundColor: '#fff',
-      navigationBarTitleText: 'WeChat',
-      navigationBarTextStyle: 'black'
-    }
-  }
-
-  onLaunch() {
-    console.log('on launch')
-  }
-}
-</script>
diff --git a/packages/wepy-cli/templates/empty/src/pages/index.wpy b/packages/wepy-cli/templates/empty/src/pages/index.wpy
deleted file mode 100644
index f9e5ead3b..000000000
--- a/packages/wepy-cli/templates/empty/src/pages/index.wpy
+++ /dev/null
@@ -1,20 +0,0 @@
-<style lang="less">
-</style>
-<template>
-  <view class="container">
-    Hello world
-  </view>
-</template>
-
-<script>
-  import wepy from 'wepy'
-
-  export default class Index extends wepy.page {
-    config = {
-      navigationBarTitleText: 'test'
-    }
-    onLoad() {
-      console.log('onLoad')
-    }
-  }
-</script>
diff --git a/packages/wepy-cli/templates/empty/wepy.config.js b/packages/wepy-cli/templates/empty/wepy.config.js
deleted file mode 100644
index 209787923..000000000
--- a/packages/wepy-cli/templates/empty/wepy.config.js
+++ /dev/null
@@ -1,65 +0,0 @@
-var prod = process.env.NODE_ENV === 'production'
-
-module.exports = {
-  wpyExt: '.wpy',
-  eslint: true,
-  cliLogs: true,
-  compilers: {
-    less: {
-      'compress': true
-    },
-    /*sass: {
-      outputStyle: 'compressed'
-    },*/
-    babel: {
-      'sourceMap': true,
-      'presets': [
-        'env'
-      ],
-      'plugins': [
-        'babel-plugin-transform-class-properties',
-        'transform-export-extensions',
-        'syntax-export-extensions'
-      ]
-    }
-  },
-  plugins: {
-  },
-  appConfig: {
-    noPromiseAPI: ['createSelectorQuery']
-  }
-}
-
-if (prod) {
-
-  module.exports.cliLogs = false;
-
-  delete module.exports.compilers.babel.sourcesMap;
-  // 压缩sass
-  // module.exports.compilers['sass'] = {outputStyle: 'compressed'}
-
-  // 压缩less
-  module.exports.compilers['less'] = {
-    compress: true
-  }
-
-  // 压缩js
-  module.exports.plugins = {
-    uglifyjs: {
-      filter: /\.js$/,
-      config: {
-      }
-    },
-    imagemin: {
-      filter: /\.(jpg|png|jpeg)$/,
-      config: {
-        'jpg': {
-          quality: 80
-        },
-        'png': {
-          quality: 80
-        }
-      }
-    }
-  }
-}
diff --git a/packages/wepy-cli/templates/template/.editorconfig b/packages/wepy-cli/templates/template/.editorconfig
deleted file mode 100644
index 9d08a1a82..000000000
--- a/packages/wepy-cli/templates/template/.editorconfig
+++ /dev/null
@@ -1,9 +0,0 @@
-root = true
-
-[*]
-charset = utf-8
-indent_style = space
-indent_size = 2
-end_of_line = lf
-insert_final_newline = true
-trim_trailing_whitespace = true
diff --git a/packages/wepy-cli/templates/template/.eslintignore b/packages/wepy-cli/templates/template/.eslintignore
deleted file mode 100644
index a261f2917..000000000
--- a/packages/wepy-cli/templates/template/.eslintignore
+++ /dev/null
@@ -1 +0,0 @@
-dist/*
diff --git a/packages/wepy-cli/templates/template/.eslintrc.js b/packages/wepy-cli/templates/template/.eslintrc.js
deleted file mode 100644
index e93a33195..000000000
--- a/packages/wepy-cli/templates/template/.eslintrc.js
+++ /dev/null
@@ -1,29 +0,0 @@
-module.exports = {
-  root: true,
-  parser: 'babel-eslint',
-  parserOptions: {
-    sourceType: 'module'
-  },
-  env: {
-    browser: true
-  },
-  // https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style
-  extends: 'standard',
-  // required to lint *.wpy files
-  plugins: [
-    'html'
-  ],
-  settings: {
-    'html/html-extensions': ['.html', '.wpy']
-  },
-  // add your custom rules here
-  'rules': {
-    // allow paren-less arrow functions
-    'arrow-parens': 0,
-    // allow async-await
-    'generator-star-spacing': 0,
-    // allow debugger during development
-    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
-    'space-before-function-paren': 0
-  }
-}
diff --git a/packages/wepy-cli/templates/template/.gitignore b/packages/wepy-cli/templates/template/.gitignore
deleted file mode 100644
index 248859fb8..000000000
--- a/packages/wepy-cli/templates/template/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-node_modules
-dist
-.DB_store
diff --git a/packages/wepy-cli/templates/template/.prettierrc b/packages/wepy-cli/templates/template/.prettierrc
deleted file mode 100644
index 544138be4..000000000
--- a/packages/wepy-cli/templates/template/.prettierrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "singleQuote": true
-}
diff --git a/packages/wepy-cli/templates/template/.wepyignore b/packages/wepy-cli/templates/template/.wepyignore
deleted file mode 100644
index 01e2c5715..000000000
--- a/packages/wepy-cli/templates/template/.wepyignore
+++ /dev/null
@@ -1,4 +0,0 @@
-node_modules
-dist
-.DB_store
-*.wpy___jb_tmp___
diff --git a/packages/wepy-cli/templates/template/package.json b/packages/wepy-cli/templates/template/package.json
deleted file mode 100644
index db59540a7..000000000
--- a/packages/wepy-cli/templates/template/package.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "name": "test",
-  "version": "0.0.1",
-  "description": "",
-  "main": "dist/app.js",
-  "scripts": {
-    "dev": "wepy build --watch",
-    "build": "cross-env NODE_ENV=production wepy build --no-cache",
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "author": "",
-  "license": "MIT"
-}
diff --git a/packages/wepy-cli/templates/template/src/app-redux.wpy b/packages/wepy-cli/templates/template/src/app-redux.wpy
deleted file mode 100644
index bfb624b3b..000000000
--- a/packages/wepy-cli/templates/template/src/app-redux.wpy
+++ /dev/null
@@ -1,73 +0,0 @@
-<style lang="less">
-.container {
-  height: 100%;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: space-between;
-  box-sizing: border-box;
-}
-</style>
-
-<script>
-import wepy from 'wepy'
-import 'wepy-async-function'
-import { setStore } from 'wepy-redux'
-import configStore from './store'
-
-const store = configStore()
-setStore(store)
-
-export default class extends wepy.app {
-  config = {
-    pages: [
-      'pages/index'
-    ],
-    window: {
-      backgroundTextStyle: 'light',
-      navigationBarBackgroundColor: '#fff',
-      navigationBarTitleText: 'WeChat',
-      navigationBarTextStyle: 'black'
-    }
-  }
-
-  globalData = {
-    userInfo: null
-  }
-
-  constructor () {
-    super()
-    this.use('requestfix')
-  }
-
-  onLaunch() {
-    this.testAsync()
-  }
-
-  sleep (s) {
-    return new Promise((resolve, reject) => {
-      setTimeout(() => {
-        resolve('promise resolved')
-      }, s * 1000)
-    })
-  }
-
-  async testAsync () {
-    const data = await this.sleep(3)
-    console.log(data)
-  }
-
-  getUserInfo(cb) {
-    const that = this
-    if (this.globalData.userInfo) {
-      return this.globalData.userInfo
-    }
-    wepy.getUserInfo({
-      success (res) {
-        that.globalData.userInfo = res.userInfo
-        cb && cb(res.userInfo)
-      }
-    })
-  }
-}
-</script>
diff --git a/packages/wepy-cli/templates/template/src/app.wpy b/packages/wepy-cli/templates/template/src/app.wpy
deleted file mode 100644
index af4cc0583..000000000
--- a/packages/wepy-cli/templates/template/src/app.wpy
+++ /dev/null
@@ -1,68 +0,0 @@
-<style lang="less">
-.container {
-  height: 100%;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: space-between;
-  box-sizing: border-box;
-}
-</style>
-
-<script>
-import wepy from 'wepy'
-import 'wepy-async-function'
-
-export default class extends wepy.app {
-  config = {
-    pages: [
-      'pages/index'
-    ],
-    window: {
-      backgroundTextStyle: 'light',
-      navigationBarBackgroundColor: '#fff',
-      navigationBarTitleText: 'WeChat',
-      navigationBarTextStyle: 'black'
-    }
-  }
-
-  globalData = {
-    userInfo: null
-  }
-
-  constructor () {
-    super()
-    this.use('requestfix')
-  }
-
-  onLaunch() {
-    this.testAsync()
-  }
-
-  sleep (s) {
-    return new Promise((resolve, reject) => {
-      setTimeout(() => {
-        resolve('promise resolved')
-      }, s * 1000)
-    })
-  }
-
-  async testAsync () {
-    const data = await this.sleep(3)
-    console.log(data)
-  }
-
-  getUserInfo(cb) {
-    const that = this
-    if (this.globalData.userInfo) {
-      return this.globalData.userInfo
-    }
-    wepy.getUserInfo({
-      success (res) {
-        that.globalData.userInfo = res.userInfo
-        cb && cb(res.userInfo)
-      }
-    })
-  }
-}
-</script>
diff --git a/packages/wepy-cli/templates/template/src/components/counter-redux.wpy b/packages/wepy-cli/templates/template/src/components/counter-redux.wpy
deleted file mode 100644
index 4c42a1651..000000000
--- a/packages/wepy-cli/templates/template/src/components/counter-redux.wpy
+++ /dev/null
@@ -1,74 +0,0 @@
-<style lang="less">
-  .counter {
-    text-align: left;
-    font-size: 12px;
-  }
-  .count {
-    font-size: 18px;
-    font-weight: bold;
-  }
-</style>
-<template>
-  <view class="counter {{style}}">
-    <button @tap="plus" size="mini">  +  </button>
-    <button @tap="minus" size="mini">  -  </button>
-    <button @tap="incNum" size="mini">  INCREMENT  </button>
-    <button @tap="decNum" size="mini">  DECREMENT  </button>
-    <button @tap="asyncInc" size="mini">  ASYNC INCREMENT  </button>
-    <text class="count"> {{num}} </text>
-    <text class="count"> {{stateNum}} </text>
-    <text class="count"> {{asyncNum}} </text>
-  </view>
-</template>
-<script>
-  import wepy from 'wepy'
-  import { connect } from 'wepy-redux'
-  import { INCREMENT, DECREMENT } from '../store/types/counter'
-  import { asyncInc } from '../store/actions'
-
-  @connect({
-    stateNum (state) {
-      return state.counter.num
-    },
-    asyncNum (state) {
-      return state.counter.asyncNum
-    }
-  }, {
-    incNum: INCREMENT,
-    decNum: DECREMENT,
-    asyncInc
-  })
-  export default class Counter extends wepy.component {
-    props = {
-      num: {
-        type: [Number, String],
-        coerce: function (v) {
-          return +v
-        },
-        default: 50
-      }
-    }
-
-    data = {
-    }
-    events = {
-      'index-broadcast': (...args) => {
-        let $event = args[args.length - 1]
-        console.log(`${this.$name} receive ${$event.name} from ${$event.source.$name}`)
-      }
-    }
-
-    methods = {
-      plus () {
-        this.num = this.num + 1
-        console.log(this.$name + ' plus tap')
-
-        this.$emit('index-emit', 1, 2, 3)
-      },
-      minus () {
-        this.num = this.num - 1
-        console.log(this.$name + ' minus tap')
-      }
-    }
-  }
-</script>
diff --git a/packages/wepy-cli/templates/template/src/components/counter.wpy b/packages/wepy-cli/templates/template/src/components/counter.wpy
deleted file mode 100644
index 07217196d..000000000
--- a/packages/wepy-cli/templates/template/src/components/counter.wpy
+++ /dev/null
@@ -1,67 +0,0 @@
-<style lang="less">
-  .counter {
-    text-align: left;
-    font-size: 12px;
-  }
-  .count {
-    font-size: 18px;
-    font-weight: bold;
-    &.red {
-      color: red;
-    }
-    &.green {
-      color: green;
-    }
-  }
-</style>
-<template>
-  <view class="counter {{style}}">
-    <button @tap="plus" size="mini">  +  </button>
-    <button @tap="minus" size="mini">  -  </button>
-    <text class="count" :class="{red: num > 55, green: num < 45}"> {{num}} </text>
-  </view>
-</template>
-<script>
-  import wepy from 'wepy'
-  // import abc from 'abc'
-
-  export default class Counter extends wepy.component {
-    props = {
-      num: {
-        type: [Number, String],
-        coerce: function (v) {
-          return +v
-        },
-        default: 50
-      }
-    }
-
-    data = {
-    }
-    events = {
-      'index-broadcast': (...args) => {
-        let $event = args[args.length - 1]
-        console.log(`${this.$name} receive ${$event.name} from ${$event.source.$name}`)
-      }
-    }
-
-    watch = {
-      num (curVal, oldVal) {
-        console.log(`旧值：${oldVal}，新值：${curVal}`)
-      }
-    }
-
-    methods = {
-      plus () {
-        this.num = this.num + 1
-        console.log(this.$name + ' plus tap')
-
-        this.$emit('index-emit', 1, 2, 3)
-      },
-      minus () {
-        this.num = this.num - 1
-        console.log(this.$name + ' minus tap')
-      }
-    }
-  }
-</script>
diff --git a/packages/wepy-cli/templates/template/src/components/group.wpy b/packages/wepy-cli/templates/template/src/components/group.wpy
deleted file mode 100644
index c033b1b1b..000000000
--- a/packages/wepy-cli/templates/template/src/components/group.wpy
+++ /dev/null
@@ -1,35 +0,0 @@
-<style type="less">
-  .group {}
-</style>
-<template>
-  <view class="group">
-    <text class="id">{{grouplist.id}}. </text>
-    <text class="name" @tap="tap">{{grouplist.name}}</text>
-    <view>
-      <repeat for="{{grouplist.list}}" item="item">
-        <groupitem :gitem="item"></groupitem>
-      </repeat>
-    </view>
-  </view>
-</template>
-<script>
-  import wepy from 'wepy'
-  import GroupItem from './groupitem'
-
-  export default class Group extends wepy.component {
-    props = {
-      grouplist: {},
-      index: {}
-    }
-
-    components = {
-      groupitem: GroupItem
-    }
-    methods = {
-      tap () {
-        this.grouplist.name = `Parent Random(${Math.random()})`
-        console.log(`Clicked Group ${this.$index}, ID is ${this.grouplist.id}`)
-      }
-    }
-  }
-</script>
diff --git a/packages/wepy-cli/templates/template/src/components/groupitem.wpy b/packages/wepy-cli/templates/template/src/components/groupitem.wpy
deleted file mode 100644
index 873c1ed39..000000000
--- a/packages/wepy-cli/templates/template/src/components/groupitem.wpy
+++ /dev/null
@@ -1,27 +0,0 @@
-<style type="less">
-.groupitem {
-}
-</style>
-<template>
-  <view class="groupitem">
-    --<text class="id">{{gitem.childid}}.</text>
-    <text class="name" @tap="tap"> {{gitem.childname}}</text>
-  </view>
-</template>
-<script>
-  import wepy from 'wepy'
-
-  export default class GroupItem extends wepy.component {
-    props = {
-      gitem: {}
-    }
-    data = {
-    }
-    methods = {
-      tap () {
-        this.gitem.childname = `Child Random(${Math.random()})`
-        console.log(`Clicked Group ${this.$parent.$index}. Item ${this.$index}, ID is ${this.gitem.childid}`)
-      }
-    }
-  }
-</script>
diff --git a/packages/wepy-cli/templates/template/src/components/list.wpy b/packages/wepy-cli/templates/template/src/components/list.wpy
deleted file mode 100644
index 67c58cf26..000000000
--- a/packages/wepy-cli/templates/template/src/components/list.wpy
+++ /dev/null
@@ -1,55 +0,0 @@
-<style lang="less">
-  .mylist:odd {
-    color: red;
-  }
-  .mylist:even {
-    color: green;
-  }
-</style>
-<template>
-  <view class="list">
-  <view>
-    <button @tap="add" size="mini">添加列表</button>
-  </view>
-    <block wx:for-items="{{list}}" wx:for-index="index" wx:for-item="item" wx:key="id">
-      <view @tap="tap" class="mylist">
-        <text>{{item.id}}</text>: {{item.title}}
-      </view>
-    </block>
-  </view>
-</template>
-<script>
-  import wepy from 'wepy'
-
-  export default class List extends wepy.component {
-    data = {
-      list: [
-        {
-          id: '0',
-          title: 'loading'
-        }
-      ]
-    }
-
-    events = {
-      'index-broadcast': (...args) => {
-        let $event = args[args.length - 1]
-        console.log(`${this.$name} receive ${$event.name} from ${$event.source.name}`)
-      }
-    }
-
-    methods = {
-      tap () {
-        // this.num = this.num + 1
-        console.log(this.$name + ' tap')
-      },
-      add () {
-        let len = this.list.length
-        this.list.push({id: len + 1, title: 'title_' + len})
-      }
-    }
-
-    onLoad () {
-    }
-  }
-</script>
diff --git a/packages/wepy-cli/templates/template/src/components/panel.wpy b/packages/wepy-cli/templates/template/src/components/panel.wpy
deleted file mode 100644
index f7568163e..000000000
--- a/packages/wepy-cli/templates/template/src/components/panel.wpy
+++ /dev/null
@@ -1,43 +0,0 @@
-<style lang="less">
-  .panel {
-    width: 100%;
-    margin-top: 20rpx;
-    text-align: left;
-    font-size: 12px;
-    padding-top: 20rpx;
-    padding-left: 50rpx;
-    padding-bottom: 20rpx;
-    border: 1px solid #ccc;
-
-    .title {
-      padding-bottom: 20rpx;
-      font-size: 14px;
-      font-weight: bold;
-    }
-    .info {
-      padding: 15rpx;
-    }
-    .testcounter {
-      margin-top: 15rpx;
-      position: absolute;
-    }
-    .counterview {
-      margin-left: 120rpx;
-    }
-  }
-</style>
-<template>
-  <view class="panel">
-    <slot name="title">
-      Title
-    </slot>
-    <slot>
-    </slot>
-  </view>
-</template>
-<script>
-  import wepy from 'wepy'
-
-  export default class Panel extends wepy.component {
-  }
-</script>
diff --git a/packages/wepy-cli/templates/template/src/index.template.html b/packages/wepy-cli/templates/template/src/index.template.html
deleted file mode 100644
index 93a1b07f2..000000000
--- a/packages/wepy-cli/templates/template/src/index.template.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-  <meta name="apple-mobile-web-app-capable" content="yes">
-  <meta name="format-detection" content="telephone=no">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-  <meta content="telephone=no" name="format-detection">
-
-  <title>转 WEB DEMO</title>
-  <style>
-      html, body, #app {height: 100%;}
-  </style>
-</head>
-<body>
-  <div id="app">
-    <router-view></router-view>
-    <script src="./index.js"></script>
-  </div>
-</body>
-</html>
diff --git a/packages/wepy-cli/templates/template/src/mixins/test.js b/packages/wepy-cli/templates/template/src/mixins/test.js
deleted file mode 100644
index 8d72ff00e..000000000
--- a/packages/wepy-cli/templates/template/src/mixins/test.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import wepy from 'wepy'
-
-export default class testMixin extends wepy.mixin {
-  data = {
-    mixin: 'This is mixin data.'
-  }
-  methods = {
-    tap () {
-      this.mixin = 'mixin data was changed'
-      console.log('mixin method tap')
-    }
-  }
-
-  onShow() {
-    console.log('mixin onShow')
-  }
-
-  onLoad() {
-    console.log('mixin onLoad')
-  }
-}
diff --git a/packages/wepy-cli/templates/template/src/pages/index-redux.wpy b/packages/wepy-cli/templates/template/src/pages/index-redux.wpy
deleted file mode 100644
index b76ad3a41..000000000
--- a/packages/wepy-cli/templates/template/src/pages/index-redux.wpy
+++ /dev/null
@@ -1,250 +0,0 @@
-<style lang="less">
-  .userinfo {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-  }
-
-  .userinfo-avatar {
-    width: 80rpx;
-    height: 80rpx;
-    border-radius: 50%;
-  }
-
-  .userinfo-nickname {
-    color: #aaa;
-  }
-</style>
-<template>
-  <view class="container">
-    <view class="userinfo" @tap="handleViewTap">
-      <image class="userinfo-avatar" src="{{ userInfo.avatarUrl }}" background-size="cover"/>
-      <view class="userinfo-nickname">{{ userInfo.nickName }}</view>
-    </view>
-
-    <panel>
-      <view class="title" slot="title">测试数据绑定</view>
-
-      <text class="info">{{normalTitle}}</text>
-      <text class="info">{{setTimeoutTitle}}</text>
-      <text class="info">{{mixin}}</text>
-      <text class="info">{{mynum}}</text>
-      <text class="info">{{now}}</text>
-      <text class="info">{{num}}</text>
-      <text class="info">{{asyncNum}}</text>
-      <text class="info">{{sumNum}}</text>
-      <button @tap="plus('a')" size="mini">  +  </button>
-    </panel>
-
-    <panel>
-      <view class="title" slot="title">其它测试</view>
-      <button @tap="toast" size="mini">第三方组件</button>
-      <button @tap="communicate" size="mini">组件通信</button>
-      <button @tap="tap" size="mini">混合TAP事件</button>
-    </panel>
-
-    <panel>
-      <view class="title" slot="title">测试并发网络请求</view>
-      <view>返回结果: <text>{{netrst}}</text></view>
-      <button @tap="request" size="mini"> 点我发起10个请求 </button>
-    </panel>
-
-    <panel>
-      <view class="title" slot="title">测试组件</view>
-
-      <text class="testcounter">计数组件1: </text>
-      <view class="counterview">
-        <counter1 @index-emit="counterEmit" />
-      </view>
-
-      <text class="testcounter">计数组件2: </text>
-
-      <view class="counterview">
-        <counter2 :num.sync="mynum"></counter2>
-      </view>
-    </panel>
-
-    <panel>
-      <view class="title" slot="title">测试组件Repeat</view>
-      <repeat for="{{groupList}}" index="index" item="item" key="key">
-        <group :grouplist="item" :indexa="index"></group>
-      </repeat>
-    </panel>
-
-    <panel>
-      <view class="title" slot="title">测试列表</view>
-      <list></list>
-    </panel>
-
-    <toast />
-  </view>
-</template>
-
-<script>
-  import wepy from 'wepy'
-  import { connect } from 'wepy-redux'
-  import List from '../components/list'
-  import Panel from '../components/panel'
-  import Counter from 'counter' // alias example
-  import Group from '../components/group'
-  import Toast from 'wepy-com-toast'
-  import testMixin from '../mixins/test'
-
-  @connect({
-    num (state) {
-      return state.counter.num
-    },
-    asyncNum (state) {
-      return state.counter.asyncNum
-    },
-    sumNum (state) {
-      return state.counter.num + state.counter.asyncNum
-    }
-  })
-  export default class Index extends wepy.page {
-    config = {
-      navigationBarTitleText: 'test'
-    }
-    components = {
-      panel: Panel,
-      counter1: Counter,
-      counter2: Counter,
-      list: List,
-      group: Group,
-      toast: Toast
-    }
-
-    mixins = [testMixin]
-
-    data = {
-      mynum: 20,
-      userInfo: {
-        nickName: '加载中...'
-      },
-      normalTitle: '原始标题',
-      setTimeoutTitle: '标题三秒后会被修改',
-      count: 0,
-      netrst: '',
-      groupList: [
-        {
-          id: 1,
-          name: '点击改变',
-          list: [
-            {
-              childid: '1.1',
-              childname: '子项，点我改变'
-            }, {
-              childid: '1.2',
-              childname: '子项，点我改变'
-            }, {
-              childid: '1.3',
-              childname: '子项，点我改变'
-            }
-          ]
-        },
-        {
-          id: 2,
-          name: '点击改变',
-          list: [
-            {
-              childid: '2.1',
-              childname: '子项，点我改变'
-            }, {
-              childid: '2.2',
-              childname: '子项，点我改变'
-            }, {
-              childid: '2.3',
-              childname: '子项，点我改变'
-            }
-          ]
-        },
-        {
-          id: 3,
-          name: '点击改变',
-          list: [
-            {
-              childid: '3.1',
-              childname: '子项，点我改变'
-            }
-          ]
-        }
-      ]
-    }
-
-    computed = {
-      now () {
-        return +new Date()
-      }
-    }
-
-    methods = {
-      plus () {
-        this.mynum++
-      },
-      toast () {
-        let promise = this.$invoke('toast', 'show', {
-          title: '自定义标题',
-          img: 'https://raw.githubusercontent.com/kiinlam/wetoast/master/images/star.png'
-        })
-
-        promise.then((d) => {
-          console.log('toast done')
-        })
-      },
-      tap () {
-        console.log('do noting from ' + this.$name)
-      },
-      communicate () {
-        console.log(this.$name + ' tap')
-
-        this.$invoke('counter2', 'minus', 45, 6)
-        this.$invoke('counter1', 'plus', 45, 6)
-
-        this.$broadcast('index-broadcast', 1, 3, 4)
-      },
-      request () {
-        let self = this
-        let i = 10
-        let map = ['MA==', 'MQo=', 'Mg==', 'Mw==', 'NA==', 'NQ==', 'Ng==', 'Nw==', 'OA==', 'OQ==']
-        while (i--) {
-          wepy.request({
-            url: 'https://www.madcoder.cn/tests/sleep.php?time=1&t=css&c=' + map[i] + '&i=' + i,
-            success: function (d) {
-              self.netrst += d.data + '.'
-              self.$apply()
-            }
-          })
-        }
-      },
-      counterEmit (...args) {
-        let $event = args[args.length - 1]
-        console.log(`${this.$name} receive ${$event.name} from ${$event.source.$name}`)
-      }
-    }
-
-    events = {
-      'index-emit': (...args) => {
-        let $event = args[args.length - 1]
-        console.log(`${this.$name} receive ${$event.name} from ${$event.source.$name}`)
-      }
-    }
-
-    onLoad() {
-      let self = this
-      this.$parent.getUserInfo(function (userInfo) {
-        if (userInfo) {
-          self.userInfo = userInfo
-        }
-        self.normalTitle = '标题已被修改'
-
-        self.setTimeoutTitle = '标题三秒后会被修改'
-        setTimeout(() => {
-          self.setTimeoutTitle = '到三秒了'
-          self.$apply()
-        }, 3000)
-
-        self.$apply()
-      })
-    }
-  }
-</script>
diff --git a/packages/wepy-cli/templates/template/src/pages/index.wpy b/packages/wepy-cli/templates/template/src/pages/index.wpy
deleted file mode 100644
index df70212ac..000000000
--- a/packages/wepy-cli/templates/template/src/pages/index.wpy
+++ /dev/null
@@ -1,235 +0,0 @@
-<style lang="less">
-  .userinfo {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-  }
-
-  .userinfo-avatar {
-    width: 80rpx;
-    height: 80rpx;
-    border-radius: 50%;
-  }
-
-  .userinfo-nickname {
-    color: #aaa;
-  }
-</style>
-<template>
-  <view class="container">
-    <view class="userinfo" @tap="handleViewTap">
-      <image class="userinfo-avatar" src="{{ userInfo.avatarUrl }}" background-size="cover"/>
-      <view class="userinfo-nickname">{{ userInfo.nickName }}</view>
-    </view>
-
-    <panel>
-      <view class="title" slot="title">测试数据绑定</view>
-
-      <text class="info">{{normalTitle}}</text>
-      <text class="info">{{setTimeoutTitle}}</text>
-      <text class="info">{{mixin}}</text>
-      <text class="info">{{mynum}}</text>
-      <text class="info">{{now}}</text>
-      <button @tap="plus('a')" size="mini">  +  </button>
-    </panel>
-
-    <panel>
-      <view class="title" slot="title">其它测试</view>
-      <button @tap="toast" size="mini">第三方组件</button>
-      <button @tap="communicate" size="mini">组件通信</button>
-      <button @tap="tap" size="mini">混合TAP事件</button>
-    </panel>
-
-    <panel>
-      <view class="title" slot="title">测试并发网络请求</view>
-      <view>返回结果: <text>{{netrst}}</text></view>
-      <button @tap="request" size="mini"> 点我发起10个请求 </button>
-    </panel>
-
-    <panel>
-      <view class="title" slot="title">测试组件</view>
-
-      <text class="testcounter">计数组件1: </text>
-      <view class="counterview">
-        <counter1 @index-emit.user="counterEmit" />
-      </view>
-
-      <text class="testcounter">计数组件2: </text>
-
-      <view class="counterview">
-        <counter2 :num.sync="mynum"></counter2>
-      </view>
-    </panel>
-
-    <panel>
-      <view class="title" slot="title">测试组件Repeat</view>
-      <repeat for="{{groupList}}" index="index" item="item" key="key">
-        <group :grouplist="item" :indexa="index"></group>
-      </repeat>
-    </panel>
-
-    <panel>
-      <view class="title" slot="title">测试列表</view>
-      <list></list>
-    </panel>
-
-    <toast />
-  </view>
-</template>
-
-<script>
-  import wepy from 'wepy'
-  import List from '../components/list'
-  import Panel from '@/components/panel' // alias example
-  import Counter from 'counter' // alias example
-  import Group from '../components/group'
-  import Toast from 'wepy-com-toast'
-  import testMixin from '../mixins/test'
-
-  export default class Index extends wepy.page {
-    config = {
-      navigationBarTitleText: 'test'
-    }
-    components = {
-      panel: Panel,
-      counter1: Counter,
-      counter2: Counter,
-      list: List,
-      group: Group,
-      toast: Toast
-    }
-
-    mixins = [testMixin]
-
-    data = {
-      mynum: 20,
-      userInfo: {
-        nickName: '加载中...'
-      },
-      normalTitle: '原始标题',
-      setTimeoutTitle: '标题三秒后会被修改',
-      count: 0,
-      netrst: '',
-      groupList: [
-        {
-          id: 1,
-          name: '点击改变',
-          list: [
-            {
-              childid: '1.1',
-              childname: '子项，点我改变'
-            }, {
-              childid: '1.2',
-              childname: '子项，点我改变'
-            }, {
-              childid: '1.3',
-              childname: '子项，点我改变'
-            }
-          ]
-        },
-        {
-          id: 2,
-          name: '点击改变',
-          list: [
-            {
-              childid: '2.1',
-              childname: '子项，点我改变'
-            }, {
-              childid: '2.2',
-              childname: '子项，点我改变'
-            }, {
-              childid: '2.3',
-              childname: '子项，点我改变'
-            }
-          ]
-        },
-        {
-          id: 3,
-          name: '点击改变',
-          list: [
-            {
-              childid: '3.1',
-              childname: '子项，点我改变'
-            }
-          ]
-        }
-      ]
-    }
-
-    computed = {
-      now () {
-        return +new Date()
-      }
-    }
-
-    methods = {
-      plus () {
-        this.mynum++
-      },
-      toast () {
-        let promise = this.$invoke('toast', 'show', {
-          title: '自定义标题',
-          img: 'https://raw.githubusercontent.com/kiinlam/wetoast/master/images/star.png'
-        })
-
-        promise.then((d) => {
-          console.log('toast done')
-        })
-      },
-      tap () {
-        console.log('do noting from ' + this.$name)
-      },
-      communicate () {
-        console.log(this.$name + ' tap')
-
-        this.$invoke('counter2', 'minus', 45, 6)
-        this.$invoke('counter1', 'plus', 45, 6)
-
-        this.$broadcast('index-broadcast', 1, 3, 4)
-      },
-      request () {
-        let self = this
-        let i = 10
-        let map = ['MA==', 'MQo=', 'Mg==', 'Mw==', 'NA==', 'NQ==', 'Ng==', 'Nw==', 'OA==', 'OQ==']
-        while (i--) {
-          wepy.request({
-            url: 'https://www.madcoder.cn/tests/sleep.php?time=1&t=css&c=' + map[i] + '&i=' + i,
-            success: function (d) {
-              self.netrst += d.data + '.'
-              self.$apply()
-            }
-          })
-        }
-      },
-      counterEmit (...args) {
-        let $event = args[args.length - 1]
-        console.log(`${this.$name} receive ${$event.name} from ${$event.source.$name}`)
-      }
-    }
-
-    events = {
-      'index-emit': (...args) => {
-        let $event = args[args.length - 1]
-        console.log(`${this.$name} receive ${$event.name} from ${$event.source.$name}`)
-      }
-    }
-
-    onLoad() {
-      let self = this
-      this.$parent.getUserInfo(function (userInfo) {
-        if (userInfo) {
-          self.userInfo = userInfo
-        }
-        self.normalTitle = '标题已被修改'
-
-        self.setTimeoutTitle = '标题三秒后会被修改'
-        setTimeout(() => {
-          self.setTimeoutTitle = '到三秒了'
-          self.$apply()
-        }, 3000)
-
-        self.$apply()
-      })
-    }
-  }
-</script>
diff --git a/packages/wepy-cli/templates/template/src/store/actions/counter.js b/packages/wepy-cli/templates/template/src/store/actions/counter.js
deleted file mode 100644
index d076006f2..000000000
--- a/packages/wepy-cli/templates/template/src/store/actions/counter.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import { ASYNC_INCREMENT } from '../types/counter'
-import { createAction } from 'redux-actions'
-
-export const asyncInc = createAction(ASYNC_INCREMENT, () => {
-  return new Promise(resolve => {
-    setTimeout(() => {
-      resolve(1)
-    }, 1000)
-  })
-})
diff --git a/packages/wepy-cli/templates/template/src/store/actions/index.js b/packages/wepy-cli/templates/template/src/store/actions/index.js
deleted file mode 100644
index 1615d2c2b..000000000
--- a/packages/wepy-cli/templates/template/src/store/actions/index.js
+++ /dev/null
@@ -1 +0,0 @@
-export * from './counter'
diff --git a/packages/wepy-cli/templates/template/src/store/index.js b/packages/wepy-cli/templates/template/src/store/index.js
deleted file mode 100644
index 72eada0dd..000000000
--- a/packages/wepy-cli/templates/template/src/store/index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import { createStore, applyMiddleware } from 'redux'
-import promiseMiddleware from 'redux-promise'
-import rootReducer from './reducers'
-
-export default function configStore () {
-  const store = createStore(rootReducer, applyMiddleware(promiseMiddleware))
-  return store
-}
diff --git a/packages/wepy-cli/templates/template/src/store/reducers/counter.js b/packages/wepy-cli/templates/template/src/store/reducers/counter.js
deleted file mode 100644
index 09279393c..000000000
--- a/packages/wepy-cli/templates/template/src/store/reducers/counter.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import { handleActions } from 'redux-actions'
-import { INCREMENT, DECREMENT, ASYNC_INCREMENT } from '../types/counter'
-
-export default handleActions({
-  [INCREMENT] (state) {
-    return {
-      ...state,
-      num: state.num + 1
-    }
-  },
-  [DECREMENT] (state) {
-    return {
-      ...state,
-      num: state.num - 1
-    }
-  },
-  [ASYNC_INCREMENT] (state, action) {
-    return {
-      ...state,
-      asyncNum: state.asyncNum + action.payload
-    }
-  }
-}, {
-  num: 0,
-  asyncNum: 0
-})
diff --git a/packages/wepy-cli/templates/template/src/store/reducers/index.js b/packages/wepy-cli/templates/template/src/store/reducers/index.js
deleted file mode 100644
index b443112ed..000000000
--- a/packages/wepy-cli/templates/template/src/store/reducers/index.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import { combineReducers } from 'redux'
-import counter from './counter'
-
-export default combineReducers({
-  counter
-})
diff --git a/packages/wepy-cli/templates/template/src/store/types/counter.js b/packages/wepy-cli/templates/template/src/store/types/counter.js
deleted file mode 100644
index 5ee0bad67..000000000
--- a/packages/wepy-cli/templates/template/src/store/types/counter.js
+++ /dev/null
@@ -1,5 +0,0 @@
-export const INCREMENT = 'INCREMENT'
-
-export const DECREMENT = 'DECREMENT'
-
-export const ASYNC_INCREMENT = 'ASYNC_INCREMENT'
diff --git a/packages/wepy-cli/templates/template/src/store/types/index.js b/packages/wepy-cli/templates/template/src/store/types/index.js
deleted file mode 100644
index 1615d2c2b..000000000
--- a/packages/wepy-cli/templates/template/src/store/types/index.js
+++ /dev/null
@@ -1 +0,0 @@
-export * from './counter'
diff --git a/packages/wepy-cli/templates/template/wepy.config.js b/packages/wepy-cli/templates/template/wepy.config.js
deleted file mode 100644
index e586c4c4b..000000000
--- a/packages/wepy-cli/templates/template/wepy.config.js
+++ /dev/null
@@ -1,79 +0,0 @@
-const path = require('path');
-var prod = process.env.NODE_ENV === 'production'
-
-module.exports = {
-  wpyExt: '.wpy',
-  eslint: true,
-  cliLogs: true,
-  build: {
-    web: {
-      htmlTemplate: path.join('src', 'index.template.html'),
-      htmlOutput: path.join('web', 'index.html'),
-      jsOutput: path.join('web', 'index.js')
-    }
-  },
-  resolve: {
-    alias: {
-      counter: path.join(__dirname, 'src/components/counter'),
-      '@': path.join(__dirname, 'src')
-    },
-    modules: ['node_modules']
-  },
-  compilers: {
-    less: {
-      compress: true
-    },
-    /*sass: {
-      outputStyle: 'compressed'
-    },*/
-    babel: {
-      sourceMap: true,
-      presets: [
-        'env'
-      ],
-      plugins: [
-        'transform-class-properties',
-        'transform-decorators-legacy',
-        'transform-object-rest-spread',
-        'transform-export-extensions',
-      ]
-    }
-  },
-  plugins: {
-  },
-  appConfig: {
-    noPromiseAPI: ['createSelectorQuery']
-  }
-}
-
-if (prod) {
-
-  module.exports.cliLogs = false;
-
-  delete module.exports.compilers.babel.sourcesMap;
-  // 压缩sass
-  // module.exports.compilers['sass'] = {outputStyle: 'compressed'}
-
-  // 压缩less
-  module.exports.compilers['less'] = {compress: true}
-
-  // 压缩js
-  module.exports.plugins = {
-    uglifyjs: {
-      filter: /\.js$/,
-      config: {
-      }
-    },
-    imagemin: {
-      filter: /\.(jpg|png|jpeg)$/,
-      config: {
-        jpg: {
-          quality: 80
-        },
-        png: {
-          quality: 80
-        }
-      }
-    }
-  }
-}
diff --git a/packages/wepy-cli/yarn.lock b/packages/wepy-cli/yarn.lock
deleted file mode 100644
index f50b64811..000000000
--- a/packages/wepy-cli/yarn.lock
+++ /dev/null
@@ -1,2010 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-abbrev@1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"
-
-ajv@^4.9.1:
-  version "4.11.7"
-  resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.7.tgz#8655a5d86d0824985cc471a1d913fb6729a0ec48"
-  dependencies:
-    co "^4.6.0"
-    json-stable-stringify "^1.0.1"
-
-ansi-align@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-1.1.0.tgz#2f0c1658829739add5ebb15e6b0c6e3423f016ba"
-  dependencies:
-    string-width "^1.0.1"
-
-ansi-regex@^2.0.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
-
-ansi-styles@^2.2.1:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
-
-anymatch@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507"
-  dependencies:
-    arrify "^1.0.0"
-    micromatch "^2.1.5"
-
-aproba@^1.0.3:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab"
-
-are-we-there-yet@~1.1.2:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
-  dependencies:
-    delegates "^1.0.0"
-    readable-stream "^2.0.6"
-
-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-flatten@^1.0.1:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1"
-
-array-unique@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
-
-arrify@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
-
-asn1@~0.2.3:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
-
-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"
-
-assert-plus@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
-
-async-each@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
-
-asynckit@^0.4.0:
-  version "0.4.0"
-  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
-
-aws-sign2@~0.6.0:
-  version "0.6.0"
-  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
-
-aws4@^1.2.1:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
-
-babel-cli@^6.18.0:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283"
-  dependencies:
-    babel-core "^6.24.1"
-    babel-polyfill "^6.23.0"
-    babel-register "^6.24.1"
-    babel-runtime "^6.22.0"
-    commander "^2.8.1"
-    convert-source-map "^1.1.0"
-    fs-readdir-recursive "^1.0.0"
-    glob "^7.0.0"
-    lodash "^4.2.0"
-    output-file-sync "^1.1.0"
-    path-is-absolute "^1.0.0"
-    slash "^1.0.0"
-    source-map "^0.5.0"
-    v8flags "^2.0.10"
-  optionalDependencies:
-    chokidar "^1.6.1"
-
-babel-code-frame@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
-  dependencies:
-    chalk "^1.1.0"
-    esutils "^2.0.2"
-    js-tokens "^3.0.0"
-
-babel-core@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83"
-  dependencies:
-    babel-code-frame "^6.22.0"
-    babel-generator "^6.24.1"
-    babel-helpers "^6.24.1"
-    babel-messages "^6.23.0"
-    babel-register "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-    babel-traverse "^6.24.1"
-    babel-types "^6.24.1"
-    babylon "^6.11.0"
-    convert-source-map "^1.1.0"
-    debug "^2.1.1"
-    json5 "^0.5.0"
-    lodash "^4.2.0"
-    minimatch "^3.0.2"
-    path-is-absolute "^1.0.0"
-    private "^0.1.6"
-    slash "^1.0.0"
-    source-map "^0.5.0"
-
-babel-generator@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497"
-  dependencies:
-    babel-messages "^6.23.0"
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-    detect-indent "^4.0.0"
-    jsesc "^1.3.0"
-    lodash "^4.2.0"
-    source-map "^0.5.0"
-    trim-right "^1.0.1"
-
-babel-helper-bindify-decorators@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-traverse "^6.24.1"
-    babel-types "^6.24.1"
-
-babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
-  dependencies:
-    babel-helper-explode-assignable-expression "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-helper-call-delegate@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
-  dependencies:
-    babel-helper-hoist-variables "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-traverse "^6.24.1"
-    babel-types "^6.24.1"
-
-babel-helper-define-map@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080"
-  dependencies:
-    babel-helper-function-name "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-    lodash "^4.2.0"
-
-babel-helper-explode-assignable-expression@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-traverse "^6.24.1"
-    babel-types "^6.24.1"
-
-babel-helper-explode-class@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb"
-  dependencies:
-    babel-helper-bindify-decorators "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-traverse "^6.24.1"
-    babel-types "^6.24.1"
-
-babel-helper-function-name@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
-  dependencies:
-    babel-helper-get-function-arity "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-    babel-traverse "^6.24.1"
-    babel-types "^6.24.1"
-
-babel-helper-get-function-arity@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-helper-hoist-variables@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-helper-optimise-call-expression@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-helper-regex@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-    lodash "^4.2.0"
-
-babel-helper-remap-async-to-generator@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
-  dependencies:
-    babel-helper-function-name "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-    babel-traverse "^6.24.1"
-    babel-types "^6.24.1"
-
-babel-helper-replace-supers@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
-  dependencies:
-    babel-helper-optimise-call-expression "^6.24.1"
-    babel-messages "^6.23.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-    babel-traverse "^6.24.1"
-    babel-types "^6.24.1"
-
-babel-helpers@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-
-babel-messages@^6.23.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-check-es2015-constants@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-syntax-async-functions@^6.8.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
-
-babel-plugin-syntax-async-generators@^6.5.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a"
-
-babel-plugin-syntax-class-constructor-call@^6.18.0:
-  version "6.18.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416"
-
-babel-plugin-syntax-class-properties@^6.8.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
-
-babel-plugin-syntax-decorators@^6.13.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b"
-
-babel-plugin-syntax-dynamic-import@^6.18.0:
-  version "6.18.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da"
-
-babel-plugin-syntax-exponentiation-operator@^6.8.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
-
-babel-plugin-syntax-export-extensions@^6.8.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721"
-
-babel-plugin-syntax-object-rest-spread@^6.8.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
-
-babel-plugin-syntax-trailing-function-commas@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
-
-babel-plugin-transform-async-generator-functions@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db"
-  dependencies:
-    babel-helper-remap-async-to-generator "^6.24.1"
-    babel-plugin-syntax-async-generators "^6.5.0"
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-async-to-generator@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
-  dependencies:
-    babel-helper-remap-async-to-generator "^6.24.1"
-    babel-plugin-syntax-async-functions "^6.8.0"
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-class-constructor-call@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9"
-  dependencies:
-    babel-plugin-syntax-class-constructor-call "^6.18.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-
-babel-plugin-transform-class-properties@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
-  dependencies:
-    babel-helper-function-name "^6.24.1"
-    babel-plugin-syntax-class-properties "^6.8.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-
-babel-plugin-transform-decorators@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d"
-  dependencies:
-    babel-helper-explode-class "^6.24.1"
-    babel-plugin-syntax-decorators "^6.13.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-    babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-arrow-functions@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-block-scoping@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-    babel-traverse "^6.24.1"
-    babel-types "^6.24.1"
-    lodash "^4.2.0"
-
-babel-plugin-transform-es2015-classes@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
-  dependencies:
-    babel-helper-define-map "^6.24.1"
-    babel-helper-function-name "^6.24.1"
-    babel-helper-optimise-call-expression "^6.24.1"
-    babel-helper-replace-supers "^6.24.1"
-    babel-messages "^6.23.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-    babel-traverse "^6.24.1"
-    babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-computed-properties@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-
-babel-plugin-transform-es2015-destructuring@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-duplicate-keys@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-for-of@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-function-name@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
-  dependencies:
-    babel-helper-function-name "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-literals@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-modules-amd@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
-  dependencies:
-    babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-
-babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe"
-  dependencies:
-    babel-plugin-transform-strict-mode "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-    babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-modules-systemjs@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
-  dependencies:
-    babel-helper-hoist-variables "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-
-babel-plugin-transform-es2015-modules-umd@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
-  dependencies:
-    babel-plugin-transform-es2015-modules-amd "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-
-babel-plugin-transform-es2015-object-super@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
-  dependencies:
-    babel-helper-replace-supers "^6.24.1"
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-parameters@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
-  dependencies:
-    babel-helper-call-delegate "^6.24.1"
-    babel-helper-get-function-arity "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-    babel-traverse "^6.24.1"
-    babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-shorthand-properties@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-spread@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-sticky-regex@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
-  dependencies:
-    babel-helper-regex "^6.24.1"
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-template-literals@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-typeof-symbol@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-unicode-regex@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
-  dependencies:
-    babel-helper-regex "^6.24.1"
-    babel-runtime "^6.22.0"
-    regexpu-core "^2.0.0"
-
-babel-plugin-transform-exponentiation-operator@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
-  dependencies:
-    babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
-    babel-plugin-syntax-exponentiation-operator "^6.8.0"
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-export-extensions@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653"
-  dependencies:
-    babel-plugin-syntax-export-extensions "^6.8.0"
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-object-rest-spread@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921"
-  dependencies:
-    babel-plugin-syntax-object-rest-spread "^6.8.0"
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-regenerator@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418"
-  dependencies:
-    regenerator-transform "0.9.11"
-
-babel-plugin-transform-strict-mode@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-polyfill@^6.23.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d"
-  dependencies:
-    babel-runtime "^6.22.0"
-    core-js "^2.4.0"
-    regenerator-runtime "^0.10.0"
-
-babel-preset-es2015@^6.18.0:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939"
-  dependencies:
-    babel-plugin-check-es2015-constants "^6.22.0"
-    babel-plugin-transform-es2015-arrow-functions "^6.22.0"
-    babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
-    babel-plugin-transform-es2015-block-scoping "^6.24.1"
-    babel-plugin-transform-es2015-classes "^6.24.1"
-    babel-plugin-transform-es2015-computed-properties "^6.24.1"
-    babel-plugin-transform-es2015-destructuring "^6.22.0"
-    babel-plugin-transform-es2015-duplicate-keys "^6.24.1"
-    babel-plugin-transform-es2015-for-of "^6.22.0"
-    babel-plugin-transform-es2015-function-name "^6.24.1"
-    babel-plugin-transform-es2015-literals "^6.22.0"
-    babel-plugin-transform-es2015-modules-amd "^6.24.1"
-    babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
-    babel-plugin-transform-es2015-modules-systemjs "^6.24.1"
-    babel-plugin-transform-es2015-modules-umd "^6.24.1"
-    babel-plugin-transform-es2015-object-super "^6.24.1"
-    babel-plugin-transform-es2015-parameters "^6.24.1"
-    babel-plugin-transform-es2015-shorthand-properties "^6.24.1"
-    babel-plugin-transform-es2015-spread "^6.22.0"
-    babel-plugin-transform-es2015-sticky-regex "^6.24.1"
-    babel-plugin-transform-es2015-template-literals "^6.22.0"
-    babel-plugin-transform-es2015-typeof-symbol "^6.22.0"
-    babel-plugin-transform-es2015-unicode-regex "^6.24.1"
-    babel-plugin-transform-regenerator "^6.24.1"
-
-babel-preset-stage-1@^6.16.0:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0"
-  dependencies:
-    babel-plugin-transform-class-constructor-call "^6.24.1"
-    babel-plugin-transform-export-extensions "^6.22.0"
-    babel-preset-stage-2 "^6.24.1"
-
-babel-preset-stage-2@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1"
-  dependencies:
-    babel-plugin-syntax-dynamic-import "^6.18.0"
-    babel-plugin-transform-class-properties "^6.24.1"
-    babel-plugin-transform-decorators "^6.24.1"
-    babel-preset-stage-3 "^6.24.1"
-
-babel-preset-stage-3@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395"
-  dependencies:
-    babel-plugin-syntax-trailing-function-commas "^6.22.0"
-    babel-plugin-transform-async-generator-functions "^6.24.1"
-    babel-plugin-transform-async-to-generator "^6.24.1"
-    babel-plugin-transform-exponentiation-operator "^6.24.1"
-    babel-plugin-transform-object-rest-spread "^6.22.0"
-
-babel-register@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f"
-  dependencies:
-    babel-core "^6.24.1"
-    babel-runtime "^6.22.0"
-    core-js "^2.4.0"
-    home-or-tmp "^2.0.0"
-    lodash "^4.2.0"
-    mkdirp "^0.5.1"
-    source-map-support "^0.4.2"
-
-babel-runtime@^6.18.0, babel-runtime@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b"
-  dependencies:
-    core-js "^2.4.0"
-    regenerator-runtime "^0.10.0"
-
-babel-template@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-traverse "^6.24.1"
-    babel-types "^6.24.1"
-    babylon "^6.11.0"
-    lodash "^4.2.0"
-
-babel-traverse@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695"
-  dependencies:
-    babel-code-frame "^6.22.0"
-    babel-messages "^6.23.0"
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-    babylon "^6.15.0"
-    debug "^2.2.0"
-    globals "^9.0.0"
-    invariant "^2.2.0"
-    lodash "^4.2.0"
-
-babel-types@^6.19.0, babel-types@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975"
-  dependencies:
-    babel-runtime "^6.22.0"
-    esutils "^2.0.2"
-    lodash "^4.2.0"
-    to-fast-properties "^1.0.1"
-
-babel@^6.5.2:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel/-/babel-6.23.0.tgz#d0d1e7d803e974765beea3232d4e153c0efb90f4"
-
-babylon@^6.11.0, babylon@^6.15.0:
-  version "6.17.0"
-  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.0.tgz#37da948878488b9c4e3c4038893fa3314b3fc932"
-
-balanced-match@^0.4.1:
-  version "0.4.2"
-  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
-
-bcrypt-pbkdf@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
-  dependencies:
-    tweetnacl "^0.14.3"
-
-binary-extensions@^1.0.0:
-  version "1.8.0"
-  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774"
-
-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"
-
-boom@2.x.x:
-  version "2.10.1"
-  resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
-  dependencies:
-    hoek "2.x.x"
-
-boxen@^0.6.0:
-  version "0.6.0"
-  resolved "https://registry.yarnpkg.com/boxen/-/boxen-0.6.0.tgz#8364d4248ac34ff0ef1b2f2bf49a6c60ce0d81b6"
-  dependencies:
-    ansi-align "^1.1.0"
-    camelcase "^2.1.0"
-    chalk "^1.1.1"
-    cli-boxes "^1.0.0"
-    filled-array "^1.0.0"
-    object-assign "^4.0.1"
-    repeating "^2.0.0"
-    string-width "^1.0.1"
-    widest-line "^1.0.0"
-
-brace-expansion@^1.0.0:
-  version "1.1.7"
-  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59"
-  dependencies:
-    balanced-match "^0.4.1"
-    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"
-
-buffer-shims@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51"
-
-camelcase@^2.1.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
-
-capture-stack-trace@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d"
-
-caseless@~0.12.0:
-  version "0.12.0"
-  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
-
-chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
-  dependencies:
-    ansi-styles "^2.2.1"
-    escape-string-regexp "^1.0.2"
-    has-ansi "^2.0.0"
-    strip-ansi "^3.0.0"
-    supports-color "^2.0.0"
-
-chokidar@^1.6.1:
-  version "1.6.1"
-  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2"
-  dependencies:
-    anymatch "^1.3.0"
-    async-each "^1.0.0"
-    glob-parent "^2.0.0"
-    inherits "^2.0.1"
-    is-binary-path "^1.0.0"
-    is-glob "^2.0.0"
-    path-is-absolute "^1.0.0"
-    readdirp "^2.0.0"
-  optionalDependencies:
-    fsevents "^1.0.0"
-
-cli-boxes@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
-
-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"
-
-colors@^1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
-
-combined-stream@^1.0.5, combined-stream@~1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
-  dependencies:
-    delayed-stream "~1.0.0"
-
-commander@^2.8.1, commander@^2.9.0:
-  version "2.9.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
-  dependencies:
-    graceful-readlink ">= 1.0.0"
-
-compare-versions@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.0.1.tgz#e60915b7fb294e29bbb60869188762beeb871443"
-
-concat-map@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
-
-configstore@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/configstore/-/configstore-2.1.0.tgz#737a3a7036e9886102aa6099e47bb33ab1aba1a1"
-  dependencies:
-    dot-prop "^3.0.0"
-    graceful-fs "^4.1.2"
-    mkdirp "^0.5.0"
-    object-assign "^4.0.1"
-    os-tmpdir "^1.0.0"
-    osenv "^0.1.0"
-    uuid "^2.0.1"
-    write-file-atomic "^1.1.2"
-    xdg-basedir "^2.0.0"
-
-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"
-
-convert-source-map@^1.1.0:
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5"
-
-core-js@^2.4.0:
-  version "2.4.1"
-  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e"
-
-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"
-
-create-error-class@^3.0.1:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
-  dependencies:
-    capture-stack-trace "^1.0.0"
-
-cryptiles@2.x.x:
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
-  dependencies:
-    boom "2.x.x"
-
-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"
-
-debug@^2.1.1, debug@^2.2.0:
-  version "2.6.4"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.4.tgz#7586a9b3c39741c0282ae33445c4e8ac74734fe0"
-  dependencies:
-    ms "0.7.3"
-
-deep-extend@~0.4.0:
-  version "0.4.1"
-  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253"
-
-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@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
-  dependencies:
-    repeating "^2.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"
-
-duplexer2@^0.1.4:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
-  dependencies:
-    readable-stream "^2.0.2"
-
-ecc-jsbn@~0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
-  dependencies:
-    jsbn "~0.1.0"
-
-error-ex@^1.2.0:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
-  dependencies:
-    is-arrayish "^0.2.1"
-
-escape-string-regexp@^1.0.2:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
-
-esutils@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
-
-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-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@~3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4"
-
-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"
-
-extsprintf@1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
-
-filename-regex@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775"
-
-fill-range@^2.1.0:
-  version "2.2.3"
-  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
-  dependencies:
-    is-number "^2.1.0"
-    isobject "^2.0.0"
-    randomatic "^1.1.3"
-    repeat-element "^1.1.2"
-    repeat-string "^1.5.2"
-
-filled-array@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/filled-array/-/filled-array-1.1.0.tgz#c3c4f6c663b923459a9aa29912d2d031f1507f84"
-
-flatten@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
-
-for-in@^1.0.1:
-  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.1.1:
-  version "2.1.4"
-  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
-  dependencies:
-    asynckit "^0.4.0"
-    combined-stream "^1.0.5"
-    mime-types "^2.1.12"
-
-fs-readdir-recursive@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560"
-
-fs.realpath@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
-
-fsevents@^1.0.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff"
-  dependencies:
-    nan "^2.3.0"
-    node-pre-gyp "^0.6.29"
-
-fstream-ignore@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
-  dependencies:
-    fstream "^1.0.0"
-    inherits "2"
-    minimatch "^3.0.0"
-
-fstream@^1.0.0, fstream@^1.0.10, 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.1:
-  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"
-
-getpass@^0.1.1:
-  version "0.1.6"
-  resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6"
-  dependencies:
-    assert-plus "^1.0.0"
-
-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@^7.0.0, glob@^7.0.5:
-  version "7.1.1"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
-  dependencies:
-    fs.realpath "^1.0.0"
-    inflight "^1.0.4"
-    inherits "2"
-    minimatch "^3.0.2"
-    once "^1.3.0"
-    path-is-absolute "^1.0.0"
-
-globals@^9.0.0:
-  version "9.17.0"
-  resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286"
-
-got@^5.0.0:
-  version "5.7.1"
-  resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35"
-  dependencies:
-    create-error-class "^3.0.1"
-    duplexer2 "^0.1.4"
-    is-redirect "^1.0.0"
-    is-retry-allowed "^1.0.0"
-    is-stream "^1.0.0"
-    lowercase-keys "^1.0.0"
-    node-status-codes "^1.0.0"
-    object-assign "^4.0.1"
-    parse-json "^2.1.0"
-    pinkie-promise "^2.0.0"
-    read-all-stream "^3.0.0"
-    readable-stream "^2.0.5"
-    timed-out "^3.0.0"
-    unzip-response "^1.0.2"
-    url-parse-lax "^1.0.0"
-
-graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4:
-  version "4.1.11"
-  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
-
-"graceful-readlink@>= 1.0.0":
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
-
-har-schema@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
-
-har-validator@~4.2.1:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
-  dependencies:
-    ajv "^4.9.1"
-    har-schema "^1.0.5"
-
-has-ansi@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
-  dependencies:
-    ansi-regex "^2.0.0"
-
-has-flag@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
-
-has-unicode@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
-
-hash-sum@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04"
-
-hawk@~3.1.3:
-  version "3.1.3"
-  resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
-  dependencies:
-    boom "2.x.x"
-    cryptiles "2.x.x"
-    hoek "2.x.x"
-    sntp "1.x.x"
-
-hoek@2.x.x:
-  version "2.16.3"
-  resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
-
-home-or-tmp@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
-  dependencies:
-    os-homedir "^1.0.0"
-    os-tmpdir "^1.0.1"
-
-http-signature@~1.1.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
-  dependencies:
-    assert-plus "^0.2.0"
-    jsprim "^1.2.2"
-    sshpk "^1.7.0"
-
-ignore@^3.2.0:
-  version "3.2.7"
-  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.7.tgz#4810ca5f1d8eca5595213a34b94f2eb4ed926bbd"
-
-imurmurhash@^0.1.4:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
-
-indexes-of@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
-
-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.0, inherits@~2.0.1:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
-
-ini@~1.3.0:
-  version "1.3.4"
-  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
-
-invariant@^2.2.0:
-  version "2.2.2"
-  resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
-  dependencies:
-    loose-envify "^1.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-binary-path@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
-  dependencies:
-    binary-extensions "^1.0.0"
-
-is-buffer@^1.0.2:
-  version "1.1.5"
-  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc"
-
-is-dotfile@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d"
-
-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.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
-
-is-extglob@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
-
-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-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-npm@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
-
-is-number@^2.0.2, 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-obj@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
-
-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-redirect@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
-
-is-retry-allowed@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
-
-is-stream@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
-
-is-typedarray@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
-
-isarray@1.0.0, isarray@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
-
-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"
-
-isstream@~0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
-
-jodid25519@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967"
-  dependencies:
-    jsbn "~0.1.0"
-
-js-base64@^2.1.9:
-  version "2.1.9"
-  resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce"
-
-js-tokens@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7"
-
-jsbn@~0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
-
-jsesc@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
-
-jsesc@~0.5.0:
-  version "0.5.0"
-  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
-
-json-schema@0.2.3:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
-
-json-stable-stringify@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
-  dependencies:
-    jsonify "~0.0.0"
-
-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"
-
-json5@^0.5.0:
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
-
-jsonify@~0.0.0:
-  version "0.0.0"
-  resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
-
-jsprim@^1.2.2:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918"
-  dependencies:
-    assert-plus "1.0.0"
-    extsprintf "1.0.2"
-    json-schema "0.2.3"
-    verror "1.3.6"
-
-kind-of@^3.0.2:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47"
-  dependencies:
-    is-buffer "^1.0.2"
-
-latest-version@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-2.0.0.tgz#56f8d6139620847b8017f8f1f4d78e211324168b"
-  dependencies:
-    package-json "^2.0.0"
-
-lazy-req@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac"
-
-lodash@^4.2.0:
-  version "4.17.4"
-  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
-
-loose-envify@^1.0.0:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
-  dependencies:
-    js-tokens "^3.0.0"
-
-lowercase-keys@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
-
-micromatch@^2.1.5:
-  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"
-
-mime-db@~1.27.0:
-  version "1.27.0"
-  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1"
-
-mime-types@^2.1.12, mime-types@~2.1.7:
-  version "2.1.15"
-  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed"
-  dependencies:
-    mime-db "~1.27.0"
-
-minimatch@^3.0.0, minimatch@^3.0.2:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774"
-  dependencies:
-    brace-expansion "^1.0.0"
-
-minimist@0.0.8:
-  version "0.0.8"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
-
-minimist@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
-
-"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1:
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
-  dependencies:
-    minimist "0.0.8"
-
-ms@0.7.3:
-  version "0.7.3"
-  resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff"
-
-nan@^2.3.0:
-  version "2.6.2"
-  resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45"
-
-node-pre-gyp@^0.6.29:
-  version "0.6.34"
-  resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7"
-  dependencies:
-    mkdirp "^0.5.1"
-    nopt "^4.0.1"
-    npmlog "^4.0.2"
-    rc "^1.1.7"
-    request "^2.81.0"
-    rimraf "^2.6.1"
-    semver "^5.3.0"
-    tar "^2.2.1"
-    tar-pack "^3.4.0"
-
-node-status-codes@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f"
-
-nopt@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
-  dependencies:
-    abbrev "1"
-    osenv "^0.1.4"
-
-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"
-
-npmlog@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f"
-  dependencies:
-    are-we-there-yet "~1.1.2"
-    console-control-strings "~1.1.0"
-    gauge "~2.7.1"
-    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.8.1:
-  version "0.8.2"
-  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
-
-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.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"
-
-once@^1.3.0, once@^1.3.3:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
-  dependencies:
-    wrappy "1"
-
-os-homedir@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
-
-os-tmpdir@^1.0.0, os-tmpdir@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
-
-osenv@^0.1.0, osenv@^0.1.4:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
-  dependencies:
-    os-homedir "^1.0.0"
-    os-tmpdir "^1.0.0"
-
-output-file-sync@^1.1.0:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76"
-  dependencies:
-    graceful-fs "^4.1.4"
-    mkdirp "^0.5.1"
-    object-assign "^4.1.0"
-
-package-json@^2.0.0:
-  version "2.4.0"
-  resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb"
-  dependencies:
-    got "^5.0.0"
-    registry-auth-token "^3.0.1"
-    registry-url "^3.0.3"
-    semver "^5.1.0"
-
-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.1.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"
-
-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"
-
-performance-now@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
-
-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"
-
-postcss-selector-parser@^2.2.3:
-  version "2.2.3"
-  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90"
-  dependencies:
-    flatten "^1.0.2"
-    indexes-of "^1.0.1"
-    uniq "^1.0.1"
-
-postcss@^5.2.16:
-  version "5.2.17"
-  resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b"
-  dependencies:
-    chalk "^1.1.3"
-    js-base64 "^2.1.9"
-    source-map "^0.5.6"
-    supports-color "^3.2.3"
-
-prepend-http@^1.0.1:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
-
-preserve@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
-
-private@^0.1.6:
-  version "0.1.7"
-  resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1"
-
-process-nextick-args@~1.0.6:
-  version "1.0.7"
-  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
-
-punycode@^1.4.1:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
-
-qs@~6.4.0:
-  version "6.4.0"
-  resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
-
-randomatic@^1.1.3:
-  version "1.1.6"
-  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb"
-  dependencies:
-    is-number "^2.0.2"
-    kind-of "^3.0.2"
-
-rc@^1.0.1, rc@^1.1.6, rc@^1.1.7:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95"
-  dependencies:
-    deep-extend "~0.4.0"
-    ini "~1.3.0"
-    minimist "^1.2.0"
-    strip-json-comments "~2.0.1"
-
-read-all-stream@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa"
-  dependencies:
-    pinkie-promise "^2.0.0"
-    readable-stream "^2.0.0"
-
-readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4:
-  version "2.2.9"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8"
-  dependencies:
-    buffer-shims "~1.0.0"
-    core-util-is "~1.0.0"
-    inherits "~2.0.1"
-    isarray "~1.0.0"
-    process-nextick-args "~1.0.6"
-    string_decoder "~1.0.0"
-    util-deprecate "~1.0.1"
-
-readdirp@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
-  dependencies:
-    graceful-fs "^4.1.2"
-    minimatch "^3.0.2"
-    readable-stream "^2.0.2"
-    set-immediate-shim "^1.0.1"
-
-regenerate@^1.2.1:
-  version "1.3.2"
-  resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260"
-
-regenerator-runtime@^0.10.0:
-  version "0.10.3"
-  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e"
-
-regenerator-transform@0.9.11:
-  version "0.9.11"
-  resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283"
-  dependencies:
-    babel-runtime "^6.18.0"
-    babel-types "^6.19.0"
-    private "^0.1.6"
-
-regex-cache@^0.4.2:
-  version "0.4.3"
-  resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145"
-  dependencies:
-    is-equal-shallow "^0.1.3"
-    is-primitive "^2.0.0"
-
-regexpu-core@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
-  dependencies:
-    regenerate "^1.2.1"
-    regjsgen "^0.2.0"
-    regjsparser "^0.1.4"
-
-registry-auth-token@^3.0.1:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.2.0.tgz#5bf3bd4608a2dd9242542c44d66ad8a5f9cdd3b0"
-  dependencies:
-    rc "^1.1.6"
-
-registry-url@^3.0.3:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942"
-  dependencies:
-    rc "^1.0.1"
-
-regjsgen@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
-
-regjsparser@^0.1.4:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
-  dependencies:
-    jsesc "~0.5.0"
-
-remove-trailing-separator@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4"
-
-repeat-element@^1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
-
-repeat-string@^1.5.2:
-  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.81.0:
-  version "2.81.0"
-  resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
-  dependencies:
-    aws-sign2 "~0.6.0"
-    aws4 "^1.2.1"
-    caseless "~0.12.0"
-    combined-stream "~1.0.5"
-    extend "~3.0.0"
-    forever-agent "~0.6.1"
-    form-data "~2.1.1"
-    har-validator "~4.2.1"
-    hawk "~3.1.3"
-    http-signature "~1.1.0"
-    is-typedarray "~1.0.0"
-    isstream "~0.1.2"
-    json-stringify-safe "~5.0.1"
-    mime-types "~2.1.7"
-    oauth-sign "~0.8.1"
-    performance-now "^0.2.0"
-    qs "~6.4.0"
-    safe-buffer "^5.0.1"
-    stringstream "~0.0.4"
-    tough-cookie "~2.3.0"
-    tunnel-agent "^0.6.0"
-    uuid "^3.0.0"
-
-rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1:
-  version "2.6.1"
-  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d"
-  dependencies:
-    glob "^7.0.5"
-
-safe-buffer@^5.0.1:
-  version "5.0.1"
-  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7"
-
-semver-diff@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
-  dependencies:
-    semver "^5.0.3"
-
-semver@^5.0.3, semver@^5.1.0, 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:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
-
-set-immediate-shim@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
-
-signal-exit@^3.0.0:
-  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.5:
-  version "1.1.6"
-  resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
-
-sntp@1.x.x:
-  version "1.0.9"
-  resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
-  dependencies:
-    hoek "2.x.x"
-
-source-map-support@^0.4.2:
-  version "0.4.14"
-  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.14.tgz#9d4463772598b86271b4f523f6c1f4e02a7d6aef"
-  dependencies:
-    source-map "^0.5.6"
-
-source-map@^0.5.0, source-map@^0.5.6:
-  version "0.5.6"
-  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
-
-sshpk@^1.7.0:
-  version "1.13.0"
-  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c"
-  dependencies:
-    asn1 "~0.2.3"
-    assert-plus "^1.0.0"
-    dashdash "^1.12.0"
-    getpass "^0.1.1"
-  optionalDependencies:
-    bcrypt-pbkdf "^1.0.0"
-    ecc-jsbn "~0.1.1"
-    jodid25519 "^1.0.0"
-    jsbn "~0.1.0"
-    tweetnacl "~0.14.0"
-
-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_decoder@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667"
-  dependencies:
-    buffer-shims "~1.0.0"
-
-stringstream@~0.0.4:
-  version "0.0.5"
-  resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
-
-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-json-comments@~2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
-
-supports-color@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
-
-supports-color@^3.2.3:
-  version "3.2.3"
-  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
-  dependencies:
-    has-flag "^1.0.0"
-
-tar-pack@^3.4.0:
-  version "3.4.0"
-  resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984"
-  dependencies:
-    debug "^2.2.0"
-    fstream "^1.0.10"
-    fstream-ignore "^1.0.5"
-    once "^1.3.3"
-    readable-stream "^2.1.4"
-    rimraf "^2.5.1"
-    tar "^2.2.1"
-    uid-number "^0.0.6"
-
-tar@^2.2.1:
-  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"
-
-timed-out@^3.0.0:
-  version "3.1.3"
-  resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217"
-
-to-fast-properties@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320"
-
-tough-cookie@~2.3.0:
-  version "2.3.2"
-  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a"
-  dependencies:
-    punycode "^1.4.1"
-
-trim-right@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
-
-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"
-
-uid-number@^0.0.6:
-  version "0.0.6"
-  resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
-
-uniq@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
-
-unzip-response@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe"
-
-update-notifier@^1.0.2:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-1.0.3.tgz#8f92c515482bd6831b7c93013e70f87552c7cf5a"
-  dependencies:
-    boxen "^0.6.0"
-    chalk "^1.0.0"
-    configstore "^2.0.0"
-    is-npm "^1.0.0"
-    latest-version "^2.0.0"
-    lazy-req "^1.1.0"
-    semver-diff "^2.0.0"
-    xdg-basedir "^2.0.0"
-
-url-parse-lax@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
-  dependencies:
-    prepend-http "^1.0.1"
-
-user-home@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
-
-util-deprecate@~1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
-
-uuid@^2.0.1:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a"
-
-uuid@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
-
-v8flags@^2.0.10:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
-  dependencies:
-    user-home "^1.1.1"
-
-verror@1.3.6:
-  version "1.3.6"
-  resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c"
-  dependencies:
-    extsprintf "1.0.2"
-
-wide-align@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad"
-  dependencies:
-    string-width "^1.0.1"
-
-widest-line@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c"
-  dependencies:
-    string-width "^1.0.1"
-
-wrappy@1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
-
-write-file-atomic@^1.1.2:
-  version "1.3.3"
-  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.3.tgz#831dd22d491bdc135180bb996a0eb3f8bf587791"
-  dependencies:
-    graceful-fs "^4.1.11"
-    imurmurhash "^0.1.4"
-    slide "^1.1.5"
-
-xdg-basedir@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2"
-  dependencies:
-    os-homedir "^1.0.0"
-
-xmldom@^0.1.22:
-  version "0.1.27"
-  resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9"
diff --git a/packages/wepy-compiler-babel/package.json b/packages/wepy-compiler-babel/package.json
deleted file mode 100644
index 898991238..000000000
--- a/packages/wepy-compiler-babel/package.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "name": "wepy-compiler-babel",
-  "version": "1.5.1",
-  "description": "wepy compile babel",
-  "main": "lib/index.js",
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "keywords": [
-    "babel"
-  ],
-  "author": "Gcaufy",
-  "license": "MIT",
-  "dependencies": {
-    "babel-core": "^6.20.0"
-  }
-}
diff --git a/packages/wepy-compiler-babel/src/index.js b/packages/wepy-compiler-babel/src/index.js
deleted file mode 100644
index bedcb9efa..000000000
--- a/packages/wepy-compiler-babel/src/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import {transform} from 'babel-core';
-
-export default function (content, config) {
-    let p;
-    try {
-        let rst = transform(content, config);
-        p = Promise.resolve(rst);
-    } catch (e) {
-        p = Promise.reject(e);
-    }
-    return p;
-};
\ No newline at end of file
diff --git a/packages/wepy-compiler-less/package.json b/packages/wepy-compiler-less/package.json
deleted file mode 100644
index 3fe07637b..000000000
--- a/packages/wepy-compiler-less/package.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "name": "wepy-compiler-less",
-  "version": "1.3.10",
-  "description": "wepy compile less",
-  "main": "lib/index.js",
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "keywords": [
-    "less"
-  ],
-  "dependencies": {
-    "less": "^2.7.1"
-  },
-  "author": "Gcaufy",
-  "license": "MIT"
-}
diff --git a/packages/wepy-compiler-less/src/index.js b/packages/wepy-compiler-less/src/index.js
deleted file mode 100644
index 5e8729140..000000000
--- a/packages/wepy-compiler-less/src/index.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import less from 'less';
-import path from 'path';
-
-export default function (content, config, file) {
-    return new Promise ((resolve, reject) => {
-        let opath = path.parse(file);
-        config.paths = [opath.dir];
-
-        less.render(content, config).then(res => {
-            resolve(res.css);
-        }).catch(reject);
-    });
-};
\ No newline at end of file
diff --git a/packages/wepy-compiler-pug/README.md b/packages/wepy-compiler-pug/README.md
deleted file mode 100644
index a7be92fc7..000000000
--- a/packages/wepy-compiler-pug/README.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# wepy pug(jade) 编译器
-
-## 安装
-
-```
-npm install wepy-compiler-pug --save-dev
-```
-
-## 配置`wepy.config.js`
-
-```
-module.exports = {
-    "compilers": {
-        pug: {
-        }
-    }
-};
-```
-
-## 参数说明
-
-[pug](https://github.com/pugjs/pug)
\ No newline at end of file
diff --git a/packages/wepy-compiler-pug/package.json b/packages/wepy-compiler-pug/package.json
deleted file mode 100644
index b7a9bf4c8..000000000
--- a/packages/wepy-compiler-pug/package.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "name": "wepy-compiler-pug",
-  "version": "1.4.6",
-  "description": "wepy compile pug",
-  "main": "lib/index.js",
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "keywords": [
-    "pug"
-  ],
-  "author": "Gcaufy",
-  "license": "MIT",
-  "dependencies": {
-    "pug": "^2.0.0-beta6"
-  }
-}
diff --git a/packages/wepy-compiler-pug/src/index.js b/packages/wepy-compiler-pug/src/index.js
deleted file mode 100644
index 73f2645aa..000000000
--- a/packages/wepy-compiler-pug/src/index.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import pug from 'pug';
-
-let compiler = function (content, config) {
-    let data = config.data;
-    let p;
-    delete config.data;
-    try {
-        let fn = pug.compile(content, config);
-        let html = fn(data);
-        p = Promise.resolve(html);
-    } catch (e) {
-        p = Promise.reject(e);
-    }
-    return p;
-};
-
-compiler.sync = function (content, config) {
-    let data = config.data;
-    let p, html;
-    delete config.data;
-    let fn = pug.compile(content, config);
-    html = fn(data);
-    return html;
-};
-
-export default compiler;
\ No newline at end of file
diff --git a/packages/wepy-compiler-sass/.npmignore b/packages/wepy-compiler-sass/.npmignore
deleted file mode 100644
index 33d57473d..000000000
--- a/packages/wepy-compiler-sass/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-src
-test
-node_modules
\ No newline at end of file
diff --git a/packages/wepy-compiler-sass/package.json b/packages/wepy-compiler-sass/package.json
deleted file mode 100644
index 5f9cd1f64..000000000
--- a/packages/wepy-compiler-sass/package.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "name": "wepy-compiler-sass",
-  "version": "1.3.7",
-  "description": "wepy compile sass",
-  "main": "lib/index.js",
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "keywords": [
-    "sass"
-  ],
-  "author": "Gcaufy",
-  "license": "MIT",
-  "dependencies": {
-    "node-sass": "^4.0.0"
-  }
-}
diff --git a/packages/wepy-compiler-sass/src/index.js b/packages/wepy-compiler-sass/src/index.js
deleted file mode 100644
index 035822411..000000000
--- a/packages/wepy-compiler-sass/src/index.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import sass from 'node-sass';
-
-export default function (content, config, file) {
-    return new Promise ((resolve, reject) => {
-        config.data = content;
-        config.file = file;
-        sass.render(config, (err, res) => {
-            if (err) {
-                reject(err);
-            } else {
-                resolve(res.css);
-            }
-        });
-    });
-};
\ No newline at end of file
diff --git a/packages/wepy-compiler-stylus/.npmignore b/packages/wepy-compiler-stylus/.npmignore
deleted file mode 100644
index 33d57473d..000000000
--- a/packages/wepy-compiler-stylus/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-src
-test
-node_modules
\ No newline at end of file
diff --git a/packages/wepy-compiler-stylus/package.json b/packages/wepy-compiler-stylus/package.json
deleted file mode 100644
index 343e5066d..000000000
--- a/packages/wepy-compiler-stylus/package.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "name": "wepy-compiler-stylus",
-  "version": "1.3.10",
-  "description": "wepy compile stylus",
-  "main": "lib/index.js",
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "keywords": [
-    "stylus"
-  ],
-  "dependencies": {
-    "stylus": "^0.54.5"
-  },
-  "author": "Gcaufy",
-  "license": "MIT"
-}
diff --git a/packages/wepy-compiler-stylus/src/index.js b/packages/wepy-compiler-stylus/src/index.js
deleted file mode 100644
index 482fa1ec1..000000000
--- a/packages/wepy-compiler-stylus/src/index.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import stylus from 'stylus';
-import path from 'path';
-
-export default function (content, config, file) {
-    return new Promise ((resolve, reject) => {
-        let opath = path.parse(file);
-        config.paths = [opath.dir];
-        config.filename = opath.base;
-
-        stylus.render(content, config, function (err, css) {
-            if (err) reject(err);
-            else {
-                resolve(css);
-            }
-        });
-    });
-};
diff --git a/packages/wepy-compiler-typescript/.npmignore b/packages/wepy-compiler-typescript/.npmignore
deleted file mode 100644
index 33d57473d..000000000
--- a/packages/wepy-compiler-typescript/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-src
-test
-node_modules
\ No newline at end of file
diff --git a/packages/wepy-compiler-typescript/README.md b/packages/wepy-compiler-typescript/README.md
deleted file mode 100644
index 1532e248a..000000000
--- a/packages/wepy-compiler-typescript/README.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# wepy typescript 编译器
-
-## 安装
-
-```
-npm install wepy-compiler-typescript --save-dev
-```
-
-## 配置`wepy.config.js`
-
-```
-module.exports = {
-    "compilers": {
-        typescript: {
-            "compilerOptions": {
-                "module": "system"
-            }
-        }
-    }
-};
-```
-
-## 参数说明
-
-[TypeScript](https://www.tslang.cn/docs/home.html)
\ No newline at end of file
diff --git a/packages/wepy-compiler-typescript/package.json b/packages/wepy-compiler-typescript/package.json
deleted file mode 100644
index 9f12297b0..000000000
--- a/packages/wepy-compiler-typescript/package.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "name": "wepy-compiler-typescript",
-  "version": "1.5.8",
-  "description": "wepy compile typescript",
-  "main": "lib/index.js",
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "keywords": [
-    "typescript"
-  ],
-  "author": "Gcaufy",
-  "license": "MIT",
-  "dependencies": {
-    "typescript": "^2.1.4"
-  }
-}
diff --git a/packages/wepy-compiler-typescript/src/index.js b/packages/wepy-compiler-typescript/src/index.js
deleted file mode 100644
index bb06a32d7..000000000
--- a/packages/wepy-compiler-typescript/src/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import * as ts from 'typescript';
-
-export default function (content, config) {
-    let p;
-    try {
-        let code = ts.transpileModule(content, config);
-        p = Promise.resolve(code.outputText);
-    } catch (e) {
-        p = Promise.reject(e);
-    }
-    return p;
-};
\ No newline at end of file
diff --git a/packages/wepy-eslint/README.md b/packages/wepy-eslint/README.md
deleted file mode 100644
index 837bebf23..000000000
--- a/packages/wepy-eslint/README.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# wepy eslint 检查器
-
-## 安装
-
-```
-npm install wepy-eslint --save-dev
-```
-
-## 配置`wepy.config.js`
-
-```
-module.exports = {
-	eslint: true
-};
-```
diff --git a/packages/wepy-eslint/package.json b/packages/wepy-eslint/package.json
deleted file mode 100644
index 54574a172..000000000
--- a/packages/wepy-eslint/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name": "wepy-eslint",
-  "version": "1.5.3",
-  "description": "wepy eslint",
-  "main": "lib/index.js",
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "keywords": [
-    "wepy",
-    "eslint"
-  ],
-  "author": "dolymood",
-  "license": "MIT",
-  "peerDependencies": {
-    "eslint": ">=1.6.0 <4.0.0",
-    "eslint-friendly-formatter": ">=2.0.0 < 3.0.0"
-  }
-}
diff --git a/packages/wepy-eslint/src/index.js b/packages/wepy-eslint/src/index.js
deleted file mode 100644
index 177846362..000000000
--- a/packages/wepy-eslint/src/index.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import eslint from 'eslint';
-import formatter from 'eslint-friendly-formatter';
-
-export default function (esConfig, filepath) {
-    if (!esConfig.formatter) {
-        esConfig.formatter = formatter;
-    }
-    esConfig.output = esConfig.output === undefined ? true : esConfig.output;
-    const engine = new eslint.CLIEngine(esConfig);
-    const report = engine.executeOnFiles([filepath]);
-    const formatter = engine.getFormatter();
-    let rst = formatter(report.results);
-    if (rst && esConfig.output) {
-      console.log(rst);
-    }
-    return rst;
-};
diff --git a/packages/wepy-plugin-autoprefixer/.npmignore b/packages/wepy-plugin-autoprefixer/.npmignore
deleted file mode 100644
index 33d57473d..000000000
--- a/packages/wepy-plugin-autoprefixer/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-src
-test
-node_modules
\ No newline at end of file
diff --git a/packages/wepy-plugin-autoprefixer/README.md b/packages/wepy-plugin-autoprefixer/README.md
deleted file mode 100644
index 197272c39..000000000
--- a/packages/wepy-plugin-autoprefixer/README.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# wepy框架autoprefixer插件
-
-## 安装
-
-```
-npm install wepy-plugin-autoprefixer --save-dev
-```
-
-## 配置`wepy.config.js`
-
-```
-module.exports.plugins = {
-    'autoprefixer': {
-        filter: /\.wxss$/,
-        config: {
-          browsers: ['last 11 iOS versions']
-        }
-    },
-};
-```
-
-
-## 参数说明 
-
-[autoprefixer](https://github.com/postcss/autoprefixer#options)
\ No newline at end of file
diff --git a/packages/wepy-plugin-autoprefixer/package-lock.json b/packages/wepy-plugin-autoprefixer/package-lock.json
deleted file mode 100644
index a9d623bba..000000000
--- a/packages/wepy-plugin-autoprefixer/package-lock.json
+++ /dev/null
@@ -1,119 +0,0 @@
-{
-  "name": "wepy-plugin-autoprefixer",
-  "version": "0.0.1",
-  "lockfileVersion": 1,
-  "requires": true,
-  "dependencies": {
-    "ansi-styles": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
-      "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
-      "requires": {
-        "color-convert": "1.9.0"
-      }
-    },
-    "autoprefixer": {
-      "version": "7.1.5",
-      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.5.tgz",
-      "integrity": "sha512-sMN453qIm8Z+tunzYWW+Y490wWkICHhCYm/VohLjjl+N7ARSFuF5au7E6tr7oEbeeXj8mNjpSw2kxjJaO6YCOw==",
-      "requires": {
-        "browserslist": "2.5.1",
-        "caniuse-lite": "1.0.30000746",
-        "normalize-range": "0.1.2",
-        "num2fraction": "1.2.2",
-        "postcss": "6.0.13",
-        "postcss-value-parser": "3.3.0"
-      }
-    },
-    "browserslist": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.5.1.tgz",
-      "integrity": "sha512-jAvM2ku7YDJ+leAq3bFH1DE0Ylw+F+EQDq4GkqZfgPEqpWYw9ofQH85uKSB9r3Tv7XDbfqVtE+sdvKJW7IlPJA==",
-      "requires": {
-        "caniuse-lite": "1.0.30000746",
-        "electron-to-chromium": "1.3.26"
-      }
-    },
-    "caniuse-lite": {
-      "version": "1.0.30000746",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000746.tgz",
-      "integrity": "sha1-xk+Vo5Jc/TAgejCO12wa6W6gnqA="
-    },
-    "chalk": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz",
-      "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==",
-      "requires": {
-        "ansi-styles": "3.2.0",
-        "escape-string-regexp": "1.0.5",
-        "supports-color": "4.4.0"
-      }
-    },
-    "color-convert": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz",
-      "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=",
-      "requires": {
-        "color-name": "1.1.3"
-      }
-    },
-    "color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
-    },
-    "electron-to-chromium": {
-      "version": "1.3.26",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.26.tgz",
-      "integrity": "sha1-mWQnKUhhp02cfIK5Jg6jAejALWY="
-    },
-    "escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
-    },
-    "has-flag": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
-      "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE="
-    },
-    "normalize-range": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
-      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
-    },
-    "num2fraction": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
-      "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4="
-    },
-    "postcss": {
-      "version": "6.0.13",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.13.tgz",
-      "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==",
-      "requires": {
-        "chalk": "2.1.0",
-        "source-map": "0.6.1",
-        "supports-color": "4.4.0"
-      }
-    },
-    "postcss-value-parser": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz",
-      "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU="
-    },
-    "source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
-    },
-    "supports-color": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
-      "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
-      "requires": {
-        "has-flag": "2.0.0"
-      }
-    }
-  }
-}
diff --git a/packages/wepy-plugin-autoprefixer/package.json b/packages/wepy-plugin-autoprefixer/package.json
deleted file mode 100644
index 754dcdfe1..000000000
--- a/packages/wepy-plugin-autoprefixer/package.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "name": "wepy-plugin-autoprefixer",
-  "version": "1.5.9",
-  "description": "wepy autoprefixer plugin",
-  "main": "lib/index.js",
-  "keywords": [
-    "autoprefixer",
-    "postcss",
-    "wepy"
-  ],
-  "license": "MIT",
-  "dependencies": {
-    "autoprefixer": "^7.1.2",
-    "postcss": "^6.0.9"
-  }
-}
diff --git a/packages/wepy-plugin-autoprefixer/src/index.js b/packages/wepy-plugin-autoprefixer/src/index.js
deleted file mode 100644
index ba69b18e0..000000000
--- a/packages/wepy-plugin-autoprefixer/src/index.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import postcss from 'postcss';
-import autoprefixer from 'autoprefixer';
-
-export default class {
-
-    constructor(c = {}) {
-        const def = {
-            filter: new RegExp('\.(wxss)$'),
-            config: {
-                browsers: ['Android >= 2.3', 'Chrome > 20', 'iOS >= 6']
-            }
-        };
-
-        this.setting = Object.assign({}, def, c);
-    }
-    apply (op) {
-
-        let setting = this.setting;
-
-        if (!setting.filter.test(op.file)) {
-            op.next();
-        } else {
-            op.output && op.output({
-                action: '变更',
-                file: op.file
-            });
-
-            let prefixer = postcss([ autoprefixer(this.setting.config) ]);
-
-            prefixer.process(op.code).then((result) => {
-                op.code = result.css;
-                op.next();
-            }).catch(e => {
-                op.err = e;
-                op.catch();
-            });
-        }
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy-plugin-filemin/.npmignore b/packages/wepy-plugin-filemin/.npmignore
deleted file mode 100644
index 33d57473d..000000000
--- a/packages/wepy-plugin-filemin/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-src
-test
-node_modules
\ No newline at end of file
diff --git a/packages/wepy-plugin-filemin/README.md b/packages/wepy-plugin-filemin/README.md
deleted file mode 100644
index dd388cab9..000000000
--- a/packages/wepy-plugin-filemin/README.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# wepy 文件压缩插件
-
-支持css，xml，json的压缩
-
-## 安装
-
-```
-npm install wepy-plugin-filemin --save-dev
-```
-
-## 配置`wepy.config.js`
-
-```
-module.exports.plugins = {
-    'filemin': {
-        filter: /\.(json|wxml|xml)$/
-    }
-};
-```
\ No newline at end of file
diff --git a/packages/wepy-plugin-filemin/package.json b/packages/wepy-plugin-filemin/package.json
deleted file mode 100644
index c3f9fc5d2..000000000
--- a/packages/wepy-plugin-filemin/package.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "name": "wepy-plugin-filemin",
-  "version": "1.3.11",
-  "description": "wepy filemin plugin",
-  "main": "lib/index.js",
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "keywords": [
-    "filemin"
-  ],
-  "author": "Gcaufy",
-  "license": "MIT",
-  "dependencies": {
-    "pretty-data": "^0.40.0"
-  }
-}
diff --git a/packages/wepy-plugin-filemin/src/index.js b/packages/wepy-plugin-filemin/src/index.js
deleted file mode 100644
index 012e0ddb8..000000000
--- a/packages/wepy-plugin-filemin/src/index.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import path from 'path';
-import {pd} from 'pretty-data';
-
-
-export default class {
-
-    constructor(c = {}) {
-        const def = {
-            filter: new RegExp('\.(wxml|xml|json)$'),
-            config: {
-            }
-        };
-
-        this.setting = Object.assign({}, def, c);
-    }
-    apply (op) {
-
-        let setting = this.setting;
-
-        if (!setting.filter.test(op.file)) {
-            op.next();
-        } else {
-            op.output && op.output({
-                action: '压缩',
-                file: op.file
-            });
-
-            if (/\.(wxml|xml)$/.test(op.file)) {
-                op.code = pd.xmlmin(op.code);
-            } else if (/\.json$/.test(op.file)) {
-                op.code = pd.jsonmin(op.code);
-            }
-            op.next();
-        }
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy-plugin-imagemin/.npmignore b/packages/wepy-plugin-imagemin/.npmignore
deleted file mode 100644
index 33d57473d..000000000
--- a/packages/wepy-plugin-imagemin/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-src
-test
-node_modules
\ No newline at end of file
diff --git a/packages/wepy-plugin-imagemin/README.md b/packages/wepy-plugin-imagemin/README.md
deleted file mode 100644
index 58c908d8f..000000000
--- a/packages/wepy-plugin-imagemin/README.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# wepy 图片压缩插件
-
-
-## 安装
-
-```
-npm install wepy-plugin-imagemin --save-dev
-```
-
-## 配置`wepy.config.js`
-
-```
-module.exports.plugins = {
-    'imagemin': {
-        filter: /\.(jpg|png|jpeg)$/,
-        config: {
-            'jpg': {
-                quality: 80
-            },
-            'png': {
-                quality: 80
-            }
-        }
-    }
-};
-```
-
-
-## 参数说明
-
-[imagemin](https://github.com/imagemin/imagemin)
\ No newline at end of file
diff --git a/packages/wepy-plugin-imagemin/package.json b/packages/wepy-plugin-imagemin/package.json
deleted file mode 100644
index efcb2620d..000000000
--- a/packages/wepy-plugin-imagemin/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name": "wepy-plugin-imagemin",
-  "version": "1.5.2",
-  "description": "wepy imagemin plugin",
-  "main": "lib/index.js",
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "keywords": [
-    "imagemin"
-  ],
-  "author": "Gcaufy",
-  "license": "MIT",
-  "dependencies": {
-    "imagemin": "^5.2.2",
-    "imagemin-mozjpeg": "^6.0.0",
-    "imagemin-pngquant": "^5.0.0"
-  }
-}
diff --git a/packages/wepy-plugin-imagemin/src/index.js b/packages/wepy-plugin-imagemin/src/index.js
deleted file mode 100644
index 87af03a04..000000000
--- a/packages/wepy-plugin-imagemin/src/index.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import path from 'path';
-import imagemin from 'imagemin';
-import imageminMozjpeg from 'imagemin-mozjpeg';
-import imageminPngquant from 'imagemin-pngquant';
-import fs from 'fs';
-
-
-export default class {
-
-    constructor(c = {}) {
-        const def = {
-            filter: new RegExp('\.(jpg|png|jpeg)$'),
-            config: {
-                jpg: {},
-                png: {quality: '65-80'}
-            }
-        };
-
-        this.setting = Object.assign({}, def, c);
-    }
-    apply (op) {
-
-        let setting = this.setting;
-
-        if (!setting.filter.test(op.file)) {
-            op.next();
-        } else {
-            op.output && op.output({
-                action: '压缩',
-                file: op.file
-            });
-            imagemin([op.file], '', {
-                plugins: [
-                    imageminMozjpeg(this.setting.config.jpg),
-                    imageminPngquant(this.setting.config.png)
-                ]
-            }).then((files) => {
-                op.code = files[0].data;
-                op.next();
-            }).catch((e) => {
-                op.err = e;
-                op.catch();
-            });
-        }
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy-plugin-replace/.npmignore b/packages/wepy-plugin-replace/.npmignore
deleted file mode 100644
index 33d57473d..000000000
--- a/packages/wepy-plugin-replace/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-src
-test
-node_modules
\ No newline at end of file
diff --git a/packages/wepy-plugin-replace/README.md b/packages/wepy-plugin-replace/README.md
deleted file mode 100644
index 015187d5e..000000000
--- a/packages/wepy-plugin-replace/README.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# wepy 文件压缩插件
-
-支持文本替换
-
-## 安装
-
-```
-npm install wepy-plugin-replace --save-dev
-```
-
-## 配置`wepy.config.js`
-
-为 plugins 添加 replace 对象，支持单个或者多个规则，多个规则可以以 Array 或者 Object 实现，filter 的对象为生成后文件的路径， 例如'dist/app.js'，每个规则也同时支持多个替换条目，同样是以 Array 或者 Object 实现。
-
-```
-module.exports.plugins = {
-    'replace': {
-        filter: /moment\.js$/,
-        config: {
-            find: /([\w\[\]a-d\.]+)\s*instanceof Function/g,
-            replace: function (matchs, word) {
-                return ' typeof ' + word + " ==='function' ";
-            }
-        }
-    }
-};
-
-
-module.exports.plugins = {
-    'replace': [{
-        filter: /moment\.js$/,
-        config: {
-            find: /([\w\[\]a-d\.]+)\s*instanceof Function/g,
-            replace: function (matchs, word) {
-                return ' typeof ' + word + " ==='function' ";
-            }
-        }
-    }, {
-        filter: /anotherfile\.js$/,
-        config: [{
-            find: 'hello world',
-            replace: 'hello wepy'
-        },{
-            find: 'hello world2',
-            replace: 'hello wepy2'
-        }]
-    }]
-};
-
-module.exports.plugins = {
-    'replace': {
-        'fix-moment': {
-            filter: /moment\.js$/,
-            config: {
-                find: /([\w\[\]a-d\.]+)\s*instanceof Function/g,
-                replace: function (matchs, word) {
-                    return ' typeof ' + word + " ==='function' ";
-                }
-            }
-        }, 
-        'fix-other': {
-            filter: /anotherfile\.js$/,
-            config: {
-                rule1: {
-                    find: 'hello world',
-                    replace: 'hello wepy'
-                },
-                rule2: {
-                    find: 'hello world',
-                    replace: 'hello wepy'
-                }
-            }
-        }
-    }
-};
-```
diff --git a/packages/wepy-plugin-replace/package.json b/packages/wepy-plugin-replace/package.json
deleted file mode 100644
index 79418aaa2..000000000
--- a/packages/wepy-plugin-replace/package.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "name": "wepy-plugin-replace",
-  "version": "1.5.9",
-  "description": "wepy replace plugin",
-  "main": "lib/index.js",
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "keywords": [
-    "replace"
-  ],
-  "author": "Gcaufy",
-  "license": "MIT",
-  "dependencies": {}
-}
diff --git a/packages/wepy-plugin-replace/src/index.js b/packages/wepy-plugin-replace/src/index.js
deleted file mode 100644
index 5086a497c..000000000
--- a/packages/wepy-plugin-replace/src/index.js
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import path from 'path';
-
-export default class {
-
-    constructor(c = {}) {
-        const def = {
-            filter: /\w$/,
-            config: {
-            }
-        };
-
-        if (Array.isArray(c)) {
-            this.setting = c.map(s => Object.assign({}, def, s));
-            return;
-        }
-
-        this.setting = Object.assign({}, def, c);
-    }
-    apply (op) {
-
-        let setting = this.setting;
-
-        let settings = [];
-
-        if (setting instanceof Array) {
-            settings = settings.concat(setting);
-        } else if (setting instanceof Object && !setting.filter) {
-            for (let key in setting) {
-                let value = setting[key];
-                if (value.filter) {
-                    settings.push(value);
-                }
-            }
-        } else if (setting instanceof Object && setting.filter) {
-            settings.push(setting);
-        }
-
-        settings.forEach((setting) => {
-            if (op.code !== null && setting.filter.test(op.file)) {
-                op.output && op.output({
-                    action: '变更',
-                    file: op.file
-                });
-
-                let config = setting.config;
-                let configs = [];
-
-                if (config instanceof Array) {
-                    configs = configs.concat(config);
-                } else if (config instanceof Object && !config.find) {
-                    for (let key in config) {
-                        let value = config[key];
-                        if (value.find) {
-                            configs.push(value);
-                        }
-                    }
-                } else if (config instanceof Object && config.find) {
-                    configs.push(config);
-                }
-
-                configs.forEach((config) => {
-                    op.code = op.code.replace(config.find, config.replace);
-                })
-            }
-        })
-
-        op.next();
-    }
-}
diff --git a/packages/wepy-plugin-uglifyjs/.npmignore b/packages/wepy-plugin-uglifyjs/.npmignore
deleted file mode 100644
index 33d57473d..000000000
--- a/packages/wepy-plugin-uglifyjs/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-src
-test
-node_modules
\ No newline at end of file
diff --git a/packages/wepy-plugin-uglifyjs/README.md b/packages/wepy-plugin-uglifyjs/README.md
deleted file mode 100644
index 9e1c11631..000000000
--- a/packages/wepy-plugin-uglifyjs/README.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# wepy JS压缩插件
-
-## 安装
-
-```
-npm install wepy-plugin-uglifyjs --save-dev
-```
-
-## 配置`wepy.config.js`
-
-```
-module.exports.plugins = {
-    'uglifyjs': {
-        filter: /\.js$/,
-        config: {
-        }
-    },
-};
-```
-
-
-## 参数说明
-
-[UglifyJS](https://github.com/mishoo/UglifyJS2)
\ No newline at end of file
diff --git a/packages/wepy-plugin-uglifyjs/package.json b/packages/wepy-plugin-uglifyjs/package.json
deleted file mode 100644
index ed438f0eb..000000000
--- a/packages/wepy-plugin-uglifyjs/package.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "name": "wepy-plugin-uglifyjs",
-  "version": "1.3.6",
-  "description": "wepy uglifyjs plugin",
-  "main": "lib/index.js",
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "keywords": [
-    "uglifyjs"
-  ],
-  "author": "Gcaufy",
-  "license": "MIT",
-  "dependencies": {
-    "uglify-js": "^2.7.5"
-  }
-}
diff --git a/packages/wepy-plugin-uglifyjs/src/index.js b/packages/wepy-plugin-uglifyjs/src/index.js
deleted file mode 100644
index 6b77731f7..000000000
--- a/packages/wepy-plugin-uglifyjs/src/index.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import path from 'path';
-import uglify from 'uglify-js';
-
-export default class {
-
-    constructor(c = {}) {
-        const def = {
-            filter: new RegExp('\.(js)$'),
-            config: {
-                compress: {warnings: false}
-            }
-        };
-
-        this.setting = Object.assign({}, def, c);
-    }
-    apply (op) {
-
-        let setting = this.setting;
-
-        if (!setting.filter.test(op.file)) {
-            op.next();
-        } else {
-            //util.output('压缩', op.file);
-            op.output && op.output({
-                action: '压缩',
-                file: op.file
-            });
-            this.setting.config.fromString = true;
-            let rst = uglify.minify(op.code, this.setting.config);
-            let k;
-            for (k in rst)
-                op[k] = rst[k];
-            op.next();
-        }
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy-redux/README.md b/packages/wepy-redux/README.md
deleted file mode 100644
index 9ee0f8a04..000000000
--- a/packages/wepy-redux/README.md
+++ /dev/null
@@ -1,124 +0,0 @@
-# wepy 和 redux 结合的连接器
-
-## 安装
-
-```
-npm install wepy-redux --save
-```
-
-## 示例
-
-```vue
-<template>
-  <view class="container">
-    <text class="info">{{num}}</text>
-    <text class="info">{{inc}}</text>
-    <button @tap="addNum" size="mini">  + num  </button>
-    <button @tap="asyncInc" size="mini">  async inc </button>
-  </view>
-</template>
-
-<script>
-  import wepy from 'wepy'
-  import { connect } from 'wepy-redux'
-  import List from '../components/list'
-  import Panel from '../components/panel'
-  import Counter from '../components/counter'
-  import Group from '../components/group'
-  import Toast from 'wepy-com-toast'
-  import { INCREMENT } from '../store/types/counter'
-  import { asyncInc } from '../store/actions'
-  import testMixin from '../mixins/test'
-
-  @connect({
-    num(state) {
-      return state.counter.num
-    },
-    inc: 'inc'
-  }, {
-    addNum: INCREMENT,
-    asyncInc
-  })
-  export default class Index extends wepy.page {
-  	// ...
-    methods = {
-      // ...
-    }
-    // ...
-    onLoad() {
-    }
-  }
-</script>
-```
-
-## 使用
-
-1. 初始化 store
-
-```js
-// app.wpy
-import { createStore } from 'redux'
-import { setStore } from 'wepy-redux'
-import rootReducer from './reducers'
-
-const store = createStore(rootReducer)
-// set!!
-setStore(store)
-```
-
-2. 得到 store
-
-```js
-import { getStore } from 'wepy-redux'
-
-const store = getStore()
-// 可以直接使用 store 实例了
-// dispatch
-store.dispatch({type: 'xx'})
-// state
-const state = store.getState()
-```
-
-3. 连接组件，就以上边的示例来说明
-
-```js
-// ...
-  import { connect } from 'wepy-redux'
-  @connect({
-    num(state) {
-      return state.counter.num
-    },
-    inc: 'inc'
-  }, {
-    addNum: INCREMENT,
-    asyncInc
-  })
-  export default class Index extends wepy.page {
-  	// ...
-    methods = {
-      // ...
-    }
-    // ...
-    onLoad() {
-    }
-  }
-```
-
-这里主要涉及到 `connect` 的用法： `connect(states, actions)`，这里解释下：
-
-* `states`: 访问 state 上的值，可以是数组或者对象，如果是对象的话，则包含的是 `K-V` 对，`V` 可以是函数还可以是字符串，如果是字符串的话则默认获取 `state[V]`， 否则的话则是使用返回值；而对于如果是数组的话（数组中的项只能为字符串），则认为是相同的 `K-V` 对象结构。`states` 最终会附加到组件的 `computed` 属性值上。
-
-* `actions`: 只能传入对象，对象的 `K-V` 结构，如果 `V` 是字符串的话，则直接会 `distatch` 如下的结构：
-
-	```js
-	// args 就是调用传入参数
-	{
-		type: val,
-		// 修正一般情况下的参数 一般支持只传一个参数
-		// 如果真的是多个参数的话 那么 payload 就是参数组成的数组
-		payload: args.length > 1 ? args : args[0]
-	}
-	```
-	如果是一个函数 fn，则会 `dispatch(val.apply(store, args))`，否则的话则直接 `dispatch(V)`
-
-
diff --git a/packages/wepy-redux/package.json b/packages/wepy-redux/package.json
deleted file mode 100644
index 80878dd52..000000000
--- a/packages/wepy-redux/package.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-  "name": "wepy-redux",
-  "version": "1.5.3",
-  "description": "WePY bindings for Redux",
-  "main": "lib/index.js",
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "keywords": [
-    "wepy-redux",
-    "wepy",
-    "redux",
-    "connect"
-  ],
-  "author": "dolymood",
-  "license": "MIT",
-  "peerDependencies": {
-    "redux": "^2.0.0 || ^3.0.0"
-  }
-}
diff --git a/packages/wepy-redux/src/connect/index.js b/packages/wepy-redux/src/connect/index.js
deleted file mode 100644
index 6dac3253d..000000000
--- a/packages/wepy-redux/src/connect/index.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import { getStore } from '../store';
-import { mapState, mapActions } from '../helpers';
-
-export default function connect (states, actions) {
-    states = mapState(states || {});
-    actions = mapActions(actions || {});
-    return function connectComponent(Component) {
-        let unSubscribe = null;
-        // 绑定
-        const onLoad = Component.prototype.onLoad;
-        const onUnload = Component.prototype.onUnload;
-
-        const onStateChange = function () {
-            const store = getStore();
-            let hasChanged = false;
-            Object.keys(states).forEach((k) => {
-                const newV = states[k]();
-                if (this[k] !== newV) {
-                    // 不相等
-                    this[k] = newV;
-                    hasChanged = true;
-                }
-            });
-            hasChanged && this.$apply();
-        };
-        return class extends Component {
-            constructor () {
-                super();
-                this.computed = Object.assign(this.computed || {}, states, mapState({
-                    $state(state) {
-                        return state;
-                    }
-                }));
-                this.methods = Object.assign(this.methods || {}, actions);
-            }
-            onLoad() {
-                const store = getStore();
-                unSubscribe = store.subscribe(onStateChange.bind(this));
-                onStateChange.call(this);
-                onLoad && onLoad.apply(this, arguments);
-            }
-            onUnload () {
-                unSubscribe && unSubscribe();
-                unSubscribe = null;
-                onUnload && onUnload.apply(this, arguments);
-            }
-        };
-    };
-};
\ No newline at end of file
diff --git a/packages/wepy-redux/src/helpers/index.js b/packages/wepy-redux/src/helpers/index.js
deleted file mode 100644
index 17ca3b148..000000000
--- a/packages/wepy-redux/src/helpers/index.js
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-// clone from https://github.com/vuejs/vuex/blob/dev/src/helpers.js
-// modified by wepy
-import { getStore } from '../store';
-
-export const mapState = function (states) {
-    const res = {};
-    normalizeMap(states).forEach(({ key, val }) => {
-        res[key] = function mappedState () {
-            const store = getStore();
-            const state = store.getState();
-            return typeof val === 'function'
-                ? val.call(this, state)
-                : state[val];
-        };
-    });
-    return res;
-}
-
-export const mapActions = function (actions) {
-    const res = {};
-    normalizeMap(actions).forEach(({ key, val }) => {
-        res[key] = function mappedAction (...args) {
-            const store = getStore();
-            let dispatchParam;
-            if (typeof val === 'string') {
-                // 如果是字符串代表是直接同步模式 一个 action 的名字而已
-                dispatchParam = {
-                    type: val,
-                    // 修正一般情况下的参数 一般支持只传一个参数
-                    // 如果真的是多个参数的话 那么 payload 就是参数组成的数组
-                    payload: args.length > 1 ? args : args[0]
-                };
-            } else {
-                // 如果说是函数 则先调用执行
-                // 否则直接 dispatch 该值 例如说是个 promise
-                dispatchParam = typeof val === 'function' ? val.apply(store, args) : val;
-            }
-            return store.dispatch.call(store, dispatchParam);
-        }
-    });
-    return res;
-}
-
-function normalizeMap (map) {
-    return Array.isArray(map)
-        ? map.map(key => ({ key, val: key }))
-        : Object.keys(map).map(key => ({ key, val: map[key] }));
-}
diff --git a/packages/wepy-redux/src/index.js b/packages/wepy-redux/src/index.js
deleted file mode 100644
index 9840d5b05..000000000
--- a/packages/wepy-redux/src/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import connect from './connect';
-import { setStore, getStore } from './store';
-import { mapState, mapActions } from './helpers';
-
-export {
-    connect,
-    setStore,
-    getStore,
-    mapState,
-    mapActions
-}
\ No newline at end of file
diff --git a/packages/wepy-web/.npmignore b/packages/wepy-web/.npmignore
deleted file mode 100644
index a25615e13..000000000
--- a/packages/wepy-web/.npmignore
+++ /dev/null
@@ -1,10 +0,0 @@
-node_modules/
-coverage/
-demo/
-test/
-ISSUE_TEMPLATE.md
-appveyor.yml
-README_zh-CN.md
-*.map
-src/
-coverage
\ No newline at end of file
diff --git a/packages/wepy-web/README.md b/packages/wepy-web/README.md
deleted file mode 100644
index e12de510b..000000000
--- a/packages/wepy-web/README.md
+++ /dev/null
@@ -1,85 +0,0 @@
-## Todo list for wepy-web
-
-### 使用
-
-```
-# 生成web版本
-$ wepy build --output web
-
-# 生成微信浏览器版本
-$ wepy build --output web --platform wechat
-
-# 生成QQ浏览器版本
-$ wepy build --output web --platform qq
-```
-
-
-### 优先需求
-
-- [ ] API 实现
-- [ ] 组件实现
-- [ ] 更多实例 DEMO
-
-### 选择性需求
-
-- [ 65% ] wepy-web-wechat 基于 wx jsapi 实现的小程序的API。
-- [ 70% ] wepy-web-qq 基于 qq jsapi 实现的小程序的API。
-- [ -- ] more...。
-
-### 已可以在WEB上运行的实例DEMO
-
-- [x] [默认生成模板](https://github.com/wepyjs/wepy/tree/master/packages/wepy-cli/templates/template)
-- [x] [wepy-wechat-demo](https://github.com/wepyjs/wepy-wechat-demo)
-- [x] [wepy-weui-demo](https://github.com/wepyjs/wepy-weui-demo)
-- [x] 手机充值+ *未开源项目*
-
-### API 实现进度
-
-| API | WEB中可实现 | 已实现 |
-| --- | --- | --- |
-| wx.request | √ | √ |
-| wx.setStorage | √ | √ |
-| wx.setStorageSync | √ | √ |
-| wx.getStorage | √ | √ |
-| wx.getStorageSync | √ | √ |
-| wx.getStorageInfo | √ | × |
-| wx.getStorageInfoSync | √ | × |
-| wx.removeStorage | √ | × |
-| wx.removeStorageSync | √ | × |
-| wx.removeStorage | √ | × |
-| wx.clearStorage | √ | × |
-| wx.clearStorageSync | √ | √ |
-| wx.getLocation | jsapi | × |
-| wx.navigateTo | √ | √ |
-| wx.redirectTo | √ | √ |
-| wx.switchTab | √ | √ |
-| wx.navigateBack | √ | √ |
-| wx.reLaunch | √ | × |
-| wx.login | jsapi | wx/qq |
-| wx.showLoading | √ | √ |
-| wx.hideLoading | √ | √ |
-| wx.showToast | √ | √ |
-| wx.hideToast | √ | √ |
-| wx.showModal | √ | √ |
-| wx.showActionSheet | √ | √ |
-
-
-### 组件实现进度
-
-| 组件 | WEB中需要重新实现 | 已实现 |
-| --- | --- | --- |
-| view | × | div |
-| text | × | span |
-| button | × | button |
-| input | × | input |
-| scroll-view | √ | √ |
-| icon | √ | √ |
-| navigator | √ | √ |
-| progress | √ | √ |
-| slider | √ | √ |
-
-
-
-
-
-
diff --git a/packages/wepy-web/package.json b/packages/wepy-web/package.json
deleted file mode 100644
index 3f9d1dd48..000000000
--- a/packages/wepy-web/package.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "name": "wepy-web",
-  "version": "1.5.9",
-  "description": "",
-  "main": "lib/wepy.js",
-  "scripts": {},
-  "repository": {
-    "type": "git",
-    "url": "git@github.com:wepyjs/wepy.git"
-  },
-  "author": "Gcaufy",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/wepyjs/wepy/issues"
-  },
-  "homepage": "https://github.com/wepyjs/wepy#readme",
-  "dependencies": {
-    "axios": "^0.16.1",
-    "vue": "^1.0.28",
-    "vue-router": "^0.7.13"
-  }
-}
diff --git a/packages/wepy-web/src/apis/hideLoading.js b/packages/wepy-web/src/apis/hideLoading.js
deleted file mode 100644
index e4a5c50d9..000000000
--- a/packages/wepy-web/src/apis/hideLoading.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * @author: dlhandsome
- * @description: wx.hideLoading()
- * @link: https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-react.html#wxhidetoast
- */
-
-export function getter () {
-	return () => {
-		wx.$loading.show = false;
-	};
-};
\ No newline at end of file
diff --git a/packages/wepy-web/src/apis/hideToast.js b/packages/wepy-web/src/apis/hideToast.js
deleted file mode 100644
index 75909a143..000000000
--- a/packages/wepy-web/src/apis/hideToast.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * @author: Gcaufy
- * @description: wx.hideToast()
- * @link: https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-react.html#wxhidetoast
- */
-
-export function getter (constructor) {
-    return () => {
-        wx.$toast.show = false;
-    };
-};
\ No newline at end of file
diff --git a/packages/wepy-web/src/apis/showActionSheet.vue b/packages/wepy-web/src/apis/showActionSheet.vue
deleted file mode 100644
index dea44699f..000000000
--- a/packages/wepy-web/src/apis/showActionSheet.vue
+++ /dev/null
@@ -1,150 +0,0 @@
-/**
-* @author: Gcaufy
-* @description: wx.showActionSheet(OBJECT)
-* @link: https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-react.html#wxshowactionsheetobject
-
-* @properties:
-* 参数  类型  必填  说明
-* itemList    String Array    是   按钮的文字数组，数组长度最大为6个
-* itemColor   HexColor    否   按钮的文字颜色，默认为"#000000"
-* success Function    否   接口调用成功的回调函数，详见返回参数说明
-* fail    Function    否   接口调用失败的回调函数
-* complete    Function    否   接口调用结束的回调函数（调用成功、失败都会执行）
-*
-* wx.showActionSheet({
-*   itemList: ['A', 'B', 'C'],
-*   success: function(res) {
-*     console.log(res.tapIndex)
-*   },
-*   fail: function(res) {
-*     console.log(res.errMsg)
-*   }
-* })
-*/
-
-<template>
-    <div class="wepy-api-actionsheet" v-show="show">
-        <div class="wepy-api-actionsheet__mask" @click="cancel"></div>
-        <div class="wepy-api-actionsheet__main wepy-api-actionsheet__toggle" id="iosActionsheet">
-            <div class="wepy-api-actionsheet__menu">
-                <div class="wepy-api-actionsheet__cell" v-for="(index, item) in itemList" @click="select(index)">{{item}}</div>
-            </div>
-            <div class="wepy-api-actionsheet__action">
-                <div class="wepy-api-actionsheet__cell" @click="cancel">取消</div>
-            </div>
-        </div>
-    </div>
-</template>
-<script>
-
-const DEFAULT_PROPERTIES = {
-    itemList: []
-};
-
-export default {
-    name: 'ActionSheet',
-
-    data () {
-        return Object.assign({show: false}, DEFAULT_PROPERTIES);
-    },
-
-    methods: {
-        cancel () {
-            this.show = false;
-            let rst = {
-                errMsg: "showActionSheet:fail cancel"
-            };
-            typeof(this.fail) === 'function' && this.fail(rst);
-            typeof(this.complete) === 'function' && this.complete(rst);
-        },
-        select (index) {
-            this.show = false;
-            let rst = {
-                errMsg: "showActionSheet:ok",
-                tapIndex: index
-            };
-            typeof(this.success) === 'function' && this.success(rst);
-            typeof(this.complete) === 'function' && this.complete(rst);
-        }
-    }
-}
-
-export function getter (constructor) {
-    return (config) => {
-        if (!config.itemList) {
-            throw 'itemList is required in wx.showActionSheet';
-        }
-        if (!this.instance) {
-            this.instance = new constructor({
-                el: document.createElement('div')
-            });
-            this.instance.$appendTo(document.body);
-        }
-        wx.$actionsheet = this.instance;
-        Object.assign(this.instance, DEFAULT_PROPERTIES, {fail: void 0, success: void 0, complete: void 0}, config);
-        this.instance.show = true;
-    };
-}
-</script>
-
-<style lang="less">
-.wepy-api-actionsheet__mask {
-    position: fixed;
-    z-index: 1000;
-    top: 0;
-    right: 0;
-    left: 0;
-    bottom: 0;
-    background: rgba(0, 0, 0, 0.6);
-}
-.wepy-api-actionsheet__main {
-    position: fixed;
-    left: 0;
-    bottom: 0;
-    -webkit-transform: translate(0, 100%);
-    transform: translate(0, 100%);
-    -webkit-backface-visibility: hidden;
-    backface-visibility: hidden;
-    z-index: 5000;
-    width: 100%;
-    background-color: #EFEFF4;
-    -webkit-transition: -webkit-transform .3s;
-    transition: -webkit-transform .3s;
-    transition: transform .3s;
-    transition: transform .3s, -webkit-transform .3s;
-}
-.wepy-api-actionsheet__toggle {
-    -webkit-transform: translate(0, 0);
-    transform: translate(0, 0);
-}
-.wepy-api-actionsheet__menu {
-    background-color: #FCFCFD;
-}
-.wepy-api-actionsheet__cell {
-    position: relative;
-    padding: 10px 0;
-    text-align: center;
-    font-size: 18px;
-}
-.wepy-api-actionsheet__cell:first-child:before {
-    display: none;
-}
-.wepy-api-actionsheet__cell:before {
-    content: " ";
-    position: absolute;
-    left: 0;
-    top: 0;
-    right: 0;
-    height: 1px;
-    border-top: 1px solid #e5e5e5;
-    color: #e5e5e5;
-    -webkit-transform-origin: 0 0;
-    transform-origin: 0 0;
-    -webkit-transform: scaleY(0.5);
-    transform: scaleY(0.5);
-}
-.wepy-api-actionsheet__action {
-    margin-top: 6px;
-    background-color: #FCFCFD;
-}
-</style>
diff --git a/packages/wepy-web/src/apis/showLoading.vue b/packages/wepy-web/src/apis/showLoading.vue
deleted file mode 100644
index 9b79c08dc..000000000
--- a/packages/wepy-web/src/apis/showLoading.vue
+++ /dev/null
@@ -1,111 +0,0 @@
-/**
-* @author: dlhandsome
-* @description: wx.showLoading(OBJECT)
-* @link: https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-react.html#wxshowloadingobject
-
-* @properties:
-* 参数	类型	必填	说明
-* title	String	是	提示的内容
-* mask	Boolean	否	是否显示透明蒙层，防止触摸穿透，默认：false
-* success	Function	否	接口调用成功的回调函数
-* fail	Function	否	接口调用失败的回调函数
-* complete	Function	否	接口调用结束的回调函数（调用成功、失败都会执行）
-*
-* wx.showLoading({
-* title: '加载中'
-* })
-*/
-
-<template>
-    <div class="wepy-api-loading" v-show="show">
-        <div class="wepy-api-loading__mask" v-show="mask"></div>
-        <div class="wepy-api-loading__bd">
-            <div class="wepy-api-loading__bd__img wepy-api-loading__bd__img__loading"></div>
-            <div class="wepy-api-loading__bd__title">{{title}}</div>
-        </div>
-    </div>
-</template>
-<script>
-
-const DEFAULT_PROPERTIES = {
-    mask: false,
-    title: '',
-};
-
-export default {
-    name: 'Loading',
-
-    data () {
-        return Object.assign({show: false}, DEFAULT_PROPERTIES);
-    }
-}
-
-export function getter (constructor) {
-    return (config) => {
-        if (!config.title) {
-            throw 'title is required in wx.showLoading';
-        }
-        if (!this.instance) {
-            this.instance = new constructor({
-                el: document.createElement('div')
-            });
-            this.instance.$appendTo(document.body);
-        }
-        wx.$loading = this.instance;
-        Object.assign(this.instance, DEFAULT_PROPERTIES, {fail: void 0, success: void 0, complete: void 0}, config);
-        this.instance.show = true;
-
-        typeof(config.success) === 'function' && config.success();
-        typeof(config.complete) === 'function' && config.complete();
-    };
-}
-</script>
-
-<style lang="less">
-@import "../components/styles/mixin/icon-font.less";
-@import "../components/styles/mixin/loading.less";
-
-.wepy-api-loading__bd__img:extend(.wepy_icon) {}
-
-.wepy-api-loading__bd__img__loading:extend(.wepy_loading) {
-    width: 50px;
-    height: 50px;
-    margin-top: 18px;
-}
-
-.wepy-api-loading__mask {
-    position: fixed;
-    z-index: 1000;
-    top: 0;
-    right: 0;
-    left: 0;
-    bottom: 0;
-}
-
-.wepy-api-loading__bd {
-    display: flex;
-    flex-direction: column;
-    position: fixed;
-    z-index: 5000;
-    min-width: 8.4em;
-    min-height: 8.4em;
-    max-width: 70%;
-    top: 140px;
-    left: 50%;
-    padding: 15px;
-    box-sizing: border-box;
-    transform: translateX(-50%);
-    background: rgba(40, 40, 40, 0.75);
-    border-radius: 5px;
-    color: #FFFFFF;
-    word-wrap: break-word;
-    word-break: break-all;
-    align-items: center;
-    justify-content: space-around;
-}
-
-.wepy-api-loading__bd__title {
-    margin: 3px 0;
-    font-size: 1.2em;
-}
-</style>
diff --git a/packages/wepy-web/src/apis/showModal.vue b/packages/wepy-web/src/apis/showModal.vue
deleted file mode 100644
index 053ae8819..000000000
--- a/packages/wepy-web/src/apis/showModal.vue
+++ /dev/null
@@ -1,195 +0,0 @@
-/**
-* @author: Gcaufy
-* @description: wx.showModal(OBJECT)
-* @link: https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-react.html#wxshowmodalobject
-
-* @properties:
-* title   String  是   提示的标题
-* content String  是   提示的内容
-* showCancel  Boolean 否   是否显示取消按钮，默认为 true
-* cancelText  String  否   取消按钮的文字，默认为"取消"，最多 4 个字符
-* cancelColor HexColor    否   取消按钮的文字颜色，默认为"#000000"
-* confirmText String  否   确定按钮的文字，默认为"确定"，最多 4 个字符
-* confirmColor    HexColor    否   确定按钮的文字颜色，默认为"#3CC51F"
-* success Function    否   接口调用成功的回调函数
-* fail    Function    否   接口调用失败的回调函数
-* complete    Function    否   接口调用结束的回调函数（调用成功、失败都会执行）
-*
-* wx.showModal({
-*   title: '提示',
-*   content: '这是一个模态弹窗',
-*   success: function(res) {
-*     if (res.confirm) {
-*       console.log('用户点击确定')
-*     } else if (res.cancel) {
-*       console.log('用户点击取消')
-*     }
-*   }
-* })
-*/
-
-<template>
-    <div class="wepy-api-dialog" v-show="show">
-        <div class="wepy-api-dialog__mask"></div>
-        <div class="wepy-api-dialog__main">
-            <div class="wepy-api-dialog__hd" v-show="title.length"><strong class="wepy-api-dialog__title">{{title}}</strong></div>
-            <div class="wepy-api-dialog__bd" v-show="content.length">{{content}}</div>
-            <div class="wepy-api-dialog__ft">
-                <a href="javascript:;" class="wepy-api-dialog__btn wepy-api-dialog__btn_default" @click="cancel" v-show="showCancel" :style="{color: cancelColor}">{{cancelText}}</a>
-                <a href="javascript:;" class="wepy-api-dialog__btn wepy-api-dialog__btn_primary" @click="confirm" :style="{color: confirmColor}">{{confirmText}}</a>
-            </div>
-        </div>
-    </div>
-</template>
-
-<script>
-
-const DEFAULT_PROPERTIES = {
-    title: '提示的标题',
-    content: '提示的内容',
-    showCancel: true,
-    cancelText: '取消',
-    cancelColor: '#000000',
-    confirmText: '确定',
-    confirmColor: '#3CC51F'
-};
-
-export default {
-    name: 'Modal',
-
-    data () {
-        return Object.assign({show: false}, DEFAULT_PROPERTIES);
-    },
-
-    methods: {
-        cancel () {
-            this.show = false;
-            let rst = {
-                errMsg: "showModal:ok",
-                cancel: true,
-                confirm: false
-            };
-            typeof(this.success) === 'function' && this.success(rst);
-            typeof(this.complete) === 'function' && this.complete(rst);
-        },
-        confirm (index) {
-            this.show = false;
-            let rst = {
-                errMsg: "showModal:ok",
-                cancel: false,
-                confirm: true
-            };
-            typeof(this.success) === 'function' && this.success(rst);
-            typeof(this.complete) === 'function' && this.complete(rst);
-        }
-    }
-}
-
-export function getter (constructor) {
-    return (config) => {
-        if (!config.content) {
-            throw 'content is required in wx.showModal';
-        }
-        if (!this.instance) {
-            this.instance = new constructor({
-                el: document.createElement('div')
-            });
-            this.instance.$appendTo(document.body);
-        }
-        wx.$modal = this.instance;
-        Object.assign(this.instance, DEFAULT_PROPERTIES, {fail: void 0, success: void 0, complete: void 0}, config);
-        this.instance.show = true;
-    };
-}
-</script>
-
-
-<style lang="less">
-.wepy-api-dialog__mask {
-    position: fixed;
-    z-index: 1000;
-    top: 0;
-    right: 0;
-    left: 0;
-    bottom: 0;
-    background: rgba(0, 0, 0, 0.6);
-}
-.wepy-api-dialog__main {
-    position: fixed;
-    z-index: 5000;
-    width: 80%;
-    max-width: 300px;
-    top: 50%;
-    left: 50%;
-    -webkit-transform: translate(-50%, -50%);
-    transform: translate(-50%, -50%);
-    background-color: #FFFFFF;
-    text-align: center;
-    border-radius: 3px;
-    overflow: hidden;
-}
-.wepy-api-dialog__hd {
-    padding: 1.3em 1.6em 0.5em;
-}
-.wepy-api-dialog__title {
-    font-weight: 400;
-    font-size: 18px;
-}
-.wepy-api-dialog__bd {
-    padding: 0 1.6em 0.8em;
-    min-height: 40px;
-    font-size: 15px;
-    line-height: 1.3;
-    word-wrap: break-word;
-    word-break: break-all;
-    color: #999999;
-}
-.wepy-api-dialog__ft {
-    position: relative;
-    line-height: 48px;
-    font-size: 18px;
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: flex;
-}
-.wepy-api-dialog__btn_default {
-    color: #353535;
-}
-.wepy-api-dialog__btn {
-    display: block;
-    -webkit-box-flex: 1;
-    -webkit-flex: 1;
-    flex: 1;
-    color: #3CC51F;
-    text-decoration: none;
-    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-    position: relative;
-}
-.wepy-api-dialog__btn_primary {
-    color: #0BB20C;
-}
-.wepy-api-dialog__btn {
-    display: block;
-    -webkit-box-flex: 1;
-    -webkit-flex: 1;
-    flex: 1;
-    color: #3CC51F;
-    text-decoration: none;
-    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-    position: relative;
-}
-.wepy-api-dialog__btn:after {
-    content: " ";
-    position: absolute;
-    left: 0;
-    top: 0;
-    width: 1px;
-    bottom: 0;
-    border-left: 1px solid #D5D5D6;
-    color: #D5D5D6;
-    -webkit-transform-origin: 0 0;
-    transform-origin: 0 0;
-    -webkit-transform: scaleX(0.5);
-    transform: scaleX(0.5);
-}
-</style>
diff --git a/packages/wepy-web/src/apis/showToast.vue b/packages/wepy-web/src/apis/showToast.vue
deleted file mode 100644
index 1df3ce95d..000000000
--- a/packages/wepy-web/src/apis/showToast.vue
+++ /dev/null
@@ -1,138 +0,0 @@
-/**
- * @author: Gcaufy
- * @description: wx.showToast(OBJECT)
- * @link: https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-react.html#wxshowtoastobject
-
- * @properties:
- * 参数  类型  必填  说明  最低版本
- * title String  是 提示的内容 
- * icon  String  否 图标，有效值 "success", "loading" 
- * image String  否 自定义图标的本地路径，image 的优先级高于 icon  1.1.0
- * duration  Number  否 提示的延迟时间，单位毫秒，默认：1500  
- * mask  Boolean 否 是否显示透明蒙层，防止触摸穿透，默认：false  
- * success Function  否 接口调用成功的回调函数 
- * fail  Function  否 接口调用失败的回调函数 
- * complete  Function  否 接口调用结束的回调函数（调用成功、失败都会执行）
- *
- * wx.showToast({
- * title: '成功',
- * icon: 'success',
- * duration: 2000
- * })
- */
-
-<template>
-    <div class="wepy-api-toast" v-show="show">
-        <div class="wepy-api-toast__mask" v-show="mask"></div>
-        <div class="wepy-api-toast__bd">
-            <div v-show="icon">
-                <div class="wepy-api-toast__bd__img" :class="icon === 'loading' ? 'wepy-api-toast__bd__img__loading' : 'wepy-api-toast__bd__img__success'"></div>
-            </div>
-            <div class="wepy-api-toast__bd__title">{{title}}</div>
-        </div>
-    </div>
-</template>
-<script>
-
-const DEFAULT_PROPERTIES = {
-    icon: '',
-    image: '',
-    mask: false,
-    duration: 1500,
-    title: '温馨提示',
-};
-
-
-export default {
-    name: 'Toast',
-    data () {
-        return Object.assign({show: false}, DEFAULT_PROPERTIES);
-    }
-}
-
-export function getter (constructor) {
-    return (config) => {
-        if (!config.title) {
-            throw 'title is required in wx.showToast';
-        }
-        if (!this.instance) {
-            this.instance = new constructor({
-                el: document.createElement('div')
-            });
-            this.instance.$appendTo(document.body);
-        }
-        wx.$toast = this.instance;
-        Object.assign(this.instance, DEFAULT_PROPERTIES, {fail: void 0, success: void 0, complete: void 0}, config);
-        this.instance.show = true;
-
-        typeof(config.success) === 'function' && config.success();
-        typeof(config.complete) === 'function' && config.complete();
-        
-        setTimeout(() => {
-            this.instance.show = false;
-        }, this.instance.duration);
-    };
-}
-</script>
-
-<style lang="less">
-@import "../components/styles/mixin/icon-font.less";
-@import "../components/styles/mixin/loading.less";
-
-.wepy-api-toast__bd__img:extend(.wepy_icon) {}
-
-.wepy-api-toast__bd__img__success { color: #fff }
-
-.wepy-api-toast__bd__img__success:before:extend(.wepy_icon-success:before){
-    font-size: 50px;
-    margin-top: 18px;
-}
-
-.wepy-api-toast__bd__img__loading:extend(.wepy_loading) {
-    width: 50px;
-    height: 50px;
-    margin-top: 18px;
-}
-
-.wepy-api-toast__mask {
-    position: fixed;
-    z-index: 1000;
-    top: 0;
-    right: 0;
-    left: 0;
-    bottom: 0;
-}
-
-.wepy-api-toast__bd {
-    display: flex;
-    flex-direction: column;
-    position: fixed;
-    z-index: 5000;
-    min-width: 8.4em;
-    min-height: 8.4em;
-    max-width: 70%;
-    top: 140px;
-    left: 50%;
-    padding: 15px;
-    box-sizing: border-box;
-    transform: translateX(-50%);
-    background: rgba(40, 40, 40, 0.75);
-    border-radius: 5px;
-    color: #FFFFFF;
-    word-wrap: break-word;
-    word-break: break-all;
-    align-items: center;
-    justify-content: space-around;
-}
-
-.wepy-api-toast__bd__img_desc {
-    width: 55px;
-    height: 55px;
-    vertical-align: middle;
-}
-
-.wepy-api-toast__bd__title {
-    margin: 3px 0;
-    font-size: 1.2em;
-}
-</style>
\ No newline at end of file
diff --git a/packages/wepy-web/src/app.js b/packages/wepy-web/src/app.js
deleted file mode 100644
index b103bf153..000000000
--- a/packages/wepy-web/src/app.js
+++ /dev/null
@@ -1,128 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import native from './native';
-
-export default class {
-
-    $addons = {};
-
-    $interceptors = {};
-
-    $pages = {};
-
-
-
-    $init (wepy) {
-        this.initAPI(wepy);
-        this.$wxapp = getApp();
-    }
-
-
-    use (addon, ...args) {
-        if (typeof(addon) === 'string' && this[addon]) {
-            this.$addons[addon] = 1;
-            this[addon](args);
-        } else {
-            this.$addons[addon.name] = new addon(args);
-        }
-    }
-
-    intercept (api, provider) {
-        this.$interceptors[api] = provider;
-    }
-
-    promisify () {
-    }
-
-    requestfix () {
-        // do nothing
-    }
-
-    initAPI (wepy) {
-        var self = this;
-        let noPromiseMethods = {
-            stopRecord: true,
-            pauseVoice: true,
-            stopVoice: true,
-            pauseBackgroundAudio: true,
-            stopBackgroundAudio: true,
-            showNavigationBarLoading: true,
-            hideNavigationBarLoading: true,
-            createAnimation: true,
-            createContext: true,
-            createCanvasContext: true,
-            hideKeyboard: true,
-            stopPullDownRefresh: true
-        };
-        Object.keys(wx).forEach((key) => {
-            if (!noPromiseMethods[key] && key.substr(0, 2) !== 'on' && !(/\w+Sync$/.test(key))) {
-                Object.defineProperty(native, key, {
-                    get () {
-                        return (obj) => {
-                            obj = obj || {};
-                            if (self.$interceptors[key] && self.$interceptors[key].config) {
-                                let rst = self.$interceptors[key].config.call(self, obj);
-                                if (rst === false) {
-                                    if (self.$addons.promisify) {
-                                        return Promise.reject('aborted by interceptor');
-                                    } else {
-                                        obj.fail && obj.fail('aborted by interceptor');
-                                        return;
-                                    }
-                                }
-                                obj = rst;
-                            }
-                            if (key === 'request') {
-                                obj = (typeof(obj) === 'string') ? {url: obj} : obj;
-                            }
-                            if (self.$addons.promisify) {
-                                return new Promise((resolve, reject) => {
-                                    let bak = {};
-                                    ['fail', 'success', 'complete'].forEach((k) => {
-                                        bak[k] = obj[k];
-                                        obj[k] = (res) => {
-                                            if (self.$interceptors[key] && self.$interceptors[key][k]) {
-                                                res = self.$interceptors[key][k].call(self, res);
-                                            }
-                                            if (k === 'success')
-                                                resolve(res)
-                                            else if (k === 'fail')
-                                                reject(res);
-                                        };
-                                    });
-                                    wx[key](obj);
-                                });
-                            } else {
-                                let bak = {};
-                                ['fail', 'success', 'complete'].forEach((k) => {
-                                    bak[k] = obj[k];
-                                    obj[k] = (res) => {
-                                        if (self.$interceptors[key] && self.$interceptors[key][k]) {
-                                            res = self.$interceptors[key][k].call(self, res);
-                                        }
-                                        bak[k] && bak[k].call(self, res);
-                                    };
-                                });
-                                wx[key](obj);
-                            }
-                        };
-                    }
-                });
-                wepy[key] = native[key];
-            } else {
-                Object.defineProperty(native, key, {
-                    get () { return (...args) => wx[key].apply(wx, args) }
-                });
-                wepy[key] = native[key];
-            }
-        });
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy-web/src/base.js b/packages/wepy-web/src/base.js
deleted file mode 100644
index 3113d8a66..000000000
--- a/packages/wepy-web/src/base.js
+++ /dev/null
@@ -1,287 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import Vue from 'vue';
-import VueRouter from 'vue-router';
-import event from './event';
-
-import {camelize, hyphenate} from './helper/word';
-
-
-const pageEvent = ['onLoad', 'onReady', 'onShow', 'onHide', 'onUnload', 'onPullDownRefresh', 'onReachBottom', 'onShareAppMessage'];
-
-const addStyle = (stylelist) => {
-    let styleElement = document.createElement('style');
-    let head = document.head || document.getElementsByTagName('head')[0];
-
-    let css = '';
-    stylelist.forEach(id => {
-        css += __wepy_require(id) + '\r\n';
-    });
-    
-    let cssNode = document.createTextNode(css);
-    styleElement.appendChild(cssNode);
-    head.appendChild(styleElement);
-    styleElement.type = 'text/css';
-    return styleElement;
-};
-
-
-const $createMixin = (com, mixinClass) => {
-    let obj = {};
-    let mixin = new mixinClass;
-    for (let k in mixin) {
-        if (k === 'data') {
-            obj.data = function () {
-                return mixin.data;
-            }
-        } else if (k === 'methods') {
-            obj[k] = {};
-            for (let method in mixin[k]) {
-                obj[k][method] = mixin[k][method].bind(com);
-            }
-        } else {
-            obj[k] = mixin[k];
-        }
-    }
-    return obj;
-};
-
-const $createComponent = (com, template) => {
-
-    let k, vueObject = {};
-
-    vueObject.template = template;
-    vueObject.data = function () {
-        return com.data;
-    };
-
-    vueObject.components = {};
-    vueObject.methods = {};
-
-    Object.getOwnPropertyNames(com.components || {}).forEach((name) => {
-        let cClass = com.components[name];
-        let child = new cClass();
-        //child.initMixins();
-        child.$name = name;
-
-        com.$com[name] = child;
-        vueObject.components[name] = $createComponent(child, cClass.template);
-    });
-
-    Object.getOwnPropertyNames(com.methods || {}).forEach((method) => {
-        let fn = com.methods[method];
-        vueObject.methods[method] = function (...arg) {
-            let e = arg[arg.length - 1];
-
-            // Component event params are from $arguments
-            if (!e) {
-                e = this.$arguments[0];
-            }
-            let evt = new event('system', com, e.type);
-            evt.$transfor(e);
-            if (evt.type === 'input') {
-                evt.detail = {};
-                evt.detail.value = evt.srcElement.value;
-            }
-            arg[arg.length - 1] = evt;
-
-            // this !== $vm in repeats.
-            if (com.$vm !== this) {
-                com.$vm = this;
-                com.$index = this.$parent.$children.indexOf(this);
-                if (this.$parent && this.$parent.$parent && this.$parent.$parent.$children) {
-                    com.$parent.$index = this.$parent.$parent.$children.indexOf(this.$parent);
-                }
-            }
-            fn.apply(com, arg);
-        }
-    });
-
-
-    if (typeof com.mixins === 'object' && com.mixins.constructor === Array) {
-        vueObject.mixins = com.mixins.map(mixin => {
-            return $createMixin(com, mixin);
-        });
-    } else if (typeof com.mixins === 'function') {
-        vueObject.mixins = [$createMixin(com, mixin)];
-    }
-
-    vueObject.props = com.props;
-    vueObject.computed = com.computed;
-    vueObject.watch = com.watch;
-    vueObject.events = com.events;
-
-    vueObject.created = function () {
-        com.$wxpage = this;
-        com.$vm = this;
-        this.$wepy = com;
-
-        if (!com.$isComponent) {
-            wx._currentPage = com;
-            wx._currentPage.__route__ = this.$route.path;
-            wx._currentPage.__wxWebviewId__ = 0;
-
-            let share = typeof com.onShareAppMessage === 'funciton' ? com.onShareAppMessage() : null;
-            if (share) {
-                wx.__initShare && wx.__initShare(share);
-            } else {
-                wx.__hideShare && wx.__hideShare();
-            }
-        }
-
-        if (typeof com.onLoad === 'function') {
-            com.onLoad.call(com, com.$vm.$route.query, {});
-        }
-    };
-
-    vueObject.ready = function () {
-        console.log(`${com.$name} is ready`);
-        com.$wxpage = this;
-        com.$vm = this;
-
-        if (typeof com.onShow === 'function') {
-            com.onShow.call(com);
-        }
-    };
-
-    [].concat(Object.getOwnPropertyNames(com.props || {})).
-        concat(Object.getOwnPropertyNames(com.computed || {})).
-        concat(Object.getOwnPropertyNames(com.data || {})).
-        forEach(v => {
-            v = camelize(v);
-            Object.defineProperty(com, v, { 
-                get: function () {
-                    return com.$vm[v];
-                },
-                set: function (val) {
-                    com.$vm[v] = val;
-                }
-            });
-        });
-    return vueObject;
-}
-
-export default {
-    $createApp (appClass, config) {
-        let k, routes = [];
-
-        let app = new appClass;
-
-        this.platform = wx.__platform;
-        app.$components = [];
-        app.$apis = [];
-
-        if (!this.$instance) {
-            app.$init(this);
-            this.$instance = app;
-        }
-
-        // Vue2
-        /*for (k in config.routes) {
-            routes.push({
-                path: '/' + k,
-                component: this.$createPage(__wepy_require(config.routes[k]).default)
-            }, { path: '*', redirect: '/' + k })
-        }
-        const router = new VueRouter({ routes: routes });
-        const vueApp = new Vue({
-            router
-        }).$mount('#app');*/
-
-
-        addStyle(config.style);
-
-        
-        if (typeof app.onLaunch === 'function') {
-            app.onLaunch();
-        }
-        if (typeof app.onShow === 'function') {
-            console.warn('onShow is not implemented in web');
-        }
-        if (typeof app.onHide === 'function') {
-            console.warn('onHide is not implemented in web');
-        }
-
-        // 注入组件
-        for (k in config.components) {
-            app.$components.push(k);
-            let com = __wepy_require(config.components[k]).default;
-            com.name = 'wepy-' + com.name;
-            Vue.component('wepy-' + k, com);
-        }
-        
-        // 注入API
-        for (k in config.apis) {
-            app.$apis.push(k);
-            let apiMod = __wepy_require(config.apis[k]);
-            if (apiMod.default) {
-                Object.defineProperty(wx, k, {
-                    get () {
-                        return apiMod.getter(Vue.extend(apiMod.default));
-                    }
-                });
-            } else {
-                Object.defineProperty(wx, k, {
-                    get () {
-                        return apiMod.getter();
-                    }
-                });
-            }
-        }
-        
-        Vue.use(VueRouter);
-
-        let router = new VueRouter();
-        let index = '';
-
-        for (k in config.routes) {
-            let tmp = {};
-            if (!index)
-                index = k;
-            tmp['/' + k] = {
-                component: this.$createPage(__wepy_require(config.routes[k]).default, '/' + k)
-            }
-            router.map(tmp);
-        }
-        router.redirect({
-            '*': '/' + index
-        });
-        router.start({}, '#app');
-
-        router.beforeEach((trans) => {
-            window.scrollTo(0, 0);
-            trans.next();
-        });
-
-        window.$router = router;
-    },
-    $createPage (pageClass, pagePath) {
-
-        let page = new pageClass();
-
-        if (pagePath)
-            this.$instance.$pages[pagePath] = page;
-
-        page.$name = pageClass.name || 'unnamed';
-        page.$app = this.$instance;
-
-        let vueObject = $createComponent(page, pageClass.template);
-
-        page.$init(Vue, this.$instance, this.$instance);
-
-        wx._currentPages = wx._currentPages || [];
-        wx._currentPages.push(page);
-        page.__route__ = pagePath;
-        page.__wxWebviewId__ = 0;
-        
-        return vueObject;
-    },
-}
diff --git a/packages/wepy-web/src/component.js b/packages/wepy-web/src/component.js
deleted file mode 100644
index 6f5167560..000000000
--- a/packages/wepy-web/src/component.js
+++ /dev/null
@@ -1,341 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import event from './event';
-import util from './util';
-
-
-const Props = {
-    check (t, val) {
-        switch (t) {
-            case String:
-                return typeof(val) === 'string';
-            case Number:
-                return typeof(val) === 'number';
-            case Boolean:
-                return typeof(val) === 'boolean';
-            case Function:
-                return typeof(val) === 'function';
-            case Object:
-                return typeof(val) === 'object';
-            case Array:
-                return toString.call(val) === '[object Array]';
-            default:
-                return val instanceof t;
-        }
-    },
-    build (props) {
-        let rst = {};
-        if (typeof(props) === 'string') {
-            rst[props] = {};
-        } else if (toString.call(props) === '[object Array]') {
-            props.forEach((p) => {
-                rst[p] = {};
-            });
-        } else {
-            Object.keys(props).forEach(p => {
-                if (typeof(props[p]) === 'function') {
-                    rst[p] = {
-                        type: [props[p]]
-                    }
-                } else if (toString.call(props[p]) === '[object Array]') {
-                    rst[p] = {
-                        type: props[p]
-                    }
-                } else
-                    rst[p] = props[p];
-
-                if (rst[p].type && toString.call(rst[p].type) !== '[object Array]')
-                    rst[p].type = [rst[p].type];
-            });
-        }
-        return rst;
-    },
-    valid (props, key, val) {
-        let valid = false;
-        if (props[key]) {
-            if (!props[key].type) {
-                valid = true;
-            } else {
-                return props[key].type.some(t => this.check(t, val));
-            }
-        }
-        return valid;
-    },
-    getValue (props, key, value) {
-        var rst;
-        if (value !== undefined && this.valid(props, key, value)) {
-            rst = value;
-        } else if (typeof(props[key].default) === 'function') {
-            rst = props[key].default();
-        } else
-            rst = props[key].default;
-        return props[key].coerce ? props[key].coerce(rst) : rst;
-    }
-};
-
-export default class {
-
-    $com = {};
-    $mixins = [];
-
-    $isComponent = true;
-    $prefix = '';
-
-    $mappingProps = {};
-
-    data = {};
-    methods = {};
-
-    $init ($wxpage, $root, $parent) {
-        let self = this;
-
-
-        this.$wxpage = $wxpage;
-        if (this.$isComponent) {
-            this.$root = $root || this.$root;
-            this.$parent = $parent || this.$parent;
-            this.$wxapp = this.$root.$parent.$wxapp;
-            this.$app = this.$root.$app;
-        }
-
-
-        let coms = Object.getOwnPropertyNames(this.$com);
-        if (coms.length) {
-            coms.forEach((name) => {
-                this.$com[name].$init($wxpage, $root, this);
-            });
-        }
-
-        return;
-    }
-
-    initMixins () {
-        if (this.mixins) {
-            if (typeof(this.mixins) === 'function') {
-                this.mixins = [this.mixins];
-            }
-        } else {
-            this.mixins = [];
-        }
-        this.mixins.forEach((mix) => {
-            let inst = new mix();
-            inst.init(this);
-            this.$mixins.push(inst);
-        });
-    }
-
-    onLoad () {
-    }
-
-    setData (k, v) {
-        if (typeof k === 'string') {
-            this.$vm[k] = v;
-        }
-        for (let t in k) {
-            this.$vm[t] = k[t];
-        }
-    }
-
-    getWxPage () {
-        return this.$wxpage;
-    }
-
-    getCurrentPages () {
-        return this.$wxpage.getCurrentPages();
-    }
-
-    $getComponent(com) {
-        if (typeof(com) === 'string') {
-            if (com.indexOf('/') === -1) {
-                return this.$com[com];
-            } else if (com === '/') {
-                return this.$parent;
-            } else {
-                let path = com.split('/');
-                path.forEach((s, i) => {
-                    if (i === 0) {
-                        if (s === '') {   //   /a/b/c
-                            com = this.$root;
-                        } else if (s === '.') {
-                            // ./a/b/c
-                            com = this;
-                        } else if (s === '..') {
-                            // ../a/b/c
-                            com = this.$parent;
-                        } else {
-                            com = this.$getComponent(s);
-                        }
-                    } else if (s) {
-                        com = com.$com[s];
-                    }
-                });
-            }
-        }
-        return (typeof(com) !== 'object') ? null : com;
-    }
-
-    $invoke (com, method, ...args) {
-        com = this.$getComponent(com);
-
-        if (!com) {
-            throw new Error('Invalid path: ' + com);
-        }
-
-        let fn = com.methods ? com.methods[method] : '';
-
-        if (typeof(fn) === 'function') {
-            let $evt = new event('', this, 'invoke');
-            let rst = fn.apply(com, args.concat($evt));
-            com.$apply();
-            return rst;
-        } else {
-            fn = com[method];
-        }
-
-        if (typeof(fn) === 'function') {
-            return fn.apply(com, args);
-        } else {
-            throw new Error('Invalid method: ' + method);
-        }
-    }
-
-    $broadcast (evtName, ...args) {
-        let com = this;
-        let $evt = typeof(evtName) === 'string' ? new event(evtName, this, 'broadcast') : $evt;
-        let queue = [com];
-
-        while(queue.length && $evt.active) {
-            let current = queue.shift();
-            for (let c in current.$com) {
-                c = current.$com[c];
-                queue.push(c);
-                let fn = getEventsFn(c, evtName);
-                if (fn) {
-                    c.$apply(() => {
-                        fn.apply(c, args.concat($evt));
-                    });
-                }
-                if (!$evt.active)
-                    break;
-            }
-        }
-    }
-
-    $emit (evtName, ...args) {
-        let com = this;
-        let source = this;
-        let $evt = new event(evtName, source, 'emit');
-
-        if (this.$parent === undefined)
-            console.log(this);
-
-        // User custom event;
-        if (this.$parent.$events && this.$parent.$events[this.$name]) {
-            let method = this.$parent.$events[this.$name]['v-on:' + evtName];
-            if (method && this.$parent.methods) {
-                let fn = this.$parent.methods[method];
-                if (typeof(fn) === 'function') {
-                    this.$parent.$apply(() => {
-                        fn.apply(this.$parent, args.concat($evt));
-                    });
-                    return;
-                } else {
-                    throw new Error(`Invalid method from emit, component is ${this.$parent.$name}, method is ${method}. Make sure you defined it already.\n`);
-                }
-            }
-        }
-        while(com && com.$isComponent !== undefined && $evt.active) {
-            // 保存 com 块级作用域组件实例
-            let comContext = com;
-            let fn = getEventsFn(comContext, evtName);
-            fn && comContext.$apply(() => {
-                fn.apply(comContext, args.concat($evt));
-            });
-            com = comContext.$parent;
-        }
-    }
-
-    $apply (fn) {
-        if (typeof(fn) === 'function') {
-            fn.call(this);
-            this.$apply();
-        } else {
-            return true;
-            if (this.$$phase) {
-                this.$$phase = '$apply';
-            } else {
-                this.$digest();
-            }
-        }
-    }
-
-    $digest () {
-        let k;
-        let originData = this.$data;
-        this.$$phase = '$digest';
-        while (this.$$phase) {
-            let readyToSet = {};
-            for (k in originData) {
-                if (!util.$isEqual(this[k], originData[k])) { // compare if new data is equal to original data
-                    readyToSet[this.$prefix + k] = this[k]; // send to ReadyToSet
-                    this.data[k] = this[k];
-                    originData[k] = util.$copy(this[k], true);
-                    if (this.$mappingProps[k]) {
-                        Object.keys(this.$mappingProps[k]).forEach((changed) => {
-                            let mapping = this.$mappingProps[k][changed];
-                            if (typeof(mapping) === 'object') {
-                                this.$parent.$apply();
-                            } else if (changed === 'parent' && !util.$isEqual(this.$parent.$data[mapping], this[k])) {
-                                this.$parent[mapping] = this[k];
-                                this.$parent.data[mapping] = this[k];
-                                this.$parent.$apply();
-                            } else if (changed !== 'parent' && !util.$isEqual(this.$com[changed].$data[mapping], this[k])) {
-                                this.$com[changed][mapping] = this[k];
-                                this.$com[changed].data[mapping] = this[k];
-                                this.$com[changed].$apply();
-                            }
-                        });
-                    }
-                }
-            }
-            if (Object.keys(readyToSet).length) {
-                if (this.computed) {
-                    for (k in this.computed) { // If there are computed property, calculated every times
-                        let fn = this.computed[k], val = fn.call(this);
-                        if (!util.$isEqual(this[k], val)) { // Value changed, then send to ReadyToSet
-                            readyToSet[this.$prefix + k] = val;
-                            this[k] = util.$copy(val, true);
-                        }
-                    }
-                }
-                this.setData(readyToSet);
-            }
-            this.$$phase = (this.$$phase === '$apply') ? '$digest' : false;
-        }
-    }
-
-}
-
-function getEventsFn (comContext, evtName) {
-    let fn = comContext.events ? comContext.events[evtName] : undefined;
-    const typeFn = typeof(fn);
-    let fnFn;
-    if (typeFn === 'string') {
-        // 如果 events[k] 是 string 类型 则认为是调用 methods 上方法
-        const method = comContext.methods && comContext.methods[fn];
-        if (typeof(method) === 'function') {
-            fnFn = method;
-        }
-    } else if (typeFn === 'function') {
-        fnFn = fn;
-    }
-    return fnFn;
-}
\ No newline at end of file
diff --git a/packages/wepy-web/src/components/button.vue b/packages/wepy-web/src/components/button.vue
deleted file mode 100644
index 9c0ac5c92..000000000
--- a/packages/wepy-web/src/components/button.vue
+++ /dev/null
@@ -1,236 +0,0 @@
-<!--
-@author: gcaufy
-@description: 小程序表单组件button
-@link: https://mp.weixin.qq.com/debug/wxadoc/dev/component/button.html
-
-@properties:
-size    String  default 按钮的大小   
-type    String  default 按钮的样式类型 
-plain   Boolean false   按钮是否镂空，背景色透明    
-disabled    Boolean false   是否禁用    
-loading Boolean false   名称前是否带 loading 图标   
-form-type   String      用于 <form/> 组件，点击分别会触发 submit/reset 事件   
-open-type   String      有效值：contact，打开客服会话  1.1.0
-hover-class String  button-hover    指定按钮按下去的样式类。当 hover-class="none" 时，没有点击态效果  
-hover-start-time    Number  20  按住后多久出现点击态，单位毫秒 
-hover-stay-time Number  70  手指松开后点击态保留时间，单位毫秒
-
-size 有效值：
-
-值   说明
-default 
-mini
-type 有效值：
-
-值   说明
-primary 
-default 
-warn
-form-type 有效值：
-
-值   说明
-submit  提交表单
-reset   重置表单
-open-type 有效值：
-
-值   说明  最低版本
-contact 打开客服会话  1.1.0
--->
-<template>
-    <button class="wepy_button" :size="size" type="{{type}}" :disabled="disabled" :plain="plain" :class="isHover ? hoverClass : ''" @touchstart="touchstart" @touchend="touchend"><slot></slot></button>
-</template>
-<script>
-
-import { stringToBoolean }from '../helper/util';
-
-const BUTTON_TYPES = ['default', 'primary', 'warn'];
-
-export default {
-    name: 'button',
-
-    props: {
-        'size': {
-            type: String,
-            default: 'default'
-        },
-        'type': {
-            type: String,
-            default: 'default',
-            coerce (val) {
-                return (BUTTON_TYPES.indexOf(val) !== -1) ? val : BUTTON_TYPES[0];
-            }
-        },
-        'plain': {
-            type: [ Boolean, String ],
-            default: false,
-            coerce: stringToBoolean()
-        },
-        'disabled': {
-            type: [ Boolean, String ],
-            default: false,
-            coerce: stringToBoolean()
-        },
-        'loading': {
-            type: [ Boolean, String ],
-            default: ''
-        },
-        'form-type': {
-            type: String,
-            default: ''
-        },
-        'open-type': {
-            type: String,
-            default: ''
-        },
-        'hover-class': {
-            type: String,
-            default: 'button-hover'
-        },
-        'hover-start-time': {
-            type: [ Number, String ],
-            default: 20
-        },
-        'hover-stay-time': {
-            type: [ Number, String ],
-            default: 70
-        }
-    },
-
-    data () {
-        return {
-            isHover: false
-        };
-    },
-
-    methods: {
-        touchstart () {
-            clearInterval(this.stayInterval);
-            if (!this.startInterval && this.hoverClass !== 'none' && this.hoverClass !== '') { // 实测'none'和''都不会触发hover
-                this.startInterval = setInterval(() => {
-                    this.isHover = true;
-                }, this.hoverStartTime);
-            }
-        },
-        touchend () {
-            clearInterval(this.startInterval);
-            if (!this.stayInterval && this.hoverClass !== 'none' && this.hoverClass !== '') {
-                this.stayInterval = setInterval(() => {
-                    this.isHover = false;
-                }, this.hoverStayTime);
-            }
-        }
-    }
-}
-</script>
-
-<style lang="less">
-.wepy_button {
-    position:relative;
-    display:block;
-    margin-left:auto;
-    margin-right:auto;
-    padding-left:14px;
-    padding-right:14px;
-    box-sizing:border-box;
-    font-size:18px;
-    text-align:center;
-    text-decoration:none;
-    line-height:2.55555556;
-    border-radius:5px;
-    -webkit-tap-highlight-color:transparent;
-    overflow:hidden;
-    color:#000000;
-    background-color:#F8F8F8;
-    -webkit-appearance:none;
-    outline:none;
-    border: none;
-    width: 100%;
-}
-.wepy_button::after {
-    content:" ";
-    width:200%;
-    height:200%;
-    position:absolute;
-    top:0;
-    left:0;
-    border:1px solid rgba(0, 0, 0, 0.2);
-    -webkit-transform:scale(0.5);
-    transform:scale(0.5);
-    -webkit-transform-origin:0 0;
-    transform-origin:0 0;
-    box-sizing:border-box;
-    border-radius:10px;
-}
-.wepy_button.button-hover{
-    color: rgba(0, 0, 0, 0.6);
-    background-color: #DEDEDE;
-}
-.wepy_button[type="default"] {
-    color: #000;
-    background-color: #F8F8F8;
-}
-.wepy_button[type="primary"] {
-    color: #FFF;
-    background-color: #1AAD19;
-}
-.wepy_button[type="warn"] {
-    color: #FFF;
-    background-color: #E64340;
-}
-.wepy_button[disabled] {
-    color:rgba(255, 255, 255, 0.6);
-}
-.wepy_button[disabled][type="primary"] {
-    background-color:#9ED99D;
-}
-.wepy_button[disabled][type="default"] {
-    color:rgba(0, 0, 0, 0.3);
-    background-color:#F7F7F7;
-}
-.wepy_button[disabled][type="warn"] {
-    background-color:#EC8B89;
-}
-.wepy_button[plain] {
-    color:#353535;
-    border:1px solid #353535;
-    background-color:transparent;
-}
-.wepy_button[plain][disabled] {
-    color:rgba(0, 0, 0, 0.2);
-    border-color:rgba(0, 0, 0, 0.2);
-}
-.wepy_button[type="default"][plain] {
-    color:#353535;
-    border:1px solid #353535;
-    background-color:transparent;
-}
-.wepy_button[type="default"][plain][disabled] {
-    color:rgba(0, 0, 0, 0.2);
-    border-color:rgba(0, 0, 0, 0.2);
-}
-.wepy_button[type="primary"][plain] {
-    color:#1aad19;
-    border:1px solid #1aad19;
-    background-color:transparent;
-}
-.wepy_button[type="primary"][plain][disabled] {
-    color:rgba(0, 0, 0, 0.2);
-    border-color:rgba(0, 0, 0, 0.2);
-}
-.wepy_button[type="warn"][plain] {
-    color:#e64340;
-    border:1px solid #e64340;
-    background-color:transparent;
-}
-.wepy_button[type="warn"][plain][disabled] {
-    color:rgba(0, 0, 0, 0.2);
-    border-color:rgba(0, 0, 0, 0.2);
-}
-.wepy_button[size="mini"] {
-    display:inline-block;
-    line-height:2.3;
-    font-size:13px;
-    padding:0 1.34em;
-    width:auto;
-}
-</style>
diff --git a/packages/wepy-web/src/components/checkbox-group.vue b/packages/wepy-web/src/components/checkbox-group.vue
deleted file mode 100644
index e304da5e7..000000000
--- a/packages/wepy-web/src/components/checkbox-group.vue
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-@author: dlhandsome
-@description: 小程序表单组件checkbox-group
-@link: https://mp.weixin.qq.com/debug/wxadoc/dev/component/checkbox.html
-
-@properties:
-bindchange	EventHandle		<checkbox-group/>中选中项发生改变是触发 change 事件，detail = {value:[选中的checkbox的value的数组]}
--->
-<template>
-    <div class="wepy_checkbox-group" :id="id">
-        <slot></slot>
-    </div>
-</template>
-<script>
-import { uuid } from '../helper/util';
-
-export default {
-    name: 'checkbox-group',
-
-    data () {
-        return {
-            id: `checkbox-${uuid()}`
-        };
-    }
-}
-</script>
diff --git a/packages/wepy-web/src/components/checkbox.vue b/packages/wepy-web/src/components/checkbox.vue
deleted file mode 100644
index f4e71715e..000000000
--- a/packages/wepy-web/src/components/checkbox.vue
+++ /dev/null
@@ -1,105 +0,0 @@
-<!--
-@author: dlhandsome
-@description: 小程序表单组件checkbox
-@link: https://mp.weixin.qq.com/debug/wxadoc/dev/component/checkbox.html
-
-@properties:
-value	String		<checkbox/>标识，选中时触发<checkbox-group/>的 change 事件，并携带 <checkbox/> 的 value
-disabled	Boolean	false	是否禁用
-checked	Boolean	false	当前是否选中，可用来设置默认选中
-color	Color		checkbox的颜色，同css的color
--->
-<template>
-    <div class="wepy_checkbox">
-        <input type="checkbox" :name="checkboxName" :checked="checked" :disabled="disabled" :value="value" @change="change" />
-        <i class="wepy_icon" :style="{color: color}"></i>
-    </div>
-</template>
-<script>
-
-export default {
-    name: 'checkbox',
-
-    data () {
-        return {
-            checkboxName: 'checkbox'
-        };
-    },
-
-    props: {
-        value: {
-            type: String,
-            default: ''
-        },
-        checked: {
-            type: Boolean,
-            default: false
-        },
-        disabled: {
-            type: Boolean,
-            default: false
-        },
-        color: {
-            type: String,
-            default: ''
-        }
-    },
-
-    methods: {
-        getCheckboxValue () {
-            const $checkboxLists = document.getElementsByName(this.checkboxName);
-            const checkboxValue = [];
-
-            [].slice.call($checkboxLists).forEach($checkbox => {
-                if ($checkbox.checked) checkboxValue.push($checkbox.value);
-            });
-            return checkboxValue;
-        },
-        change (e) {
-            e.stopPropagation();
-
-            this.$dispatch('change', {
-                type: 'change',
-                detail: {
-                    value: this.getCheckboxValue()
-                },
-                currentTarget: this.$el
-            });
-        }
-    },
-
-    ready () {
-        if (this.$parent.$el.classList.contains('wepy_checkbox-group')) {
-            this.checkboxName = this.$parent.$el.id;
-        }
-    }
-}
-</script>
-
-<style lang="less">
-@import "styles/mixin/icon-font.less";
-
-.wepy_checkbox{
-    display: inline-block;
-}
-.wepy_checkbox input{
-    position: absolute;
-    left: -9999em;
-}
-.wepy_checkbox .wepy_icon:before {
-    color: #C9C9C9;
-    content: '';
-    font-size: 13px;
-    display: block;
-    width: 13px;
-    height: 13px;
-    padding: 4px;
-    border: 1px solid #C9C9C9;
-    border-radius: 2px;
-    margin: 0 .354em;
-}
-.wepy_checkbox input:checked + .wepy_icon:before {
-    color: #09BB07;
-    content: '\EA08';
-}
-</style>
diff --git a/packages/wepy-web/src/components/icon.vue b/packages/wepy-web/src/components/icon.vue
deleted file mode 100644
index ec5270103..000000000
--- a/packages/wepy-web/src/components/icon.vue
+++ /dev/null
@@ -1,64 +0,0 @@
-<!--
-@author: dlhandsome
-@description: 小程序基础组件icon
-@link: https://mp.weixin.qq.com/debug/wxadoc/dev/component/icon.html
-
-@properties:
-type  String    icon的类型，有效值：success, success_no_circle, info, warn, waiting, cancel, download, search, clear
-size  Number  23  icon的大小，单位px
-color Color   icon的颜色，同css的color
--->
-<template>
-    <div class="wepy_icon" :class="'wepy_icon-' + type" :style="style"></div>
-</template>
-<script>
-
-const VALID_TYPES = ['success', 'success_no_circle', 'circle', 'info_circle', 'info', 'warn', 'waiting', 'cancel', 'download', 'search', 'clear'];
-
-export default {
-    name: 'icon',
-
-    props: {
-        'type': {
-            type: String,
-            default: '',
-            validator (type) {
-                return VALID_TYPES.indexOf(type) !== -1;
-            }
-        },
-        'size': {
-            type: [ Number, String ],
-            default: 23
-        },
-        'color': {
-            type: String,
-            default: ''
-        }
-    },
-
-    computed: {
-        style () {
-            return {
-                color: this.color,
-                fontSize: `${this.size}px`
-            };
-        }
-    }
-}
-</script>
-
-<style lang="less">
-@import "styles/mixin/icon-font.less";
-@import "styles/variable/color.less";
-
-
-.wepy_icon-download { color: @green }
-.wepy_icon-info { color: @blue }
-.wepy_icon-success { color: @green }
-.wepy_icon-success_no_circle { color: @green }
-.wepy_icon-waiting { color: @blue }
-.wepy_icon-warn { color: @pink }
-.wepy_icon-cancel { color: @red }
-.wepy_icon-search { color: @grey }
-.wepy_icon-clear { color: @grey }
-</style>
diff --git a/packages/wepy-web/src/components/navigator.vue b/packages/wepy-web/src/components/navigator.vue
deleted file mode 100644
index 9ce111654..000000000
--- a/packages/wepy-web/src/components/navigator.vue
+++ /dev/null
@@ -1,96 +0,0 @@
-<!--
-
-@author: Gcaufy
-@description: 小程序基础组件navigator
-@link: https://mp.weixin.qq.com/debug/wxadoc/dev/component/navigator.html
-
-@properties:
-url String      应用内的跳转链接
-open-type   String  navigate    跳转方式
-delta   Number      当 open-type 为 'navigateBack' 时有效，表示回退的层数
-hover-class String  navigator-hover 指定点击时的样式类，当hover-class="none"时，没有点击态效果
-hover-start-time    Number  50  按住后多久出现点击态，单位毫秒
-hover-stay-time Number  600 手指松开后点击态保留时间，单位毫秒
-
-open-type 有效值：
-
-值   说明  最低版本
-navigate    对应 wx.navigateTo 的功能    
-redirect    对应 wx.redirectTo 的功能    
-switchTab   对应 wx.switchTab 的功能 
-reLaunch    对应 wx.reLaunch 的功能  1.1.0
-navigateBack    对应 wx.navigateBack 的功能  1.1.0
--->
-<template>
-    <a href="javascript:;" class="wepy_navigator" :class="hover ? hoverClass : ''" @touchstart="touchstart" @touchend="touchend" @click="click"><slot></slot></a>
-</template>
-<script>
-import util from '../util';
-
-const OPEN_TYPES = ['navigate', 'redirect', 'switchTab', 'reLaunch', 'navigateBack'];
-
-export default {
-    name: 'navigator',
-
-    data () {
-        return {
-            hover: false
-        }
-    },
-
-    props: {
-        'url': {
-            type: String,
-            default: ''
-        },
-        'open-type': {
-            type: String,
-            default: 'navigate',
-            coerce (val) {
-                return (OPEN_TYPES.indexOf(val) !== -1) ? val : 'navigate'
-            }
-        },
-        'delta': {
-            type: [Number, String],
-            default: 1
-        },
-        'hover-class': {
-            type: String,
-            default: 'navigator-hover'
-        },
-        'hover-start-time': {
-            type: [Number, String],
-            default: 50
-        },
-        'hover-start-time': {
-            type: [Number, String],
-            default: 600
-        }
-    },
-
-    methods: {
-        click () {
-            let hash = util.$resolvePath(this.$route.path, this.url);
-            window.location.hash = '#!' + hash;
-        },
-        touchstart () {
-            this.hover = true;
-        },
-        touchend () {
-            this.hover = false;
-        }
-    }
-}
-</script>
-<style>
-.navigator-hover {
-    background-color: rgba(0, 0, 0, 0.1);
-    opacity: 0.1;
-}
-</style>
-<style lang="less">
-.wepy_navigator {
-    text-decoration: none;
-    display: block;
-}
-</style>
diff --git a/packages/wepy-web/src/components/progress.vue b/packages/wepy-web/src/components/progress.vue
deleted file mode 100644
index 453a72723..000000000
--- a/packages/wepy-web/src/components/progress.vue
+++ /dev/null
@@ -1,105 +0,0 @@
-<!--
-@author: dlhandsome
-@description: 小程序基础组件progress
-@link: https://mp.weixin.qq.com/debug/wxadoc/dev/component/progress.html
-
-@properties:
-percent	Float	无	百分比0~100
-show-info	Boolean	false	在进度条右侧显示百分比
-stroke-width	Number	6	进度条线的宽度，单位px
-color	Color	#09BB07	进度条颜色 （请使用 activeColor）
-activeColor	Color		已选择的进度条的颜色
-backgroundColor	Color		未选择的进度条的颜色
-active	Boolean	false	进度条从左往右的动画
--->
-<template>
-    <div class="wepy_progress">
-        <div class="wepy_progress-bar" :style="barStyle">
-            <div class="wepy_progress-inner_bar" :style="innerBarStyle"></div>
-        </div>
-        <div v-show="showInfo" class="wepy_progress-percent">{{ percent + '%' }}</div>
-    </div>
-</template>
-<script>
-
-export default {
-    name: 'progress',
-
-    props: {
-        'percent': {
-            type: [ Number, String ],
-            default: 0,
-            validator (percent) {
-                const percentNum = Number(percent)
-                return !isNaN(percentNum) && percentNum >= 0 && percentNum <= 100
-            }
-        },
-        'showInfo': {
-            type: Boolean,
-            default: false
-        },
-        'strokeWidth': {
-            type: [ Number, String ],
-            default: 6
-        },
-        'color': {
-            type: String,
-            default: '#09BB07'
-        },
-        'activeColor': {
-            type: String,
-            default: ''
-        },
-        'backgroundColor': {
-            type: String,
-            default: ''
-        },
-        'active': {
-            type: Boolean,
-            default: false
-        }
-    },
-
-    computed: {
-        barStyle () {
-            return {
-                height: `${this.strokeWidth}px`,
-                backgroundColor: this.backgroundColor
-            }
-        },
-        innerBarStyle () {
-            return {
-                backgroundColor: this.activeColor || this.color,  // 优先级：activeColor > color ，两者均为进度条颜色字段
-                width: `${this.percent}%`
-            }
-        }
-    }
-}
-</script>
-
-<style lang="less">
-.wepy_progress{
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: flex;
-    -webkit-box-align: center;
-    -webkit-align-items: center;
-    align-items: center;
-}
-.wepy_progress-bar{
-    background-color: #EBEBEB;
-    height: 6px;
-    -webkit-box-flex: 1;
-    -webkit-flex: 1;
-    flex: 1;
-}
-.wepy_progress-inner_bar{
-    width: 0;
-    height: 100%;
-    background-color: #09BB07;
-}
-.wepy_progress-percent{
-    font-size: 16px;
-    margin-left: 15px;
-}
-</style>
diff --git a/packages/wepy-web/src/components/radio-group.vue b/packages/wepy-web/src/components/radio-group.vue
deleted file mode 100644
index 028ad1bd7..000000000
--- a/packages/wepy-web/src/components/radio-group.vue
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-@author: dlhandsome
-@description: 小程序表单组件radio-group
-@link: https://mp.weixin.qq.com/debug/wxadoc/dev/component/radio.html
-
-@properties:
-bindchange	EventHandle		<radio-group/> 中的选中项发生变化时触发 change 事件，event.detail = {value: 选中项radio的value}
--->
-<template>
-    <div class="wepy_radio-group" :id="id">
-        <slot></slot>
-    </div>
-</template>
-<script>
-import { uuid } from '../helper/util';
-
-export default {
-    name: 'radio-group',
-
-    data () {
-        return {
-            id: `radio-${uuid()}`
-        };
-    }
-}
-</script>
diff --git a/packages/wepy-web/src/components/radio.vue b/packages/wepy-web/src/components/radio.vue
deleted file mode 100644
index 916ab27cb..000000000
--- a/packages/wepy-web/src/components/radio.vue
+++ /dev/null
@@ -1,90 +0,0 @@
-<!--
-@author: dlhandsome
-@description: 小程序表单组件radio
-@link: https://mp.weixin.qq.com/debug/wxadoc/dev/component/radio.html
-
-@properties:
-value	String		<radio/> 标识。当该<radio/> 选中时，<radio-group/> 的 change 事件会携带<radio/>的value
-checked	Boolean	false	当前是否选中
-disabled	Boolean	false	是否禁用
-color	Color		radio的颜色，同css的color
--->
-<template>
-    <div class="wepy_radio">
-        <input type="radio" :name="radioName" :checked="checked" :disabled="disabled" :value="value" @change="change" />
-        <i class="wepy_icon" :style="{color: color}"></i>
-    </div>
-</template>
-<script>
-
-export default {
-  name: 'radio',
-
-  data () {
-      return {
-          radioName: 'radio'
-      };
-  },
-
-  props: {
-      value: {
-          type: String,
-          default: ''
-      },
-      checked: {
-          type: Boolean,
-          default: false
-      },
-      disabled: {
-          type: Boolean,
-          default: false
-      },
-      color: {
-          type: String,
-          default: ''
-      }
-  },
-
-  methods: {
-      change (e) {
-          e.stopPropagation();
-
-          this.$dispatch('change', {
-              type: 'change',
-              detail: {
-                  value: this.value
-              },
-              currentTarget: this.$el
-          });
-      }
-  },
-
-  ready () {
-      if (this.$parent.$el.classList.contains('wepy_radio-group')) {
-          this.radioName = this.$parent.$el.id;
-      }
-  }
-}
-</script>
-
-<style lang="less">
-@import "styles/mixin/icon-font.less";
-
-.wepy_radio{
-  display: inline-block;
-}
-.wepy_radio input{
-  position: absolute;
-  left: -9999em;
-}
-.wepy_radio .wepy_icon:before {
-  color: #C9C9C9;
-  content: '\EA01';
-  font-size: 23px;
-  display: block;
-}
-.wepy_radio input:checked + .wepy_icon:before {
-  color: #09BB07;
-  content: '\EA06';
-}
-</style>
diff --git a/packages/wepy-web/src/components/scroll-view.vue b/packages/wepy-web/src/components/scroll-view.vue
deleted file mode 100644
index 6e33d1a51..000000000
--- a/packages/wepy-web/src/components/scroll-view.vue
+++ /dev/null
@@ -1,77 +0,0 @@
-<template>
-    <div class="wepy_scroll-view" @scroll="scroll($event)"><slot></slot></div>
-</template>
-<script>
-import event from '../event';
-import { merge }from '../helper/util';
-
-let TABLE_OPTIONS = {
-    'scroll-x': {
-        type: Boolean,
-        default: false
-    },
-    'scroll-y': {
-        type: Boolean,
-        default: false
-    },
-    'upper-threshold': {
-        type: Number,
-        default: 50
-    },
-    'lower-threshold': {
-        type: Number,
-        default: 50
-    },
-    'scroll-top': {
-        type: Number,
-        default: 0
-    },
-    'scroll-left': {
-        type: Number,
-        default: 0
-    },
-    'scroll-into-view': {
-        type: String,
-        default: ''
-    },
-    'scroll-with-animation': {
-        type: Boolean,
-        default: false
-    },
-    'enable-back-to-top': {
-        type: Boolean,
-        default: false
-    }
-};
-let TABLE_EVENT = {
-    scrolltoupper: null,
-    scrolltolower: null,
-    scroll: null,
-};
-
-export default {
-    name: 'scroll-view',
-    methods: {
-        scroll (e) {
-            let elem = e.srcElement || e.currentTarget;
-            let evt = new event('system', this.$parent.$wepy, e.type);
-            evt.$transfor(e);
-            this.$parent.$event = evt;
-
-            let options = merge(elem, TABLE_OPTIONS);
-
-            this.$emit('scroll');
-
-            let upper = options['scroll-x'] ? elem.scrollLeft : elem.scrollTop;
-            let lower = options['scroll-x'] ? (elem.scrollWidth - elem.scrollLeft - elem.clientWidth) : (elem.scrollHeight - elem.scrollTop - elem.clientHeight);
-            
-            if (upper <= options['upper-threshold']) {
-                this.$emit('scrolltoupper');
-            }
-            if (lower <= options['lower-threshold']) {
-                this.$emit('scrolltolower');
-            }
-        }
-    }
-}
-</script>
\ No newline at end of file
diff --git a/packages/wepy-web/src/components/slider.vue b/packages/wepy-web/src/components/slider.vue
deleted file mode 100644
index a43856c67..000000000
--- a/packages/wepy-web/src/components/slider.vue
+++ /dev/null
@@ -1,197 +0,0 @@
-<!--
-@author: Gcaufy
-@description: 小程序基础组件slider
-@link: https://mp.weixin.qq.com/debug/wxadoc/dev/component/slider.html
-
-@properties:
-min Number  0   最小值
-max Number  100 最大值
-step    Number  1   步长，取值必须大于 0，并且可被(max - min)整除
-disabled    Boolean false   是否禁用
-value   Number  0   当前取值
-color   Color   #e9e9e9 背景条的颜色（请使用 backgroundColor）
-selected-color  Color   #1aad19 已选择的颜色（请使用 activeColor）
-activeColor Color   #1aad19 已选择的颜色
-backgroundColor Color   #e9e9e9 背景条的颜色
-show-value  Boolean false   是否显示当前 value
-bindchange  EventHandle     完成一次拖动后触发的事件，event.detail = {value: value}
--->
-<template>
-    <div class="wepy_slider-box">
-        <div class="wepy_slider">
-            <div class="wepy_slider-inner" @click="click" :style="{backgroundColor: backgroundColor || color}">
-                <div class="wepy_slider-track" :style="{width: percent + '%', backgroundColor: activeColor || selectedColor}"></div>
-                <div class="wepy_slider-handler" :style="{left: percent + '%'}" @touchstart="touchstart" @touchmove="touchmove"></div>
-            </div>
-        </div>
-        <div class="wepy_slider-value" v-show="showValue">{{percent}}</div>
-    </div>
-</template>
-<script>
-
-import { numberValidator, stringToBoolean } from '../helper/util';
-import event from '../event';
-
-export default {
-    name: 'slider',
-
-    props: {
-        'min': {
-            type: [ Number, String ],
-            default: 0,
-            validator: numberValidator()
-        },
-        'max': {
-            type: [ Number, String ],
-            default: 100,
-            validator: numberValidator()
-        },
-        'step': {
-            type: [ Number, String ],
-            default: 1,
-            validator: numberValidator()
-        },
-        'disabled': {
-            type: [ Boolean, String ],
-            default: false,
-            coerce: stringToBoolean()
-        },
-        'value': {
-            type: [ Number, String ],
-            default: 0,
-            validator: numberValidator()
-        },
-        'color': {
-            type: String,
-            default: '#e9e9e9'
-        },
-        'activeColor': {
-            type: String,
-            default: '#1aad19'
-        },
-        'selectedColor': {
-            type: String,
-            default: '#1aad19'
-        },
-        'backgroundColor': {
-            type: String,
-            default: '#e9e9e9'
-        },
-        'showValue': {
-            type: [ Boolean, String ],
-            default: false,
-            coerce: stringToBoolean()
-        }
-    },
-
-    data: function () {
-        return {
-            startLeft: 0,
-            startX: 0,
-            totalLen: 0
-        }
-    },
-
-    computed: {
-        percent () {
-            if (this.value < this.min)
-                return this.min;
-            if (this.value > this.max)
-                return this.max;
-            return (this.value / this.step >> 0) * this.step;
-        }
-    },
-
-    methods: {
-        touchstart (e) {
-            if (this.disabled)
-                return;
-            this.startLeft = this.value * this.totalLen / 100;
-            this.startX = e.changedTouches[0].clientX;
-        },
-        touchmove (e) {
-            if (this.disabled)
-                return;
-            let dist = this.startLeft + e.changedTouches[0].clientX - this.startX;
-            dist = dist < 0 ? 0 : dist > this.totalLen ? this.totalLen : dist;
-            this.value =  parseInt(dist / this.totalLen * 100);
-            
-            this.$emit('change', {
-                type: 'change',
-                detail: {
-                    value: this.percent
-                },
-                currentTarget: this.$el
-            });
-            e.preventDefault();
-        },
-        click (e) {
-            if (this.disabled)
-                return;
-            let dist = e.clientX - e.currentTarget.offsetLeft;
-            dist = dist < 0 ? 0 : dist > this.totalLen ? this.totalLen : dist;
-            this.value =  parseInt(dist / this.totalLen * 100);
-            this.$emit('change', {
-                type: 'change',
-                detail: {
-                    value: this.percent
-                },
-                currentTarget: this.$el
-            });
-            e.preventDefault();
-        }
-    },
-
-    ready () {
-        this.totalLen = this.$el.firstElementChild.firstElementChild.clientWidth;
-    }
-}
-</script>
-
-<style lang="less">
-.wepy_slider-box {
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: flex;
-    -webkit-box-align: center;
-    -webkit-align-items: center;
-    align-items: center;
-}
-.wepy_slider-value {
-    margin-left: .5em;
-    min-width: 24px;
-    color: #888888;
-    text-align: center;
-    font-size: 14px;
-}
-.wepy_slider {
-    padding: 15px 18px;
-    -webkit-user-select: none;
-    user-select: none;
-    -webkit-box-flex: 1;
-    -webkit-flex: 1;
-    flex: 1;
-}
-.wepy_slider-inner {
-    position: relative;
-    height: 2px;
-    background-color: #E9E9E9;
-}
-.wepy_slider-track {
-    height: 2px;
-    background-color: #1AAD19;
-    width: 0;
-}
-.wepy_slider-handler {
-    position: absolute;
-    left: 0;
-    top: 50%;
-    width: 28px;
-    height: 28px;
-    margin-left: -14px;
-    margin-top: -14px;
-    border-radius: 50%;
-    background-color: #FFFFFF;
-    box-shadow: 0 0 4px rgba(0, 0, 0, 0.2);
-}
-</style>
diff --git a/packages/wepy-web/src/components/styles/mixin/icon-font.less b/packages/wepy-web/src/components/styles/mixin/icon-font.less
deleted file mode 100644
index 679bd78a3..000000000
--- a/packages/wepy-web/src/components/styles/mixin/icon-font.less
+++ /dev/null
@@ -1,35 +0,0 @@
-@iconFontName: "wepy_icon";
-@iconFontSrc: url('data:application/octet-stream;base64,AAEAAAALAIAAAwAwR1NVQrD+s+0AAAE4AAAAQk9TLzJAKEx+AAABfAAAAFZjbWFw65cFHQAAAhwAAAJQZ2x5ZvCRR/EAAASUAAAKtGhlYWQMPROtAAAA4AAAADZoaGVhCCwD+gAAALwAAAAkaG10eEJo//8AAAHUAAAASGxvY2EYqhW4AAAEbAAAACZtYXhwASEAVQAAARgAAAAgbmFtZeNcHtgAAA9IAAAB5nBvc3T6bLhLAAARMAAAAOYAAQAAA+gAAABaA+j/////A+kAAQAAAAAAAAAAAAAAAAAAABIAAQAAAAEAACbZbxtfDzz1AAsD6AAAAADUm2dvAAAAANSbZ2///wAAA+kD6gAAAAgAAgAAAAAAAAABAAAAEgBJAAUAAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKAB4ALAABREZMVAAIAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAAAAQOwAZAABQAIAnoCvAAAAIwCegK8AAAB4AAxAQIAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA6gHqEQPoAAAAWgPqAAAAAAABAAAAAAAAAAAAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+j//wPoAAAD6AAAAAAABQAAAAMAAAAsAAAABAAAAXQAAQAAAAAAbgADAAEAAAAsAAMACgAAAXQABABCAAAABAAEAAEAAOoR//8AAOoB//8AAAABAAQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAANwAAAAAAAAAEQAA6gEAAOoBAAAAAQAA6gIAAOoCAAAAAgAA6gMAAOoDAAAAAwAA6gQAAOoEAAAABAAA6gUAAOoFAAAABQAA6gYAAOoGAAAABgAA6gcAAOoHAAAABwAA6ggAAOoIAAAACAAA6gkAAOoJAAAACQAA6goAAOoKAAAACgAA6gsAAOoLAAAACwAA6gwAAOoMAAAADAAA6g0AAOoNAAAADQAA6g4AAOoOAAAADgAA6g8AAOoPAAAADwAA6hAAAOoQAAAAEAAA6hEAAOoRAAAAEQAAAAAARgCMANIBJAF4AcQCMgJgAqgC/ANIA6YD/gROBKAE9AVaAAAAAgAAAAADrwOtABQAKQAAASIHBgcGFBcWFxYyNzY3NjQnJicmAyInJicmNDc2NzYyFxYXFhQHBgcGAfV4Z2Q7PDw7ZGfwZmQ7PDw7ZGZ4bl5bNjc3Nlte215bNjc3NlteA608O2Rn8GdjOzw8O2Nn8GdkOzz8rzc1W17bXlw1Nzc1XF7bXls1NwAAAAACAAAAAAOzA7MAFwAtAAABIgcGBwYVFBcWFxYzMjc2NzY1NCcmJyYTBwYiLwEmNjsBETQ2OwEyFhURMzIWAe52Z2Q7PT07ZGd2fGpmOz4+O2ZpIXYOKA52Dg0XXQsHJgcLXRcNA7M+O2ZqfHZnZDs9PTtkZ3Z9aWY7Pv3wmhISmhIaARcICwsI/ukaAAMAAAAAA+UD5QAXACMALAAAASIHBgcGFRQXFhcWMzI3Njc2NTQnJicmAxQrASI1AzQ7ATIHJyImNDYyFhQGAe6Ecm9BRERBb3KEiXZxQkREQnF1aQIxAwgCQgMBIxIZGSQZGQPkREJxdomEcm9BRERBb3KEinVxQkT9HQICAWICAjEZIxkZIxkAAAAAAgAAAAADsQPkABkALgAAAQYHBgc2BREUFxYXFhc2NzY3NjURJBcmJyYTAQYvASY/ATYyHwEWNjclNjIfARYB9VVVQk+v/tFHPmxebGxdbT1I/tGvT0JVo/7VBASKAwMSAQUBcQEFAgESAgUBEQQD4xMYEhk3YP6sjnVlSD8cHD9IZXWOAVRgNxkSGP62/tkDA48EBBkCAVYCAQHlAQIQBAAAAAADAAAAAAOxA+QAGwAqADMAAAEGBwYHBgcGNxEUFxYXFhc2NzY3NjURJBcmJyYHMzIWFQMUBisBIicDNDYTIiY0NjIWFAYB9UFBODssO38gRz5sXmxsXW09SP7YqFBBVW80BAYMAwImBQELBh4PFhYeFRUD5A8SDhIOEikK/q2PdWRJPh0dPklkdY8BU141GRIY/AYE/sYCAwUBOgQG/kAVHxUVHxUAAAACAAAAAAPkA+QAFwAtAAABIgcGBwYVFBcWFxYzMjc2NzY1NCcmJyYTAQYiLwEmPwE2Mh8BFjI3ATYyHwEWAe6Ecm9BQ0NCbnODiXVxQkREQnF1kf6gAQUBowMDFgEFAYUCBQEBQwIFARUEA+NEQnF1iYNzbkJDQ0FvcoSJdXFCRP6j/qUBAagEBR4CAWYBAQENAgIVBAAAAAQAAAAAA68DrQAUACkAPwBDAAABIgcGBwYUFxYXFjI3Njc2NCcmJyYDIicmJyY0NzY3NjIXFhcWFAcGBwYTBQ4BLwEmBg8BBhYfARYyNwE+ASYiFzAfAQH1eGdkOzw8O2Rn8GZkOzw8O2RmeG5eWzY3NzZbXtteWzY3NzZbXmn+9gYSBmAGDwUDBQEGfQUQBgElBQELEBUBAQOtPDtkZ/BnYzs8PDtjZ/BnZDs8/K83NVte215cNTc3NVxe215bNTcCJt0FAQVJBQIGBAcRBoAGBQEhBQ8LBAEBAAABAAAAAAO7AzoAFwAAEy4BPwE+AR8BFjY3ATYWFycWFAcBBiInPQoGBwUHGgzLDCELAh0LHwsNCgr9uQoeCgGzCyEOCw0HCZMJAQoBvgkCCg0LHQv9sQsKAAAAAAIAAAAAA+UD5gAXACwAAAEiBwYHBhUUFxYXFjMyNzY3NjU0JyYnJhMHBi8BJicmNRM0NjsBMhYVExceAQHvhHJvQUNDQm5zg4l1cUJEREJxdVcQAwT6AwIEEAMCKwIDDsUCAQPlREJxdYmDc25CQ0NBb3KEiXVxQkT9VhwEAncCAgMGAXoCAwMC/q2FAgQAAAQAAAAAA68DrQADABgALQAzAAABMB8BAyIHBgcGFBcWFxYyNzY3NjQnJicmAyInJicmNDc2NzYyFxYXFhQHBgcGAyMVMzUjAuUBAfJ4Z2Q7PDw7ZGfwZmQ7PDw7ZGZ4bl5bNjc3Nlte215bNjc3NltemyT92QKDAQEBLDw7ZGfwZ2M7PDw7Y2fwZ2Q7PPyvNzVbXtteXDU3NzVcXtteWzU3AjH9JAAAAAMAAAAAA+QD5AAXACcAMAAAASIHBgcGFRQXFhcWMzI3Njc2NTQnJicmAzMyFhUDFAYrASImNQM0NhMiJjQ2MhYUBgHuhHJvQUNDQm5zg4l1cUJEREJxdZ42BAYMAwInAwMMBh8PFhYeFhYD40RCcXWJg3NuQkNDQW9yhIl1cUJE/vYGBf7AAgMDAgFABQb+NhYfFhYfFgAABAAAAAADwAPAAAgAEgAoAD0AAAEyNjQmIgYUFhcjFTMRIxUzNSMDIgcGBwYVFBYXFjMyNzY3NjU0Jy4BAyInJicmNDc2NzYyFxYXFhQHBgcGAfQYISEwISFRjzk5yTorhG5rPT99am+DdmhlPD4+PMyFbV5bNTc3NVte2l5bNTc3NVteAqAiLyIiLyI5Hf7EHBwCsT89a26Ed8w8Pj48ZWh2g29qffyjNzVbXtpeWzU3NzVbXtpeWzU3AAADAAAAAAOoA6gACwAgADUAAAEHJwcXBxc3FzcnNwMiBwYHBhQXFhcWMjc2NzY0JyYnJgMiJyYnJjQ3Njc2MhcWFxYUBwYHBgKOmpocmpocmpocmpq2dmZiOjs7OmJm7GZiOjs7OmJmdmtdWTQ2NjRZXdZdWTQ2NjRZXQKqmpocmpocmpocmpoBGTs6YmbsZmI6Ozs6YmbsZmI6O/zCNjRZXdZdWTQ2NjRZXdZdWTQ2AAMAAAAAA+kD6gAaAC8AMAAAAQYHBiMiJyYnJjQ3Njc2MhcWFxYVFAcGBwEHATI3Njc2NCcmJyYiBwYHBhQXFhcWMwKONUBCR21dWjU3NzVaXdpdWzU2GBcrASM5/eBXS0grKysrSEuuSkkqLCwqSUpXASMrFxg2NVtd2l1aNTc3NVpdbUdCQDX+3jkBGSsrSEuuSkkqLCwqSUquS0grKwAC//8AAAPoA+gAFAAwAAABIgcGBwYQFxYXFiA3Njc2ECcmJyYTFg4BIi8BBwYuATQ/AScmPgEWHwE3Nh4BBg8BAfSIdHFDRERDcXQBEHRxQ0REQ3F0SQoBFBsKoqgKGxMKqKIKARQbCqKoChsUAQqoA+hEQ3F0/vB0cUNERENxdAEQdHFDRP1jChsTCqiiCgEUGwqiqAobFAEKqKIKARQbCqIAAAIAAAAAA+QD5AAXADQAAAEiBwYHBhUUFxYXFjMyNzY3NjU0JyYnJhMUBiMFFxYUDwEGLwEuAT8BNh8BFhQPAQUyFh0BAe6Ecm9BQ0NCbnODiXVxQkREQnF1fwQC/pGDAQEVAwTsAgEC7AQEFAIBhAFwAgMD40RCcXWJg3NuQkNDQW9yhIl1cUJE/fYCAwuVAgQCFAQE0AIFAtEEBBQCBQGVCwMDJwAAAAUAAAAAA9QD0wAjACcANwBHAEgAAAERFAYjISImNREjIiY9ATQ2MyE1NDYzITIWHQEhMhYdARQGIyERIREHIgYVERQWOwEyNjURNCYjISIGFREUFjsBMjY1ETQmKwEDeyYb/XYbJkMJDQ0JAQYZEgEvExkBBgkNDQn9CQJc0QkNDQktCQ0NCf7sCQ0NCS0JDQ0JLQMi/TQbJiYbAswMCiwJDS4SGRkSLg0JLAoM/UwCtGsNCf5NCQ0NCQGzCQ0NCf5NCQ0NCQGzCQ0AAAAAEADGAAEAAAAAAAEABAAAAAEAAAAAAAIABwAEAAEAAAAAAAMABAALAAEAAAAAAAQABAAPAAEAAAAAAAUACwATAAEAAAAAAAYABAAeAAEAAAAAAAoAKwAiAAEAAAAAAAsAEwBNAAMAAQQJAAEACABgAAMAAQQJAAIADgBoAAMAAQQJAAMACAB2AAMAAQQJAAQACAB+AAMAAQQJAAUAFgCGAAMAAQQJAAYACACcAAMAAQQJAAoAVgCkAAMAAQQJAAsAJgD6d2V1aVJlZ3VsYXJ3ZXVpd2V1aVZlcnNpb24gMS4wd2V1aUdlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAHcAZQB1AGkAUgBlAGcAdQBsAGEAcgB3AGUAdQBpAHcAZQB1AGkAVgBlAHIAcwBpAG8AbgAgADEALgAwAHcAZQB1AGkARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETAAZjaXJjbGUIZG93bmxvYWQEaW5mbwxzYWZlX3N1Y2Nlc3MJc2FmZV93YXJuB3N1Y2Nlc3MOc3VjY2Vzcy1jaXJjbGURc3VjY2Vzcy1uby1jaXJjbGUHd2FpdGluZw53YWl0aW5nLWNpcmNsZQR3YXJuC2luZm8tY2lyY2xlBmNhbmNlbAZzZWFyY2gFY2xlYXIEYmFjawZkZWxldGUAAAAA') format('truetype');
-
-@font-face {
-  font-weight: normal;
-  font-style: normal;
-  font-family: @iconFontName;
-  src: @iconFontSrc;
-}
-
-.wepy_icon {
-  display: inline-block;
-  vertical-align: middle;
-  font: normal normal normal 14px/1 @iconFontName;
-  font-size: inherit;
-  text-rendering: auto;
-  -webkit-font-smoothing: antialiased;
-  &:before{
-    // 平滑升级
-    display: inline-block;
-    margin-left: .2em;
-    margin-right: .2em;
-  }
-}
-
-.wepy_icon-download:before { content: "\EA02" }
-.wepy_icon-info:before { content: "\EA03" }
-.wepy_icon-success:before { content: "\EA06" }
-.wepy_icon-circle:before { content: "\EA01" }
-.wepy_icon-success_no_circle:before { content: "\EA08" }
-.wepy_icon-waiting:before { content: "\EA09" }
-.wepy_icon-warn:before { content: "\EA0B" }
-.wepy_icon-cancel:before { content: "\EA0D" }
-.wepy_icon-search:before { content: "\EA0E" }
-.wepy_icon-clear:before { content: "\EA0F" }
\ No newline at end of file
diff --git a/packages/wepy-web/src/components/styles/mixin/loading.less b/packages/wepy-web/src/components/styles/mixin/loading.less
deleted file mode 100644
index 659575613..000000000
--- a/packages/wepy-web/src/components/styles/mixin/loading.less
+++ /dev/null
@@ -1,32 +0,0 @@
-.wepy_loading {
-  width:20px;
-  height:20px;
-  display: inline-block;
-  vertical-align: middle;
-  animation: weuiLoading 1s steps(12, end) infinite;
-  background: transparent url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=) no-repeat;
-  background-size: 100%;
-  &.weui-loading_transparent{
-    background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 100 100'%3E%3Cpath fill='none' d='M0 0h100v100H0z'/%3E%3Crect xmlns='http://www.w3.org/2000/svg' width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.56)' rx='5' ry='5' transform='translate(0 -30)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.5)' rx='5' ry='5' transform='rotate(30 105.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.43)' rx='5' ry='5' transform='rotate(60 75.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.38)' rx='5' ry='5' transform='rotate(90 65 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.32)' rx='5' ry='5' transform='rotate(120 58.66 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.28)' rx='5' ry='5' transform='rotate(150 54.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.25)' rx='5' ry='5' transform='rotate(180 50 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.2)' rx='5' ry='5' transform='rotate(-150 45.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.17)' rx='5' ry='5' transform='rotate(-120 41.34 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.14)' rx='5' ry='5' transform='rotate(-90 35 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.1)' rx='5' ry='5' transform='rotate(-60 24.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.03)' rx='5' ry='5' transform='rotate(-30 -5.98 65)'/%3E%3C/svg%3E");
-  }
-}
-
-@-webkit-keyframes weuiLoading {
-  0% {
-    transform: rotate3d(0, 0, 1, 0deg);
-  }
-
-  100% {
-    transform: rotate3d(0, 0, 1, 360deg);
-  }
-}
-
-@keyframes weuiLoading {
-  0% {
-    transform: rotate3d(0, 0, 1, 0deg);
-  }
-
-  100% {
-    transform: rotate3d(0, 0, 1, 360deg);
-  }
-}
\ No newline at end of file
diff --git a/packages/wepy-web/src/components/styles/variable/color.less b/packages/wepy-web/src/components/styles/variable/color.less
deleted file mode 100644
index 14922becd..000000000
--- a/packages/wepy-web/src/components/styles/variable/color.less
+++ /dev/null
@@ -1,5 +0,0 @@
-@green: #09BB07;
-@blue: #10AEFF;
-@pink: #F76260;
-@red: #F43530;
-@grey: #B2B2B2;
\ No newline at end of file
diff --git a/packages/wepy-web/src/components/switch.vue b/packages/wepy-web/src/components/switch.vue
deleted file mode 100644
index eb87824a6..000000000
--- a/packages/wepy-web/src/components/switch.vue
+++ /dev/null
@@ -1,101 +0,0 @@
-<!--
-@author: Gcaufy
-@description: 小程序基础组件switch
-@link: https://mp.weixin.qq.com/debug/wxadoc/dev/component/switch.html
-
-@properties:
-checked Boolean false   是否选中
-type    String  switch  样式，有效值：switch, checkbox
-bindchange  EventHandle     checked 改变时触发 change 事件，event.detail={ value:checked}
-color   Color       switch 的颜色，同 css 的 color
--->
-<template>
-    <input class="wepy_switch" type="checkbox" :style="{backgroundColor: color}" @click="click($event)" />
-</template>
-<script>
-
-import { numberValidator, stringToBoolean } from '../helper/util';
-import event from '../event';
-
-export default {
-    name: 'switch',
-
-    props: {
-        'checked': {
-            type: [ Boolean, String ],
-            default: false,
-            coerce: stringToBoolean()
-        },
-        // TODO type="checkbox" do not work
-        'type': {
-            type: String,
-            default: 'switch',
-        },
-        'color': {
-            type: String,
-            default: '#04BE02'
-        }
-    },
-    methods: {
-        click (e) {
-            this.$emit('change', {
-                type: 'change',
-                detail: {
-                    value: this.checked
-                },
-                currentTarget: this.$el
-            });
-        }
-    }
-}
-</script>
-
-<style lang="less">
-.wepy_switch {
-    -webkit-appearance: none;
-    appearance: none;
-    position: relative;
-    width: 52px;
-    height: 32px;
-    border: 1px solid #DFDFDF;
-    outline: 0;
-    border-radius: 16px;
-    box-sizing: border-box;
-    background-color: #DFDFDF;
-    -webkit-transition: background-color 0.1s, border 0.1s;
-    transition: background-color 0.1s, border 0.1s;
-    &:checked {
-        border-color: #04BE02;
-        background-color: #04BE02;
-        &:before {
-            transform: scale(0);
-        }
-        &:after {
-            transform: translateX(20px);
-        }
-    }
-    &:before{
-        content: " ";
-        position: absolute;
-        top: 0;
-        left: 0;
-        width: 50px;
-        height: 30px;
-        border-radius: 15px;
-        background-color: #FDFDFD;
-        transition:transform .35s cubic-bezier(0.45, 1, 0.4, 1);
-    }
-    &:after{
-        content: " ";
-        position: absolute;
-        top: 0;
-        left: 0;
-        width: 30px;
-        height: 30px;
-        border-radius: 15px;
-        background-color: #FFFFFF;
-        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
-        transition:transform .35s cubic-bezier(0.4, 0.4, 0.25, 1.35);
-    }
-}
-</style>
diff --git a/packages/wepy-web/src/components/text.vue b/packages/wepy-web/src/components/text.vue
deleted file mode 100644
index a70d110fa..000000000
--- a/packages/wepy-web/src/components/text.vue
+++ /dev/null
@@ -1,35 +0,0 @@
-<!--
-@author: dlhandsome
-@description: 小程序基础组件text
-@link: https://mp.weixin.qq.com/debug/wxadoc/dev/component/text.html
-
-@properties:
-selectable	Boolean	false	文本是否可选	1.1.0
--->
-<template>
-  <span class="wepy_text" :style="style">
-    <slot></slot>
-  </span>
-</template>
-
-<script>
-
-export default {
-    name: 'text',
-
-    props: {
-        'selectable': {
-            type: Boolean,
-            default: false
-        }
-    },
-
-    computed: {
-        style () {
-            return {
-                userSelect: this.selectable ? 'text' : 'none'
-            };
-        }
-    }
-}
-</script>
diff --git a/packages/wepy-web/src/components/view.vue b/packages/wepy-web/src/components/view.vue
deleted file mode 100644
index f5e5450a6..000000000
--- a/packages/wepy-web/src/components/view.vue
+++ /dev/null
@@ -1,69 +0,0 @@
-<!--
-@author: dlhandsome
-@description: 小程序视图容器view
-@link: https://mp.weixin.qq.com/debug/wxadoc/dev/component/view.html
-
-@properties:
-hover	Boolean	false	是否启用点击态
-hover-class	String	none	指定按下去的样式类。当 hover-class="none" 时，没有点击态效果
-hover-start-time	Number	50	按住后多久出现点击态，单位毫秒
-hover-stay-time	Number	400	手指松开后点击态保留时间，单位毫秒
--->
-<template>
-    <div class="wepy_view"
-         :class="isHover ? hoverClass : ''"
-         @touchstart="touchstart"
-         @touchend="touchend">
-        <slot></slot>
-    </div>
-</template>
-<script>
-
-export default {
-    name: 'view',
-
-    data () {
-        return {
-            isHover: false
-        };
-    },
-
-    props: {
-        'hover': {
-            type: Boolean,
-            default: false
-        },
-        'hover-class': {
-            type: String,
-            default: 'none'
-        },
-        'hover-start-time': {
-            type: Number,
-            default: 50
-        },
-        'hover-stay-time': {
-            type: Number,
-            default: 400
-        }
-    },
-
-    methods: {
-        touchstart () {
-            clearInterval(this.stayInterval);
-            if (this.hover && !this.startInterval && this.hoverClass !== 'none' && this.hoverClass !== '') { // 实测'none'和''都不会触发hover
-                this.startInterval = setInterval(() => {
-                    this.isHover = true;
-                }, this.hoverStartTime);
-            }
-        },
-        touchend () {
-            clearInterval(this.startInterval);
-            if (this.hover && !this.stayInterval && this.hoverClass !== 'none' && this.hoverClass !== '') {
-                this.stayInterval = this.setInterval(() => {
-                    this.isHover = false;
-                }, this.hoverStartTime);
-            }
-        }
-    }
-}
-</script>
diff --git a/packages/wepy-web/src/event.js b/packages/wepy-web/src/event.js
deleted file mode 100644
index f159072f9..000000000
--- a/packages/wepy-web/src/event.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-export default class {
-
-    active = true;
-
-    constructor (name, source, type) {
-
-        this.name = name;
-        this.source = source;
-        this.type = type;
-    }
-
-    $destroy () {
-        this.active = false;
-    }
-
-    $transfor(wxevent) {
-        let k = 0;
-        for (k in wxevent) {
-            this[k] = wxevent[k];
-        }
-    }
-}
diff --git a/packages/wepy-web/src/helper/cookie.js b/packages/wepy-web/src/helper/cookie.js
deleted file mode 100644
index 2998beb48..000000000
--- a/packages/wepy-web/src/helper/cookie.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-export default {
-    all () {
-        if (document.cookie === '') return {};
-
-        var cookies = document.cookie.split('; '),
-            result = {};
-
-        document.cookie.split('; ').forEach(v => {
-            let item = item = v.split('=');
-            let key = decodeURIComponent(item.shift());
-            let value = decodeURIComponent(item.join('='));
-            result[key] = value;
-        });
-        return result;
-    },
-
-    get (keys) {
-        let cookies = this.all();
-
-        if (Object.prototype.toString.call(keys) === '[object Array]') {
-            let rst = {};
-            keys.forEach(v => {
-                rst[v] = cookies[v];
-            })
-        } else {
-            return cookies[keys];
-        }
-
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy-web/src/helper/device.js b/packages/wepy-web/src/helper/device.js
deleted file mode 100644
index 0770a4672..000000000
--- a/packages/wepy-web/src/helper/device.js
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-const MOBILE_DEVICE = ['android', 'iphone', 'symbianos', 'windows phone', 'ipad', 'ipod'];
-
-export function system () {
-    let ua = window.navigator.userAgent.toLowerCase();
-
-    for (let i = 0; i < MOBILE_DEVICE.length; i++) {
-        if (ua.indexOf(MOBILE_DEVICE[i]) !== -1) {
-            switch (MOBILE_DEVICE[i]) {
-                case 'iphone':
-                    return 'mobile_iPhone';
-                case 'symbianos':
-                    return 'mobile_SymbianOS';
-                case 'windows phone':
-                    return 'mobile_WindowsPhone';
-                case 'iPad':
-                    return 'pad_iPad';
-                case 'iPod':
-                    return 'pad_iPod';
-                case 'Android':
-                    if (ua.indexOf('Mobile') !== -1) {
-                        return 'mobile_Android';
-                    } else {
-                        return 'pad_Android';
-                    }
-
-            }
-        }
-    }
-
-    let sys;
-
-    if (ua.indexOf('nt 5.1') > -1) {
-        sys = 'Windows xp';
-    } else if (ua.indexOf('nt 6.1') > -1) {
-        sys = 'Windows 7';
-    } else if (ua.indexOf('nt 6.3') > -1) {
-        sys = 'Windows 8';
-    } else if (ua.indexOf('nt 10.0') > -1) {
-        sys = 'Windows 10';
-    } else if (ua.indexOf('nt 6.0') > -1) {
-        sys = 'Windows Vista';
-    } else if (ua.indexOf('nt 5.2') > -1) {
-        sys = 'Windows 2003';
-    } else if (ua.indexOf('nt 5.0') > -1) {
-        sys = 'Windows 2000';
-    } else if ((ua.indexOf('windows') !== -1 || ua.indexOf('win32') !== -1)) {
-        sys = 'Windows';
-    } else if ((ua.indexOf('macintosh') !== -1 || ua.indexOf('mac os x') !== -1)) {
-        sys = 'Macintosh';
-    } else if ((ua.indexOf('adobeair') !== -1)) {
-        sys = 'Adobeair';
-    } else {
-        sys = 'Unknow';
-    }
-
-    return sys;
-};
-
-export function mobile () {
-    let ua = window.navigator.userAgent.toLowerCase();
-    return MOBILE_DEVICE.some(v => ua.indexOf(v) !== -1);
-};
-
-export function browser () {
-
-};
\ No newline at end of file
diff --git a/packages/wepy-web/src/helper/query.js b/packages/wepy-web/src/helper/query.js
deleted file mode 100644
index da1a13602..000000000
--- a/packages/wepy-web/src/helper/query.js
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-// https://github.com/vuejs/vue-router/blob/dev/src/util/query.js
-
-const encodeReserveRE = /[!'()*]/g;
-const encodeReserveReplacer = c => '%' + c.charCodeAt(0).toString(16);
-const commaRE = /%2C/g;
-
-const encode = str => encodeURIComponent(str)
-    .replace(encodeReserveRE, encodeReserveReplacer)
-    .replace(commaRE, ',');
-
-const decode = decodeURIComponent;
-
-
-function parseQuery (query) {
-    const res = {};
-
-    query = query.trim().replace(/^(\?|#|&)/, '');
-
-    if (!query) {
-        return res;
-    }
-
-    query.split('&').forEach(param => {
-        const parts = param.replace(/\+/g, ' ').split('=');
-        const key = decode(parts.shift());
-        const val = parts.length > 0
-            ? decode(parts.join('='))
-            : null;
-
-        if (res[key] === undefined) {
-            res[key] = val;
-        } else if (Array.isArray(res[key])) {
-            res[key].push(val);
-        } else {
-            res[key] = [res[key], val];
-        }
-    });
-
-    return res;
-}
-
-export function resolveQuery (query, extraQuery, _parseQuery) {
-    const parse = _parseQuery || parseQuery;
-    let parsedQuery;
-    try {
-        parsedQuery = parse(query || '');
-    } catch (e) {
-        parsedQuery = {};
-    }
-    for (const key in extraQuery) {
-        const val = extraQuery[key];
-        parsedQuery[key] = Array.isArray(val) ? val.slice() : val;
-    }
-    return parsedQuery;
-}
-
-export function stringifyQuery (obj) {
-    const res = obj ? Object.keys(obj).map(key => {
-        const val = obj[key];
-
-        if (val === undefined) {
-            return '';
-        }
-
-        if (val === null) {
-            return encode(key);
-        }
-
-        if (Array.isArray(val)) {
-            const result = [];
-            val.slice().forEach(val2 => {
-                if (val2 === undefined) {
-                    return;
-                }
-                if (val2 === null) {
-                    result.push(encode(key));
-                } else {
-                    result.push(encode(key) + '=' + encode(val2));
-                }
-            });
-            return result.join('&')
-        }
-
-        return encode(key) + '=' + encode(val);
-    }).filter(x => x.length > 0).join('&') : null;
-
-    return res ? `?${res}` : '';
-}
\ No newline at end of file
diff --git a/packages/wepy-web/src/helper/util.js b/packages/wepy-web/src/helper/util.js
deleted file mode 100644
index 947207be2..000000000
--- a/packages/wepy-web/src/helper/util.js
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-export const uuid = () => {
-    const random = () => {
-        return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);  
-    }
-    return (random() + random() + '-' + random() + '-' + random() + '-' + random() + '-' + random() + random() + random());
-}
-
-export const numberValidator = (min, max) =>{
-    return (v) => {
-        let valid = true, num = Number(v);
-        if (isNaN(num)) {
-            valid = false;
-        }
-        if (min !== undefined) {
-            valid = valid && num >= min;
-        }
-        if (max !== undefined) {
-            valid = valid && num <= max;
-        }
-        return valid;
-    };
-};
-
-export const stringToBoolean = () =>{
-    return (v) => {
-        if (typeof v === 'string' && (v === '0' || v === 'false'))
-            return false;
-        return !!v;
-    };
-};
-
-    /**
-     * Merge options from element
-     * @param  {Element} elem           Dom element
-     * @param  {Object} defaultOptions weapp component options
-     * @return {Object}                Merged options
-     */
-    
-export const merge = (elem, defaultOptions) =>{
-    let o = {};
-    for (let k in defaultOptions) {
-        let val = elem.getAttribute(k);
-        switch (defaultOptions[k].type) {
-            case Boolean:
-                val = !!val;
-                break;
-            case String:
-                val = !val ? '' : (typeof val === 'object' ? JSON.stringify(val, null, 2) : String(val));
-                break;
-            case Number:
-                let n = parseFloat(val);
-                val = isNaN(n) ? val : n;
-        }
-        o[k] = val ? val : defaultOptions[k].default;
-    }
-    return o;
-}
-export const wxCallback = (type, name, options, data) => {
-    if (typeof options[type] === 'function') {
-        setTimeout(() => {
-            if (name === 'login') {
-                options[type].call(window.wx, {errMsg: name + ':' + (type === 'fail' ? 'fail' : 'ok'), code: data.code, data: data});
-            } else if (name === 'scanCode') {
-                options[type].call(window.wx, {errMsg: name + ':' + (type === 'fail' ? 'fail' : 'ok'), result: data.result, charSet: 'utf-8', scanType: data.scanType});
-            } else {
-                options[type].call(window.wx, {errMsg: name + ':' + (type === 'fail' ? 'fail' : 'ok'), data: data});
-            }
-        }, 0);
-    }
-};
-export const wxSuccess = (name, options, data) => {
-    wxCallback('success', name, options, data);
-    wxCallback('complete', name, options, data);
-};
-export const wxFail = (name, options, data) => {
-    wxCallback('fail', name, options, data);
-    wxCallback('complete', name, options, data);
-}
\ No newline at end of file
diff --git a/packages/wepy-web/src/helper/word.js b/packages/wepy-web/src/helper/word.js
deleted file mode 100644
index d86f9bbe0..000000000
--- a/packages/wepy-web/src/helper/word.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-/**
- * Hyphenate a camelCase string.
- */
-const hyphenateRE = /([^-])([A-Z])/g;
-export const hyphenate = (str) => {
-    return str
-        .replace(hyphenateRE, '$1-$2')
-        .replace(hyphenateRE, '$1-$2')
-        .toLowerCase();
-};
-/**
- * Camelize a hyphen-delimited string.
- */
-const camelizeRE = /-(\w)/g;
-export const camelize  = (str) => {
-    return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : '');
-};
\ No newline at end of file
diff --git a/packages/wepy-web/src/mixin.js b/packages/wepy-web/src/mixin.js
deleted file mode 100644
index 33480d64e..000000000
--- a/packages/wepy-web/src/mixin.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-export default class {
-
-    data = {};
-
-    components = {};
-
-    methods = {};
-
-    events = {};
-
-    $init (parent) {
-        let k;
-
-        // 自定义属性覆盖
-        Object.getOwnPropertyNames(this)
-            .concat(Object.getOwnPropertyNames(Object.getPrototypeOf(this)))
-            .forEach((k) => {
-                if (k[0] + k[1] !== 'on' && k !== 'constructor') {
-                    if (!parent[k])
-                        parent[k] = this[k];
-                }
-        });
-
-
-        // 数据，事件，组件覆盖
-        ['data', 'events', 'components'].forEach((item) => {
-            Object.getOwnPropertyNames(this[item]).forEach((k) => {
-                if (k !== 'init' && !parent[item][k])
-                    parent[item][k] = this[item][k];
-            });
-        });
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy-web/src/native.js b/packages/wepy-web/src/native.js
deleted file mode 100644
index dbdb557d2..000000000
--- a/packages/wepy-web/src/native.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-export default {
-};
-
-
diff --git a/packages/wepy-web/src/page.js b/packages/wepy-web/src/page.js
deleted file mode 100644
index d52385cda..000000000
--- a/packages/wepy-web/src/page.js
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import native from './native';
-import component from './component';
-import util from './util';
-
-export default class extends component {
-
-    $isComponent = false;
-
-
-    $preloadData = {};
-
-    $prefetchData = {};
-
-    $init (wxpage, $parent) {
-
-        this.$parent = $parent;
-        this.$root = this;
-        if (!$parent.$wxapp) {
-            $parent.$wxapp = getApp();
-        }
-        this.$wxapp = $parent.$wxapp;
-        super.$init(wxpage, this);
-    }
-
-    onLoad () {
-        super.onLoad();
-    }
-
-    $preload(key, data) {
-        if (typeof(key) === 'object') {
-            let k;
-            for (k in key) {
-                this.$preload(k, key[k]);
-            }
-        } else {
-            this.$preloadData[key] = data;
-        }
-    }
-
-    $route(type, url, params = {}) {
-        if (typeof(url) === 'string') {
-            let s = url + '?';
-            if (params) {
-                let k;
-                for (k in params) {
-                    s += `${k}=${params[k]}&`
-                }
-            }
-            s = s.substring(0, s.length - 1);
-            url = {url: s};
-        } else {
-            params = util.$getParams(url.url);
-        }
-        let realPath = util.$resolvePath(this.$vm.$route.path, url.url.split('?')[0]);
-        let goTo = this.$parent.$pages[realPath];
-        if (goTo && goTo.onPrefetch) {
-            let prevPage = this.$parent.__prevPage__;
-            let preloadData = {};
-            if (prevPage && Object.keys(prevPage.$preloadData).length > 0) {
-                preloadData = prevPage.$preloadData;
-            }
-            goTo.$prefetchData = goTo.onPrefetch(params, {from: this, preload: preloadData});
-        }
-        return native[type](url);
-    }
-
-    $redirect(url, params) {
-        return this.$route('redirectTo', url, params);
-    }
-
-    $navigate(url, params) {
-        return this.$route('navigateTo', url, params);
-    }
-
-    $switch(url) {
-        if (typeof(url) === 'string')
-            url = {url: url};
-
-        return native.switchTab(url);
-    }
-
-    $back(delta) {
-        let p = delta || {};
-        if (typeof(p) === 'number')
-            p = {delta: p};
-
-        if (!p.delta)
-            p.delta = 1;
-
-        return native.navigateBack(p);
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy-web/src/platform/qq.js b/packages/wepy-web/src/platform/qq.js
deleted file mode 100644
index 7248cd413..000000000
--- a/packages/wepy-web/src/platform/qq.js
+++ /dev/null
@@ -1,99 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import cookie from '../helper/cookie';
-import { wxSuccess, wxFail } from '../helper/util';
-
-let wx = window.wx || {};
-
-/**
- * wx.login(OBJECT)
- * OBJECT参数说明：
- * 参数名 类型  必填  说明
- * success Function    否   接口调用成功的回调函数
- * fail    Function    否   接口调用失败的回调函数
- * complete    Function    否   接口调用结束的回调函数（调用成功、失败都会执行）
- * success返回参数说明：
- * 
- * 参数名 类型  说明
- * errMsg  String  调用结果
- * code    String  用户允许登录后，回调内容会带上 code（有效期五分钟），开发者需要将 code 发送到开发者服务器后台，使用code 换取 session_key api，将 code 换成 openid 和 session_key
- */
-wx.login = (options) => {
-    let cookies = cookie.all();
-    cookies.code = cookies.skey;
-    wxSuccess('login', options, cookies);
-};
-
-/**
- * wx.requestPayment(OBJECT)
- * Object参数说明：
- * 
- * 参数  类型  必填  说明
- * timeStamp   String  是   时间戳从1970年1月1日00:00:00至今的秒数,即当前的时间
- * nonceStr    String  是   随机字符串，长度为32个字符以下。
- * package String  是   统一下单接口返回的 prepay_id 参数值，提交格式如：prepay_id=*
- * signType    String  是   签名算法，暂支持 MD5
- * paySign String  是   签名,具体签名方案参见微信公众号支付帮助文档;
- * success Function    否   接口调用成功的回调函数
- * fail    Function    否   接口调用失败的回调函数
- * complete    Function    否   接口调用结束的回调函数（调用成功、失败都会执行）
- */
-wx.requestPayment = (params) => {
-    if (mqq && mqq.tenpay && mqq.tenpay.pay) {
-        mqq.tenpay.pay({
-            tokenId: params.token,
-            appInfo: params.appinfo,
-            pubAcc: params.pubAcc,
-            pubAccHint: params.pubAccHint
-        }, function(result) {
-            if (+result.resultCode === 0) {
-                wxSuccess('requestPayment', params, result);
-            } else {
-                wxFail('requestPayment', params, result);
-            }
-        });
-    }
-};
-
-/**
- * onShareAppMessage
- * 在 Page 中定义 onShareAppMessage 函数，设置该页面的转发信息。
- * 
- * 只有定义了此事件处理函数，右上角菜单才会显示 “转发” 按钮
- * 用户点击转发按钮的时候会调用
- * 此事件需要 return 一个 Object，用于自定义转发内容
- */
-wx.__initShare = (share) => {
-    if (mqq && mqq.ui && mqq.ui.setOnShareHandler) {
-        mqq.ui.setOnShareHandler(function(type){
-            mqq.ui.shareMessage({
-                title: share.title,
-                desc: share.desc,
-                share_type: type,
-                share_url: share.url,
-                image_url: share.img,
-                back: true
-            });
-        }, () => { });
-    }
-};
-
-wx.__hideShare = () => {
-
-};
-
-wx.__platform = 'qq';
-
-if (typeof window !== 'undefined') {
-    window.wx = wx;
-}
-
-export default wx;
\ No newline at end of file
diff --git a/packages/wepy-web/src/platform/wechat.js b/packages/wepy-web/src/platform/wechat.js
deleted file mode 100644
index c271b2561..000000000
--- a/packages/wepy-web/src/platform/wechat.js
+++ /dev/null
@@ -1,169 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import { wxSuccess, wxFail } from '../helper/util';
-import { resolveQuery } from '../helper/query';
-
-let wx = window.wx || {};
-
-
-let wxbak = wx;
-let k;
-let callList = [];
-
-for (k in wx) {
-    if (k !== 'config' && k !== 'ready') {
-        wx[k] = function () {
-            if (wx.__ready) {
-                wxbak[k].apply(wx, arguments);
-            } else {
-                callList.push([k, arguments]);
-            }
-        }
-    }
-}
-
-wx.ready(function () {
-    while (callList.length) {
-        let item = callList.shift();
-        wxbak[item[0]].apply(wx, item[1]);
-    }
-    wx.__ready = true;
-});
-
-/**
- * wx.login(OBJECT)
- * OBJECT参数说明：
- * 参数名 类型  必填  说明
- * success Function    否   接口调用成功的回调函数
- * fail    Function    否   接口调用失败的回调函数
- * complete    Function    否   接口调用结束的回调函数（调用成功、失败都会执行）
- * success返回参数说明：
- * 
- * 参数名 类型  说明
- * errMsg  String  调用结果
- * code    String  用户允许登录后，回调内容会带上 code（有效期五分钟），开发者需要将 code 发送到开发者服务器后台，使用code 换取 session_key api，将 code 换成 openid 和 session_key
- */
-wx.login = (options) => {
-    let code;
-    code = resolveQuery(window.location.search).code;
-    if (!code) {
-        code = resolveQuery(window.location.hash).code;
-    }
-    if (!code) {
-        code = resolveQuery(window.location.hash.substr(window.location.hash.indexOf('?'))).code;
-    }
-    if (code) {
-        wxSuccess('login', options, code);
-        return;
-    }
-    if (options.appId) {
-        let url = window.location.protocol + '//' + window.location.host + window.location.pathname,
-            state = options.state || 'qqchongzhi',
-            type = type || 'snsapi_base';
-
-        window.location = location.protocol + '//open.weixin.qq.com/connect/oauth2/authorize?appid=' + options.appId + 
-            '&redirect_uri=' + encodeURIComponent(url) + '&response_type=code&scope=' + type + '&state=' + state + '#wechat_redirect';
-    } else {
-        wxFail('login', options, '');
-    }
-};
-
-/**
- * wx.requestPayment(OBJECT)
- * Object参数说明：
- * 
- * 参数  类型  必填  说明
- * timeStamp   String  是   时间戳从1970年1月1日00:00:00至今的秒数,即当前的时间
- * nonceStr    String  是   随机字符串，长度为32个字符以下。
- * package String  是   统一下单接口返回的 prepay_id 参数值，提交格式如：prepay_id=*
- * signType    String  是   签名算法，暂支持 MD5
- * paySign String  是   签名,具体签名方案参见微信公众号支付帮助文档;
- * success Function    否   接口调用成功的回调函数
- * fail    Function    否   接口调用失败的回调函数
- * complete    Function    否   接口调用结束的回调函数（调用成功、失败都会执行）
- */
-wx.requestPayment = (params) => {
-    wx.chooseWXPay(params);
-};
-
-wx.scanCode = (params) => {
-    const QR_CODE = 'QR_CODE';
-    const EAN_13 = 'EAN_13';
-
-    wx.scanQRCode({
-        needResult: 0, // 默认为0，扫描结果由微信处理，1则直接返回扫描结果，
-        scanType: ['qrCode', 'barCode'], // 可以指定扫二维码还是一维码，默认二者都有
-        success (res) {
-            if (res.resultStr.includes(EAN_13)) {
-                wxSuccess('scanCode', params, {
-                    result: res.resultStr.replace(/EAN_13,/g, ''),
-                    scanType: EAN_13
-                });
-            } else {
-                wxSuccess('scanCode', params, {
-                    result: res.resultStr,
-                    scanType: QR_CODE
-                });
-            }
-        }
-    });
-};
-
-/**
- * onShareAppMessage
- * 在 Page 中定义 onShareAppMessage 函数，设置该页面的转发信息。
- * 
- * 只有定义了此事件处理函数，右上角菜单才会显示 “转发” 按钮
- * 用户点击转发按钮的时候会调用
- * 此事件需要 return 一个 Object，用于自定义转发内容
- */
-wx.__initShare = (share) => {
-    wx.onMenuShareTimeline({
-        title: share.title, // 分享标题
-        link: share.url, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
-        imgUrl: share.img // 分享图标
-    });
-    wx.onMenuShareAppMessage({
-        title: share.title, // 分享标题
-        desc: share.desc, // 分享描述
-        link: share.url, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
-        imgUrl: share.img // 分享图标
-    });
-
-    wx.onMenuShareQQ({
-        title: share.title, // 分享标题
-        desc: share.desc, // 分享描述
-        link: share.url, // 分享链接
-        imgUrl: share.img // 分享图标
-    });
-    wx.onMenuShareWeibo({
-        title: share.title, // 分享标题
-        desc: share.desc, // 分享描述
-        link: share.url, // 分享链接
-        imgUrl: share.img // 分享图标
-    });
-    wx.onMenuShareQZone({
-        title: share.title, // 分享标题
-        desc: share.desc, // 分享描述
-        link: share.url, // 分享链接
-        imgUrl: share.img // 分享图标
-    });
-};
-wx.__hideShare = () => {
-
-};
-wx.__platform = 'wechat';
-
-if (typeof window !== 'undefined') {
-    window.wx = wx;
-}
-
-export default wx;
diff --git a/packages/wepy-web/src/util.js b/packages/wepy-web/src/util.js
deleted file mode 100644
index fbae94b82..000000000
--- a/packages/wepy-web/src/util.js
+++ /dev/null
@@ -1,293 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-export default {
-    $isEmpty (obj) {
-        return Object.keys(obj).length === 0;
-    },
-
-    $isEqual (a, b, aStack, bStack) {
-        // Identical objects are equal. `0 === -0`, but they aren't identical.
-        // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
-        if (a === b) return a !== 0 || 1 / a === 1 / b;
-        // `NaN`s are equivalent, but non-reflexive.
-        if (a !== a) return b !== b;
-        // A strict comparison is necessary because `null == undefined`.
-        if (!a || !b) return a === b;
-        // Exhaust primitive checks
-        var type = typeof a;
-        if (type !== 'function' && type !== 'object' && typeof b !== 'object') return false;
-        return this.$isDeepEqual(a, b, aStack, bStack);
-    },
-
-    $isDeepEqual (a, b, aStack, bStack) {
-        let self = this;
-        // Compare `[[Class]]` names.
-        var className = toString.call(a);
-        if (className !== toString.call(b)) return false;
-        switch (className) {
-          // Strings, numbers, regular expressions, dates, and booleans are compared by value.
-          case '[object RegExp]':
-          // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
-          case '[object String]':
-            // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
-            // equivalent to `new String("5")`.
-            return '' + a === '' + b;
-          case '[object Number]':
-            // `NaN`s are equivalent, but non-reflexive.
-            // Object(NaN) is equivalent to NaN.
-            if (+a !== +a) return +b !== +b;
-            // An `egal` comparison is performed for other numeric values.
-            return +a === 0 ? 1 / +a === 1 / b : +a === +b;
-          case '[object Date]':
-          case '[object Boolean]':
-            // Coerce dates and booleans to numeric primitive values. Dates are compared by their
-            // millisecond representations. Note that invalid dates with millisecond representations
-            // of `NaN` are not equivalent.
-            return +a === +b;
-          case '[object Symbol]':
-            var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
-            return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
-        }
-
-        var areArrays = className === '[object Array]';
-        if (!areArrays) {
-          if (typeof a !== 'object' || typeof b !== 'object') return a === b;
-
-          // Objects with different constructors are not equivalent, but `Object`s or `Array`s
-          // from different frames are.
-          var aCtor = a.constructor, bCtor = b.constructor;
-          if (aCtor !== bCtor && !(typeof aCtor === 'function' && aCtor instanceof aCtor &&
-                                   typeof bCtor === 'function' && bCtor instanceof bCtor)
-                              && ('constructor' in a && 'constructor' in b)) {
-            return false;
-          }
-        }
-        // Assume equality for cyclic structures. The algorithm for detecting cyclic
-        // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
-
-        // Initializing stack of traversed objects.
-        // It's done here since we only need them for objects and arrays comparison.
-        aStack = aStack || [];
-        bStack = bStack || [];
-        var length = aStack.length;
-        while (length--) {
-          // Linear search. Performance is inversely proportional to the number of
-          // unique nested structures.
-          if (aStack[length] === a) return bStack[length] === b;
-        }
-
-        // Add the first object to the stack of traversed objects.
-        aStack.push(a);
-        bStack.push(b);
-
-        // Recursively compare objects and arrays.
-        if (areArrays) {
-          // Compare array lengths to determine if a deep comparison is necessary.
-          length = a.length;
-          if (length !== b.length) return false;
-          // Deep compare the contents, ignoring non-numeric properties.
-          while (length--) {
-            if (!self.$isEqual(a[length], b[length], aStack, bStack)) return false;
-          }
-        } else {
-          // Deep compare objects.
-          var keys = Object.keys(a), key;
-          length = keys.length;
-          // Ensure that both objects contain the same number of properties before comparing deep equality.
-          if (Object.keys(b).length !== length) return false;
-          while (length--) {
-            // Deep compare each member
-            key = keys[length];
-            if (!(self.$has(b, key) && self.$isEqual(a[key], b[key], aStack, bStack))) return false;
-          }
-        }
-        // Remove the first object from the stack of traversed objects.
-        aStack.pop();
-        bStack.pop();
-        return true;
-    },
-
-    $has (obj, path) {
-        if (toString.call(path) !== '[object Array]') {
-            return obj && hasOwnProperty.call(obj, path);
-        }
-        var length = path.length;
-        for (var i = 0; i < length; i++) {
-            var key = path[i];
-            if (!obj || !hasOwnProperty.call(obj, key)) {
-                return false;
-            }
-            obj = obj[key];
-        }
-        return !!length;
-    },
-
-    $extend () {
-        var options, name, src, copy, copyIsArray, clone,
-        target = arguments[ 0 ] || {},
-        i = 1,
-        length = arguments.length,
-        deep = false;
-        var self = this;
-
-        // Handle a deep copy situation
-        if ( typeof target === 'boolean' ) {
-            deep = target;
-
-            // Skip the boolean and the target
-            target = arguments[ i ] || {};
-            i++;
-        }
-
-        // Handle case when target is a string or something (possible in deep copy)
-        if ( typeof target !== 'object' && !(typeof(target) === 'function') ) {
-            target = {};
-        }
-
-        // Extend jQuery itself if only one argument is passed
-        if ( i === length ) {
-            target = this;
-            i--;
-        }
-
-        for ( ; i < length; i++ ) {
-
-            // Only deal with non-null/undefined values
-            if ( ( options = arguments[ i ] ) ) {
-
-                // Extend the base object
-                for ( name in options ) {
-                    src = target[ name ];
-                    copy = options[ name ];
-
-                    // Prevent never-ending loop
-                    if ( target === copy ) {
-                        continue;
-                    }
-
-                    // Recurse if we're merging plain objects or arrays
-                    if ( deep && copy && ( self.$isPlainObject( copy ) ||
-                        ( copyIsArray = Array.isArray( copy ) ) ) ) {
-
-                        if ( copyIsArray ) {
-                            copyIsArray = false;
-                            clone = src && Array.isArray( src ) ? src : [];
-
-                        } else {
-                            clone = src && self.$isPlainObject( src ) ? src : {};
-                        }
-
-                        // Never move original objects, clone them
-                        target[ name ] = self.$extend( deep, clone, copy );
-
-                    // Don't bring in undefined values => bring undefined values
-                    } else {
-                        target[ name ] = copy;
-                    }
-                }
-            }
-        }
-
-        // Return the modified object
-        return target;
-    },
-
-    $copy (obj, deep = false) {
-        if (Array.isArray(obj)) {
-            return this.$extend(deep, [], obj);
-        } else if ('' + obj === 'null') {
-            return obj;
-        } else if (typeof (obj) === 'object') {
-            return this.$extend(deep, {}, obj);
-        } else
-            return obj;
-    },
-
-    $isPlainObject (obj) {
-        var proto, Ctor;
-
-        // Detect obvious negatives
-        // Use toString instead of jQuery.type to catch host objects
-        if ( !obj || Object.prototype.toString.call( obj ) !== '[object Object]' ) {
-            return false;
-        }
-
-        proto = Object.getPrototypeOf( obj );
-
-        // Objects with no prototype (e.g., `Object.create( null )`) are plain
-        if ( !proto ) {
-            return true;
-        }
-
-        // Objects with prototype are plain iff they were constructed by a global Object function
-        Ctor = Object.prototype.hasOwnProperty.call( proto, 'constructor' ) && proto.constructor;
-        return typeof Ctor === 'function' && Object.prototype.hasOwnProperty.toString.call( Ctor ) === Object.prototype.hasOwnProperty.toString.call(Object);
-    },
-
-    /**
-     * resolve path
-     * @param  {[string]} route ['/page/index']
-     * @param  {[string]} url   ['./page2']
-     * @return {[string]}       ['/page/page2']
-     */
-    $resolvePath (route, url) {
-        if (!url)
-            return route;
-        if (url[0] === '/') { // /index
-            url = url.substr(1);
-            return this.$resolvePath('', url);
-        }
-        if (url[0] !== '.') { // index
-            return this.$resolvePath(route, './' + url);
-        }
-        let current = route.split('/');
-        if (url[0] === '.' && url[1] === '/') { // ./index
-            url = url.substr(2);
-            if (url[0] !== '.') {
-                if (current.length)
-                    current[current.length - 1] = url;
-                else
-                    current = [url];
-                return current.length === 1 ? ('/' + current[0]) : current.join('/');
-            }
-            return this.$resolvePath(current.join('/'), url);
-        }
-        if (url[0] === '.' && url[1] === '.' && url[2] === '/') { // ../index || ....../index || ../../../index
-            url = url.replace(/^\.*/ig, '');
-            current.pop();
-            return this.$resolvePath(current.join('/'), '.' + url);
-        }
-        if (url[0] === '.') {
-            return this.$resolvePath(route, url.substr(1));
-        }
-    },
-    /**
-     * get url params
-     * @param  {String} url index?a=1&b=2
-     * @return {Object}     {a:1,b:2}
-     */
-    $getParams (url) {
-        let rst = {};
-        let quoteIndex = url.indexOf('?');
-
-        if (quoteIndex !== -1) {
-            let str = url.substr(quoteIndex + 1);
-            let tmp;
-            str.split('&').forEach(v => {
-                tmp = v.split('=');
-                rst[tmp[0]] = decodeURIComponent(tmp[1]);
-            });
-       }
-       return rst;
-    }
-};
-
-
diff --git a/packages/wepy-web/src/wepy.js b/packages/wepy-web/src/wepy.js
deleted file mode 100644
index 32385efaf..000000000
--- a/packages/wepy-web/src/wepy.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import app from './app';
-import page from './page';
-import component from './component';
-import event from './event';
-import base from './base';
-import util from './util';
-import mixin from './mixin';
-
-// wx polyfill
-import wx from './wx';
-
-export default {
-    env: 'web',
-    event: event,
-    app: app,
-    component: component,
-    page: page,
-    mixin: mixin,
-
-    $createApp: base.$createApp,
-    $createPage: base.$createPage,
-
-    $isEmpty: util.$isEmpty,
-    $isEqual: util.$isEqual,
-    $isDeepEqual: util.$isDeepEqual,
-    $has: util.$has,
-    $extend: util.$extend,
-    $isPlainObject: util.$isPlainObject,
-    $copy: util.$copy,
-};
diff --git a/packages/wepy-web/src/wx.js b/packages/wepy-web/src/wx.js
deleted file mode 100644
index da2e35dc6..000000000
--- a/packages/wepy-web/src/wx.js
+++ /dev/null
@@ -1,289 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import Vue from 'vue';
-import axios from 'axios';
-import {resolveQuery} from './helper/query';
-import {browser, system} from './helper/device';
-
-const callback = (type, o, name, data) => {
-    if (typeof o[type] === 'function') {
-        setTimeout(() => {
-            if (name === 'login') {
-                o[type].call(wx, {errMsg: name + ':' + (type === 'fail' ? 'fail' : 'ok'), code: data.code, data: data});
-            } else if (name === 'getSystemInfo') {
-                o[type].call(wx, data);
-            } else {
-                o[type].call(wx, {errMsg: name + ':' + (type === 'fail' ? 'fail' : 'ok'), data: data});
-            }
-        }, 0);
-    }
-}
-
-
-let wx = window.wx || {};
-
-wx.login = wx.login || function login (o) {
-    console.error('wx.login is only implemented in browser');
-};
-
-/*** Storage ***/
-wx.getStorageSync = wx.getStorageSync || function getStorageSync (v) {
-    let rst = window.localStorage.getItem(v);
-    try {
-            rst = JSON.parse(rst);
-    } catch (e) {
-    }
-    return rst;
-};
-wx.getStorage = wx.getStorage || function getStorage (o) {
-    let rst = wx.getStorageSync(o.key);
-    callback('success', o, 'getStorage', rst);
-    callback('complete', o, 'getStorage', rst);
-};
-wx.setStorageSync = wx.setStorageSync || function setStorageSync (k, d) {
-    if (typeof d !== 'string') {
-        d = JSON.stringify(d);
-    }
-    window.localStorage.setItem(k, d);
-};
-wx.setStorage = wx.setStorage || function setStorage (o) {
-    let rst;
-    try {
-        rst = this.setStorageSync(o.key, o.data);
-        callback('success', o, 'getStorage', rst);
-    } catch (e) {
-        callback('fail', o, 'getStorage', rst);
-    }
-    callback('complete', o, 'getStorage', rst);
-};
-wx.getStorageInfoSync = wx.getStorageInfoSync || function getStorageInfoSync () {
-    let MAX_SIZE = 5 * 1024;
-    let keys = Object.keys(window.localStorage);
-    return {
-        currentSize: 1,
-        keys: keys,
-        limitSize: MAX_SIZE
-    };
-};
-wx.getStorageInfo = wx.getStorageInfo || function getStorageInfo (o) {
-    let rst = this.getStorageInfoSync();
-    callback('success', o, 'getStorageInfo', rst);
-    callback('complete', o, 'getStorageInfo', rst);
-};
-wx.removeStorageSync = wx.removeStorageSync || function removeStorageSync (k) {
-    window.localStorage.removeItem(k);
-};
-wx.removeStorage = wx.removeStorage || function removeStorage (o) {
-    let rst;
-    try {
-        rst = this.removeStorage(o.key);
-        callback('success', o, 'getStorage', rst);
-    } catch (e) {
-        callback('fail', o, 'getStorage', rst);
-    }
-    callback('complete', o, 'getStorage', rst);
-};
-wx.clearStorageSync = wx.clearStorageSync || function clearStorageSync () {
-    window.localStorage.clear();
-};
-wx.clearStorage = wx.clearStorage || function clearStorage () {
-    let rst;
-    try {
-        rst = this.clearStorage();
-    } catch (e) {
-    }
-};
-
-    /***** Navigate ******/
-wx.navigateTo = wx.navigateTo || function navigateTo (o) {
-    window.$router.go(o.url);
-};
-wx.redirectTo = wx.redirectTo || function redirectTo (o) {
-    window.$router.go(o.url);
-};
-wx.switchTab = wx.switchTab || function switchTab (o) {
-    window.$router.go(o.url);
-};
-wx.navigateBack = wx.navigateBack || function navigateBack (o) {
-    if (!o) {
-        o = {};
-    }
-    if (o.delta)
-        o.delta = -1;
-    window.$router.go(o.delta);
-};
-
-    /***** System ******/
-wx.getSystemInfoSync = wx.getSystemInfoSync || function getSystemInfoSync () {
-    return {
-        SDKVersion: '0.0.0',
-        language: '-',
-        model: browser(),
-        pixelRatio: 0,
-        platform: system(),
-        screenHeight: window.screen.height,
-        screenWidth: window.screen.width,
-        system: system(),
-        version: '0.0.0',
-        windowHeight: window.innerHeight,
-        windowWidth: window.innerWidth
-    }
-};
-wx.getSystemInfo = wx.getSystemInfo || function getSystemInfo (o) {
-    let rst = this.getSystemInfoSync();
-    callback('success', o, 'getSystemInfo', rst);
-    callback('complete', o, 'getSystemInfo', rst);
-};
-wx.canIUse = wx.canIUse || function canIUse () {
-    return true;
-};
-
-    /****** Network ***********/
-wx.getNetworkType = wx.getNetworkType || function getNetworkType () {
-    return 'unkown';
-};
-
-    /****** NavigationBar *******/
-wx.setNavigationBarTitle = wx.setNavigationBarTitle || function setNavigationBarTitle (o) {
-    document.title = o.title;
-    callback('success', o, 'setNavigationBarTitle', null);
-    callback('complete', o, 'setNavigationBarTitle', null);
-};
-
-wx.makePhoneCall = wx.makePhoneCall || function makePhoneCall (o) {
-    window.location = 'tel:' + o.phoneNumber;
-    callback('success', o, 'makePhoneCall', null);
-    callback('complete', o, 'makePhoneCall', null);
-};
-
-wx.hideKeyboard = wx.hideKeyboard || function hideKeyboard () {
-    // http://stackoverflow.com/questions/8335834/how-can-i-hide-the-android-keyboard-using-javascript
-    setTimeout(() => {
-        let field = document.createElement('input');
-        field.setAttribute('type', 'text');
-        field.setAttribute('style', 'position:absolute; top: 0px; opacity: 0; -webkit-user-modify: read-write-plaintext-only; left:0px;');
-        document.body.appendChild(field);
-
-        field.onfocus = () => {
-            setTimeout(() => {
-                field.setAttribute('style', 'display:none;');
-                setTimeout(() => {
-                    document.body.removeChild(field);
-                    document.body.focus();
-                }, 14);
-
-            }, 200);
-        };
-        field.focus();
-    }, 50);
-};
-
-['getUserInfo', 'switchTab', 'showNavigationBarLoading', 'hideNavigationBarLoading', 'createAnimation', 'requestPayment', 'chooseImage', 'showModal', 'showToast', 'showActionSheet'].forEach(k => {
-    if (!wx[k]) {
-        wx[k] = (o = {}) => {
-            console.error(`wx.${k} is not supported in browser or you did add it in config.`);
-            callback('fail', o, k, null);
-            callback('complete', o, k, null);
-        };
-    }
-});
-
-wx.request = wx.request ? wx.request : function request (options) {
-    let handlers = {};
-    ['success', 'fail', 'complete', 'beforeAll', 'beforeSuccess', 'afterSuccess', 'beforeCancel', 'cancel', 'afterCancel', 'beforeFail', 'afterFail', 'afterAll'].forEach(k => {
-            handlers[k] = options[k];
-            delete options[k];
-    });
-    let rst = {errMsg: 'request', statusCode: 0, data: undefined};
-    if (!options.method || options.method.toLowerCase() === 'get') {
-        options.params = options.data;
-        delete options.data;
-    }
-    axios(options).then(res => {
-        rst.errMsg = rst.errMsg + ':ok';
-        rst.statusCode = res.status;
-        rst.data = res.data;
-
-        // WAService.js
-        if (typeof handlers.beforeAll === 'function') {
-                handlers.beforeAll(res);
-        }
-        if (typeof handlers.beforeSuccess === 'function') {
-                handlers.beforeSuccess(res);
-        }
-        if (typeof handlers.success === 'function') {
-                handlers.success(res);
-        }
-        if (typeof handlers.afterSuccess === 'function') {
-                handlers.afterSuccess(res);
-        }
-        if (typeof handlers.complete === 'function') {
-                handlers.complete(res);
-        }
-        if (typeof handlers.afterAll === 'function') {
-                handlers.afterAll(res);
-        }
-    }).catch(res => {
-        if (typeof handlers.beforeAll === 'function') {
-                handlers.beforeAll(res);
-        }
-        if (axios.isCancel(res)) {
-            rst.errMsg = rst.errMsg + ':cancel';
-            if (typeof handlers.fail === 'function') {
-                    handlers.fail(res);
-            }
-            if (typeof handlers.beforeCancel === 'function') {
-                    handlers.beforeCancel(res);
-            }
-            if (typeof handlers.cancel === 'function') {
-                    handlers.cancel(res);
-            }
-            if (typeof handlers.afterCancel === 'function') {
-                    handlers.afterCancel(res);
-            }
-        } else {
-            rst.errMsg = rst.errMsg + ':fail';
-            if (typeof handlers.beforeFail === 'function') {
-                    handlers.beforeFail(res);
-            }
-            if (typeof handlers.fail === 'function') {
-                    handlers.fail(res);
-            }
-            if (typeof handlers.afterFail === 'function') {
-                    handlers.afterFail(res);
-            }
-        }
-        rst.data = res;
-        if (typeof handlers.complete === 'function') {
-                handlers.complete(res);
-        }
-        if (typeof handlers.afterAll === 'function') {
-                handlers.afterAll(res);
-        }
-    })
-};
-
-if (typeof window !== 'undefined') {
-    window.getApp = () => {
-        return Vue;
-    };
-
-    window.getCurrentPages = () => {
-        if (wx._currentPage)
-            return [wx._currentPage];
-        else 
-            return [wx._currentPages[0]];
-    };
-}
-
-window.wx = wx;
-
-export default wx;
\ No newline at end of file
diff --git a/packages/wepy/.npmignore b/packages/wepy/.npmignore
deleted file mode 100644
index a25615e13..000000000
--- a/packages/wepy/.npmignore
+++ /dev/null
@@ -1,10 +0,0 @@
-node_modules/
-coverage/
-demo/
-test/
-ISSUE_TEMPLATE.md
-appveyor.yml
-README_zh-CN.md
-*.map
-src/
-coverage
\ No newline at end of file
diff --git a/packages/wepy/README.md b/packages/wepy/README.md
deleted file mode 100644
index 56aacbb28..000000000
--- a/packages/wepy/README.md
+++ /dev/null
@@ -1,787 +0,0 @@
-# 小程序框架wepy文档
-
-[![npm version](https://badge.fury.io/js/wepy.svg)](https://badge.fury.io/js/wepy)
-[![travis-ci](https://travis-ci.org/wepyjs/wepy.svg?branch=master)](https://travis-ci.org/wepyjs/wepy)
-[![Coverage Status](https://coveralls.io/repos/github/wepyjs/wepy/badge.svg?branch=master)](https://coveralls.io/github/wepyjs/wepy?branch=master)
-[![Dependency Status](https://david-dm.org/wepyjs/wepy.svg)](https://david-dm.org/wepyjs/wepy)
-
-
-![wepy_group](https://cloud.githubusercontent.com/assets/2182004/21045917/35ffc6ac-be3d-11e6-8387-d8eb3f737b71.jpg)
-
-扫码加入wepyjs体验交流群。
-
-[点此查看CHANGELOG](https://github.com/wepyjs/wepy/blob/master/CHANGELOG.md)
-
-## 快速入门
-
-### 项目创建与使用
-
-#### 安装wepy
-以下安装都通过`npm`安装
-
-安装 wepy 命令行工具。
- 
-```bash
-npm install wepy-cli -g
-```
-
-在开发目录生成开发DEMO。
- 
-```bash
-wepy new myproject
-```
-
-切换至项目目录。
-
-```bash
-cd myproject
-```
-
-开发实时编译。
-
-```bash
-wepy build --watch
-```
-#### 项目目录结构
-```
-    dist
-    node_modules
-    src
-        components
-            com_a.wpy
-            com_b.wpy
-        pages
-            index.wpy
-            page2.wpy
-        app.wpy
-    package.json
-```
-
-#### 开发使用说明
-1. 使用`微信开发者工具`新建项目，本地开发选择`dist`目录。
-2. `微信开发者工具` --> 项目 --> 关闭ES6转ES5。
-3. 本地项目根目录运行`wepy build --watch`，开启实时编译。
-
-
-###代码规范：
-1. 变量与方法使用尽量使用驼峰式命名，避免使用`$`开头。
-以`$`开头的方法或者属性为框架内建方法或者属性，可以被使用，使用前请[参考API文档](#api)。
-2. 入口，页面，组件的命名后缀为`.wpy`。外链的文件可以是其它后缀。
-请参考[wpy文件说明](#wpy文件说明)
-3. 使用ES6语法开发。
-框架在ES6下开发，因此也需要使用ES6开发小程序，ES6中有大量的语法糖可以让我们的代码更加简洁高效。
-4. 使用Promise
-框架默认对小程序提供的API全都进行了 Promise 处理，甚至可以直接使用`async/await`等新特性进行开发。
-
-
-## 主要解决问题：
-### 1. 开发模式转换
-在原有的小程序的开发模式下进行再次封装，更贴近于现有MVVM框架开发模式。框架在开发过程中参考了一些现在框架的一些特性，并且融入其中，以下是使用wepy前后的代码对比图。
-
-官方DEMO代码：
-```javascript
-//index.js
-//获取应用实例
-var app = getApp()
-Page({
-  data: {
-    motto: 'Hello World',
-    userInfo: {}
-  },
-  //事件处理函数
-  bindViewTap: function() {
-    console.log('button clicked')
-  },
-  onLoad: function () {
-    console.log('onLoad')
-  }
-})
-```
-
-基于wepy的实现：
-```javascript
-import wepy from 'wepy';
-
-export default class Index extends wepy.page {
-
-    data = {
-        motto: 'Hello World',
-        userInfo: {}
-    };
-    methods = {
-        bindViewTap () {
-            console.log('button clicked');
-        }
-    };
-    onLoad() {
-        console.log('onLoad');
-    };
-}
-```
-### 2. 支持组件化开发。
-
-参见章节：[组件](#组件)
-示例代码：
-```html
-// index.wpy
-<template>
-    <view>
-        <component id="pannel" path="pannel"></component>
-        <component id="counter1" path="counter"></component>
-        <component id="counter2" path="counter"></component>
-        <component id="list" path="list"></component>
-    </view>
-</template>
-<script>
-import wepy from 'wepy';
-import List from '../components/list';
-import Panel from '../components/panel';
-import Counter from '../components/counter';
-
-export default class Index extends wepy.page {
-
-    config = {
-        "navigationBarTitleText": "test"
-    };
-    components = {
-        panel: Panel,
-        counter1: Counter,
-        counter2: Counter,
-        list: List
-    };
-}
-</script>
-```
-
-### 3. 支持加载外部NPM包。
-
-在编译过程当中，会递归遍历代码中的`require`然后将对应依赖文件从node_modules当中拷贝出来，并且修改`require`为相对路径，从而实现对外部NPM包的支持。如下图：
-
-![npm](https://cloud.githubusercontent.com/assets/2182004/20554645/482b0f64-b198-11e6-8d4e-70c92326004f.png)
-
-### 4. 单文件模式，使得目录结构更加清晰。
-
-[官方目录结构](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/structure.html?t=20161107)要求app必须有三个文件`app.json`，`app.js`，`app.wxss`，页面有4个文件 `index.json`，`index.js`，`index.wxml`，`index.wxss`。而且文件必须同名。
-所以使用wepy开发前后开发目录对比如下：
-官方DEMO：
-```
-project
-    pages
-        index
-            index.json
-            index.js
-            index.wxml
-            index.wxss
-        log
-            log.json
-            log.wxml
-            log.js
-            log.wxss
-    app.js
-    app.json
-    app.wxss
-```
-使用wepy框架后目录结构：
-```
-project
-    src
-        pages
-            index.wpy
-            log.wpy
-        app.wpy
-```
-
-### 5. 默认使用babel编译，支持ES6/7的一些新特性。
-
-用户可以通过修改`wepy.config.js`(老版本使用`.wepyrc`)配置文件，配置自己熟悉的babel环境进行开发。默认开启使用了一些新的特性如`promise`，`async/await`等等。
-
-示例代码：
-```javascript
-import wepy from 'wepy';
-
-export default class Index extends wepy.page {
-
-    getData() {
-        return new Promise((resolve, reject) => {
-            setTimeout(() => {
-                resolve({data: 123});
-            }, 3000);
-        });
-    };
-    async onLoad() {
-        let data = await this.getData();
-        console.log(data.data);
-    };
-}
-```
-### 6. 针对原生API进行优化。
-
-对现在API进行promise处理，同时修复一些现有API的缺陷，比如：wx.request并发问题等。
-原有代码：
-```javascript
-onLoad = function () {
-    var self = this;
-    wx.login({
-        success: function (data) {
-            wx.getUserInfo({
-                success: function (userinfo) {
-                    self.setData({userInfo: userinfo});
-                }
-            });
-        }
-    });
-}
-```
-基于wepy实现代码：
-```javascript
-async onLoad() {
-    await wx.login();
-    this.userInfo = await wx.getUserInfo();
-}
-```
-
-在同时并发10个request请求测试时：
-不使用wepy:
-
-![2 small](https://cloud.githubusercontent.com/assets/2182004/20554651/5185f740-b198-11e6-88f8-45e359090dc3.png)
-![3 small](https://cloud.githubusercontent.com/assets/2182004/20554886/c30e802a-b199-11e6-927d-08cd4e5ed0b0.png)
-
-使用wepy后：
-
-![4 small](https://cloud.githubusercontent.com/assets/2182004/20554663/65704c2e-b198-11e6-8277-abb77e0c7b3e.png)
-
-
-
-## 进阶说明
-
-### wepy.config.js 配置文件说明
-执行`wepy new demo`后，会生成类似配置文件。
-```javascript
-let prod = process.env.NODE_ENV === 'production';
-
-module.exports = {
-  "wpyExt": ".wpy",
-  "babel": {
-    "presets": [
-      "es2015",
-      "stage-1"
-    ],
-    "plugins": [
-      "transform-export-extensions",
-      "syntax-export-extensions",
-      "transform-runtime"
-    ]
-  }
-};
-
-
-if (prod) {
-  // 压缩sass
-  module.exports['sass'] = {"outputStyle": "compressed"};
-  
-  // 压缩less
-  module.exports['less'] = {"compress": true};
-
-  // 压缩js
-  module.exports.plugins = {
-      'UglifyJsPlugin': {
-          filter: /\.js$/,
-          config: {
-              compress: {
-                warning: false
-              }
-          }
-      },
-      'TestPlugin': {
-          filter: /\.wxml$/,
-          config: {
-          }
-      }
-  };
-}
-
-```
-
-**wpyExt：**缺省值为'.wpy'，IDE默认情况下不会对此文件类型高亮，此时可以修改所有文件为`.vue`后缀(因为与vue高亮规则一样)，然后将此选项修改为`.vue`，就能解决部分IDE代码高亮问题。
-
-**sass：**sass编译配置，参见[这里](https://github.com/sass/node-sass)。
-
-**less：**less编译配置，参见[这里](http://lesscss.org/#using-less-usage-in-code)。
-
-**babel：**babel编译配置，参见[这里](http://babeljs.io/docs/usage/options/)。
-
-**plugins：** plugins为`1.1.6`版本之后功能，目前支持js压缩与图片压缩，持续开发...
-
-
-### wpy文件说明
-`wpy`文件的编译过程过下：
-
-![5 small](https://cloud.githubusercontent.com/assets/2182004/20554671/70a797a0-b198-11e6-8355-b7c234713d0c.png)
-
-一个`.wpy`文件分为三个部分：
-
-1. 样式`<style></style>`对应原有`wxss`。
-2. 模板`<template></template>`对应原有`wxml`。
-3. 代码`<script></script>`对应原有`js`。
-
-其中入口文件`app.wpy`不需要`template`，所以编译时会被忽略。这三个标签都支持`type`和`src`属性，`type`决定了其代码编译过程，`src`决定是否外联代码，存在`src`属性且有效时，忽略内联代码，示例如下：
-```
-<style type="less" src="page1.less"></style>
-<template type="wxml" src="page1.wxml"></template>
-<script>
-    // some code
-</script>
-```
-标签对应 `type` 值如下表所示：
-
-| 标签 | type默认值 | type支持值 |
-| ---- | ---- | ---- |
-|style|`css`|`css`，`less`，`sass（待完成）`|
-|template|`wxml`|`wxml`，`xml`，`html（待完成）`|
-|script|`js`|`js`，`TypeScript(待完成)`|
-
-### script说明
-
-#### 程序入口app.wpy
-```
-<style type="less">
-/** less **/
-</style>
-<script>
-import wepy from 'wepy';
-export default class extends wepy.app {
-    config = {
-            "pages":[
-            "pages/index/index"
-        ],
-        "window":{
-            "backgroundTextStyle": "light",
-            "navigationBarBackgroundColor": "#fff",
-            "navigationBarTitleText": "WeChat",
-            "navigationBarTextStyle": "black"
-        }
-    };
-    onLaunch() {
-        console.log(this);
-    }
-}
-</script>
-```
-入口`app.wpy`继承自`wepy.app`，包含一个`config`属性和其全局属性、方法、事件。其中`config`属性对应原有的`app.json`，编译时会根据`config`生成`app.json`文件，如果需要修改`config`中的内容，请使用系统提供API。
-
-#### 页面index.wpy
-```
-<style type="less">
-/** less **/
-</style>
-<template type="wxml">
-    <view>
-    </view>
-    <component id="counter1" path="counter"></component>
-</template>
-<script>
-import wepy form 'wepy';
-import Counter from '../components/counter';
-export default class Index extends wepy.page {
-
-    config = {};
-    components = {counter1: Counter};
-
-    data = {};
-    methods = {};
-
-    events = {};
-    onLoad() {};
-    // Other properties
-}
-</script>
-```
-页面入口继承自`wepy.page`，主要属性说明如下：
-
-| 属性 | 说明 |
-| ---- | ---- |
-|config|页面config，相当于原来的index.json，同`app.wpy`中的config|
-|components|页面引入的组件列表|
-|data|页面需要渲染的数据|
-|methods|wmxl的事件捕捉，如`bindtap`，`bindchange`|
-|events|组件之间通过`broadcast`，`emit`传递的事件|
-|其它|如`onLoad`，`onReady`等小程序事件以及其它自定义方法与属性|
-
-#### 组件com.wpy
-```
-<style type="less">
-/** less **/
-</style>
-<template type="wxml">
-    <view>  </view>
-</template>
-<script>
-import wepy form 'wepy';
-export default class Com extends wepy.component {
-
-    components = {};
-
-    data = {};
-    methods = {};
-
-    events = {};
-    // Other properties
-}
-</script>
-```
-页面入口继承自`wepy.component`，属性与页面属性一样，除了不需要`config`以及页面特有的一些小程序事件等等。
-
-### 组件
-小程序支持js[模块化](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/app-service/module.html?t=20161107)引用，也支持[wxml模板](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/template.html?t=20161107)，但彼此独立，业务代码与交互事件仍需在页面处理。无法实现组件化的松耦合与复用的效果。
-例如模板A中绑定一个`bindtap="myclick"`，模板B中同样绑定一样`bindtap="myclick"`，那么就会影响同一个页面事件。对于数据同样如此。因此只有通过改变变量或者事件方法，或者给其加不同前缀才能实现绑定不同事件或者不同数据。当页面复杂之后就十分不利于开发维护。
-因此wepy让小程序支持组件化开发，组件的所有业务与功能在组件本身实现，组件与组件之间彼此隔离，上述例子在wepy的组件化开发过程中，A组件只会影响到A绑定的`myclick`，B也如此。
-
-#### 组件引用
-当页面或者组件需要引入子组件时，需要在页面或者`script`中的`components`给组件分配唯一id，并且在`template`中添加`<component>`标签，如[index.wpy](页面index.wpy)。
-
-页面和组件都可以引入子组件，引入若干组件后，如下图：
-
-![6 small](https://cloud.githubusercontent.com/assets/2182004/20554681/796da1ae-b198-11e6-91ab-e90f485c594d.png)
-
-Index页面引入A，B，C三个组件，同时组件A和B又有自己的子组件D，E，F，G，H。
-
-#### 组件通信与交互
-`wepy.component`基类提供三个方法`$broadcast`，`$emit`，`$invoke`，因此任一页面或任一组件都可以调用上述三种方法实现通信与交互，如：
-```
-$this.$emit('some-event', 1, 2, 3, 4);
-```
-
-组件的事件监听需要写在`events`属性下，如：
-```javascript
-import wepy form 'wepy';
-export default class Com extends wepy.component {
-
-    components = {};
-
-    data = {};
-    methods = {};
-
-    events = {
-        'some-event': ($event, ...args) {
-               console.log(`${this.name} receive ${$event.name} from ${$event.source.name}`);
-        }
-    };
-    // Other properties
-}
-```
-1. **$broadcast**
-`$broadcast`事件是由父组件发起，所有子组件都会收到此广播事件，除非事件被手动取消。事件广播的顺序为广度优先搜索顺序，如上图，如果`Page_Index`发起一个`$broadcast`事件，那么接收到事件的先后顺序为：A, B, C, D, E, F, G, H。如下图：
-
-![7 small](https://cloud.githubusercontent.com/assets/2182004/20554688/800089e6-b198-11e6-84c5-352d2d0e2f7e.png)
-
-
-2. **$emit**
-`$emit`与`$broadcast`正好相反，事件发起组件的父组件会依次接收到`$emit`事件，如上图，如果E发起一个`$emit`事件，那么接收到事件的先后顺序为：A, Page_Index。如下图：
-
-![8 small](https://cloud.githubusercontent.com/assets/2182004/20554704/9997932c-b198-11e6-9840-3edae2194f47.png)
-
-
-3. **$invoke**
-`$invoke`是一个组件对另一个组件的直接调用，通过传入的组件路径找到相应组件，然后再调用其方法。
-如果想在`Page_Index`中调用组件A的某个方法：
-```
-this.$invoke('ComA', 'someMethod', 'someArgs');
-```
-如果想在组件A中调用组件G的某个方法：
-```
-this.$invoke('./../ComB/ComG', 'someMethod', 'someArgs');
-```
-
-
-### 第三方组件
-
-wepyjs 允许使用基于wepyjs开发的第三方组件，开发第三方组件规范请参考[wepy-com-toast](https://github.com/wepyjs/wepy-com-toast)。
-
-
-### 混合
-
-混合可以将组之间的可复用部分抽离，从而在组件中使用混合时，可以将混合的数据，事件以及方法注入到组件之中。混合分分为两种：
-
-* 默认式混合
-* 兼容式混合
-
-#### 默认式混合
-
-对于组件`data`数据，`components`组件，`events`事件以及其它自定义方法采用**默认式混合**，即如果组件未声明该数据，组件，事件，自定义方法等，那么将混合对象中的选项将注入组件这中。对于组件已声明的选项将不受影响。
-```
-// mixins/test.js
-import wepy from 'wepy';
-
-export default class TestMixin extends wepy.page {
-    data = {
-        foo: 'foo defined by page',
-        bar: 'bar defined by testMix'
-    };
-    methods: {
-    tap () {
-      console.log('mix tap');
-    }
-  }
-}
-
-// pages/index.wpy
-import wepy from 'wepy';
-import TestMixin from './mixins/test';
-
-export default class Index extends wepy.mixin {
-    data = {
-        foo: 'foo defined by index'
-    };
-    mixins = [TestMixin ];
-    onShow() {
-    console.log(this.foo); // foo defined by index.
-    console.log(this.bar); // foo defined by testMix.
-  }
-}
-```
-
-
-#### 兼容式混合
-
-对于组件`methods`响应事件，以及小程序页面事件将采用**兼容式混合**，即先响应组件本身响应事件，然后再响应混合对象中响应事件。
-
-```
-// mixins/test.js
-import wepy from 'wepy';
-
-export default class TestMixin extends wepy.page {
-    methods = {
-    tap () {
-      console.log('mix tap');
-    }
-  };
-    onShow() {
-    console.log('mix onshow');
-  }
-}
-
-// pages/index.wpy
-import wepy from 'wepy';
-import TestMixin from './mixins/test';
-
-export default class Index extends wepy.mixin {
-
-    mixins = [TestMixin];
-    methods = {
-    tap () {
-      console.log('index tap');
-    }
-  };
-    onShow() {
-    console.log('index onshow');
-  }
-}
-
-
-// index onshow
-// mix onshow
-// ----- when tap
-// index tap
-// mix tap
-```
-
-### 数据绑定
-
-#### 小程序数据绑定方式
-小程序通过`Page`提供的`setData`方法去绑定数据，如：
-```
-this.setData({title: 'this is title'});
-```
-因为小程序架构本身原因，页面渲染层和JS逻辑层分开的，setData操作实际就是JS逻辑层与页面渲染层之间的通信，那么如果在同一次运行周期内多次执行`setData`操作时，那么通信的次数是一次还是多次呢？这个取决于API本身的设计。
-
-#### wepy数据绑定方式
-wepy使用脏数据检查对setData进行封装，在函数运行周期结束时执行脏数据检查，一来可以不用关心页面多次setData是否会有性能上的问题，二来可以更加简洁去修改数据实现绑定，不用重复去写setData方法。代码如下：
-```javascript
-this.title = 'this is title';
-```
-但需注意，在函数运行周期之外的函数里去修改数据需要手动调用`$apply`方法。如：
-```javascript
-setTimeout(() => {
-    this.title = 'this is title';
-    this.$apply();
-}, 3000);
-```
-
-#### wepy脏数据检查流程
-在执行脏数据检查是，会通过`this.$$phase`标识当前检查状态，并且会保证在并发的流程当中，只会有一个脏数据检查流程在运行，以下是执行脏数据检查的流程图：
-
-![9 small](https://cloud.githubusercontent.com/assets/2182004/20554709/a0d8b1e8-b198-11e6-9034-0997b33bdf95.png)
-
-### 其它优化细节
-
-#### 1. wx.request 接收参数修改
-点这里查看[官方文档](https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html?t=20161122)
-```javascript
-// 官方
-wx.request({
-    url: 'xxx',
-    success: function (data) {
-        console.log(data);
-    }
-});
-
-// wepy 使用方式
-// request 接口从只接收Object变为可接收String
-wx.request('xxxx').then((d) => console.log(d));
-```
-
-#### 2. 优化事件参数传递
-点这里查看[官方文档](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/event.html?t=20161122)
-```javascript
-// 官方
-<view data-id="{{index}}" data-title="wepy" data-other="otherparams" bindtap="tapName"> Click me! </view>
-Page({
-  tapName: function(event) {
-    console.log(event.currentTarget.dataset.id)// output: 1
-    console.log(event.currentTarget.dataset.title)// output: wepy
-    console.log(event.currentTarget.dataset.other)// output: otherparams
-  }
-});
-
-// wepy 建议传参方式
-<view data-wepy-params="{{index}}-wepy-otherparams" bindtap="tapName"> Click me! </view>
-
-events: {
-  tapName (event, id, title, other) {
-    console.log(id, title, other)// output: 1, wepy, otherparams
-  }
-}
-
-// wepy 1.1.8以后的版本，只允许传string。
-<view bindtap="tapName({{index}}, 'wepy', 'otherparams')"> Click me! </view>
-
-events: {
-  tapName (event, id, title, other) {
-    console.log(id, title, other)// output: 1, wepy, otherparams
-  }
-}
-```
-
-#### 3. 改变数据绑定方式
-保留setData方法，但不建议使用setData执行绑定，修复传入`undefined`的bug，并且修改入参支持：
-`this.setData(target, value)`
-`this.setData(object)`
-
-点这里查看[官方文档](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/template.html?t=20161122)
-```
-// 官方
-<view> {{ message }} </view>
-
-onLoad: function () {
-    this.setData({message: 'hello world'});
-}
-
-
-// wepy
-<view> {{ message }} </view>
-
-onLoad () {
-    this.message = 'hello world';
-}
-```
-
-#### 4. 组件代替模板和模块
-
-点这里查看[官方文档](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/data.html?t=20161122)
-```
-// 官方
-<!-- item.wxml -->
-<template name="item">
-  <text>{{text}}</text>
-</template>
-
-<!-- index.wxml -->
-<import src="item.wxml"/>
-<template is="item" data="{{text: 'forbar'}}"/>
-
-<!-- index.js -->
-var item = require('item.js')
-
-
-
-
-// wepy
-<!-- /components/item.wpy -->
- <text>{{text}}</text>
-
-<!-- index.wpy -->
-<template>
-    <component id="item"></component>
-</template>
-<script>
-    import wepy from 'wepy';
-    import Item from '../components/item';
-    export default class Index extends wepy.page {
-        components = { Item }
-    }
-</script>
-
-```
-
-## API
-
-### wepy.event
-
-|父类 | 无 |
-| ---- | ---- | 
-
-| 属性 | 类型 | 默认值 | 说明 |
-| ---- | ---- | ---- | ---- |
-| name | String | - | 事件名称 |
-| source | wepy.component | - | 事件来源 |
-| type | String | - | emit 或者 broadcast |
-
-| 方法 | 参数 | 返回值 | 说明|
-| ---- | ---- | ---- | ---- |
-| destroy | - | - | 在 emit 或者 broadcast 过程中，调用destroy方法将会停止事件传播。|
-
-### wepy.component
-
-|父类 | 无 |
-| ---- | ---- |
-
-| 属性 | 类型 | 默认值 | 说明 |
-| ---- | ---- | ---- | ---- |
-| isComponent | Boolean | true | 是否是组件，如果是页面，此值为false |
-| prefix | String | '' | 组件前缀，组件前缀+组件方法属性才是在小程序中真实存在的方法或属性。 |
-| $root | wepy.page | - | 根组件，一般都是页面 |
-| $parent | wepy.component | - | 父组件 |
-| $wxpage | Page | - | 小程序Page对象 |
-| $coms | List(wepy.component) | {} | 子组件列表 |
-
-| 方法 | 参数 | 返回值 | 说明|
-| ---- | ---- | ---- | ---- |
-| init | - | - | 组件初始化。|
-| getWxPage | - | Page | 返回小程序Page对象。|
-| $getComponent | path(String) | wepy.component | 通过组件路径返回组件对象。|
-| $invoke | com(String/wepy.component), method(String), [args] | - | 调用其它组件方法 |
-| $broadcast | evtName(String), [args] | - | broadcast事件。|
-| $emit | evtName(String), [args] | - | emit事件。|
-| $apply | fn(Function) | - | 准备执行脏数据检查。|
-| $digest | - | - | 脏检查。|
-### wepy.page
-
-|父类 | wepy.component |
-| ---- | ---- |
-
-| 属性 | 类型 | 默认值 | 说明 |
-| ---- | ---- | ---- | ---- |
-
-| 方法 | 参数 | 返回值 | 说明|
-| ---- | ---- | ---- | ---- |
-| init | - | - | 页面始化。|
-
-### wepy.app
-
-|父类 | 无 |
-| ---- | ---- |
-
-| 属性 | 类型 | 默认值 | 说明 |
-| ---- | ---- | ---- | ---- |
-|$wxapp|App|-|小程序getApp()|
-| init | - | - | 应用始化包括对原生API的改造与优化|
diff --git a/packages/wepy/package.json b/packages/wepy/package.json
deleted file mode 100644
index 91f3e2d84..000000000
--- a/packages/wepy/package.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  "name": "wepy",
-  "version": "1.6.1-alpha2",
-  "description": "",
-  "main": "lib/wepy.js",
-  "scripts": {
-    "prepublish": "npm run build",
-    "build": "babel --presets es2015,stage-1 src/ --out-dir lib/ --source-maps",
-    "watch-compile": "npm run build -- --watch",
-    "watch": "npm run watch-compile",
-    "test": "npm run eslint && npm run test-cov",
-    "eslint": "eslint src/",
-    "test-cov": "istanbul cover ./node_modules/mocha/bin/_mocha -- -t 50000 --recursive  -R spec test/"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git@github.com:wepyjs/wepy.git"
-  },
-  "author": "Gcaufy",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/wepyjs/wepy/issues"
-  },
-  "homepage": "https://github.com/wepyjs/wepy#readme",
-  "devDependencies": {
-    "babel": "^6.5.2",
-    "babel-cli": "^6.18.0",
-    "babel-eslint": "^7.1.1",
-    "babel-preset-es2015": "^6.18.0",
-    "babel-preset-stage-1": "^6.16.0"
-  }
-}
diff --git a/packages/wepy/src/app.js b/packages/wepy/src/app.js
deleted file mode 100644
index 313ca3a9f..000000000
--- a/packages/wepy/src/app.js
+++ /dev/null
@@ -1,238 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import native from './native';
-
-let RequestMQ = {
-    map: {},
-    mq: [],
-    running: [],
-    MAX_REQUEST: 5,
-    push (param) {
-        param.t = +new Date();
-        while ((this.mq.indexOf(param.t) > -1 || this.running.indexOf(param.t) > -1)) {
-            param.t += Math.random() * 10 >> 0;
-        }
-        this.mq.push(param.t);
-        this.map[param.t] = param;
-    },
-    next () {
-        let me = this;
-
-        if (this.mq.length === 0)
-            return;
-
-        if (this.running.length < this.MAX_REQUEST - 1) {
-            let newone = this.mq.shift();
-                let obj = this.map[newone];
-                let oldComplete = obj.complete;
-                obj.complete = (...args) => {
-                    me.running.splice(me.running.indexOf(obj.t), 1);
-                    delete me.map[obj.t];
-                    oldComplete && oldComplete.apply(obj, args);
-                    me.next();
-                }
-                this.running.push(obj.t);
-                return wx.request(obj);
-        }
-    },
-    request (obj) {
-
-        obj = obj || {};
-        obj = (typeof(obj) === 'string') ? {url: obj} : obj;
-
-
-        this.push(obj);
-
-        return this.next();
-    }
-};
-
-
-export default class {
-
-    $addons = {};
-
-    $interceptors = {};
-
-    $pages = {};
-
-
-
-    $init (wepy, config = {}) {
-        this.$initAPI(wepy, config.noPromiseAPI);
-        this.$wxapp = getApp();
-    }
-
-
-    use (addon, ...args) {
-        if (typeof(addon) === 'string' && this[addon]) {
-            this.$addons[addon] = 1;
-            this[addon](args);
-        } else {
-            this.$addons[addon.name] = new addon(args);
-        }
-    }
-
-    intercept (api, provider) {
-        this.$interceptors[api] = provider;
-    }
-
-    promisify () {
-    }
-
-    requestfix () {
-    }
-
-    $initAPI (wepy, noPromiseAPI) {
-        const self = this;
-        let noPromiseMethods = {
-            // 媒体
-            stopRecord: true,
-            getRecorderManager: true,
-            pauseVoice: true,
-            stopVoice: true,
-            pauseBackgroundAudio: true,
-            stopBackgroundAudio: true,
-            getBackgroundAudioManager: true,
-            createAudioContext: true,
-            createInnerAudioContext: true,
-            createVideoContext: true,
-            createCameraContext: true,
-
-            // 位置
-            createMapContext: true,
-
-            // 设备
-            canIUse: true,
-            startAccelerometer: true,
-            stopAccelerometer: true,
-            startCompass: true,
-            stopCompass: true,
-            onBLECharacteristicValueChange: true,
-            onBLEConnectionStateChange: true,
-
-            // 界面
-            hideToast: true,
-            hideLoading: true,
-            showNavigationBarLoading: true,
-            hideNavigationBarLoading: true,
-            navigateBack: true,
-            createAnimation: true,
-            pageScrollTo: true,
-            createSelectorQuery: true,
-            createCanvasContext: true,
-            createContext: true,
-            drawCanvas: true,
-            hideKeyboard: true,
-            stopPullDownRefresh: true,
-
-            // 拓展接口
-            arrayBufferToBase64: true,
-            base64ToArrayBuffer: true
-        };
-        if (noPromiseAPI) {
-            if (Array.isArray(noPromiseAPI)) {
-                noPromiseAPI.forEach(v => noPromiseMethods[v] = true);
-            } else {
-                for (let k in noPromiseAPI) {
-                    noPromiseMethods[k] = noPromiseAPI[k];
-                }
-            }
-        }
-        Object.keys(wx).forEach((key) => {
-            if (!noPromiseMethods[key] && key.substr(0, 2) !== 'on' && !(/\w+Sync$/.test(key))) {
-                Object.defineProperty(native, key, {
-                    get () {
-                        return (obj) => {
-                            obj = obj || {};
-                            if (self.$interceptors[key] && self.$interceptors[key].config) {
-                                let rst = self.$interceptors[key].config.call(self, obj);
-                                if (rst === false) {
-                                    if (self.$addons.promisify) {
-                                        return Promise.reject('aborted by interceptor');
-                                    } else {
-                                        obj.fail && obj.fail('aborted by interceptor');
-                                        return;
-                                    }
-                                }
-                                obj = rst;
-                            }
-                            if (key === 'request') {
-                                obj = (typeof(obj) === 'string') ? {url: obj} : obj;
-                            }
-                            if (typeof obj === 'string') {
-                                return wx[key](obj);
-                            }
-                            if (self.$addons.promisify) {
-                                let task;
-                                const p = new Promise((resolve, reject) => {
-                                    let bak = {};
-                                    ['fail', 'success', 'complete'].forEach((k) => {
-                                        bak[k] = obj[k];
-                                        obj[k] = (res) => {
-                                            if (self.$interceptors[key] && self.$interceptors[key][k]) {
-                                                res = self.$interceptors[key][k].call(self, res);
-                                            }
-                                            if (k === 'success')
-                                                resolve(res);
-                                            else if (k === 'fail')
-                                                reject(res);
-                                        };
-                                    });
-                                    if (self.$addons.requestfix && key === 'request') {
-                                        RequestMQ.request(obj);
-                                    } else {
-                                        task = wx[key](obj);
-                                    }
-                                });
-                                if (key === 'uploadFile' || key === 'downloadFile') {
-                                    p.progress = (cb) => {
-                                        task.onProgressUpdate(cb);
-                                        return p;
-                                    };
-                                    p.abort = (cb) => {
-                                        cb && cb();
-                                        task.abort();
-                                        return p;
-                                    }
-                                }
-                                return p;
-                            } else {
-                                let bak = {};
-                                ['fail', 'success', 'complete'].forEach((k) => {
-                                    bak[k] = obj[k];
-                                    obj[k] = (res) => {
-                                        if (self.$interceptors[key] && self.$interceptors[key][k]) {
-                                            res = self.$interceptors[key][k].call(self, res);
-                                        }
-                                        bak[k] && bak[k].call(self, res);
-                                    };
-                                });
-                                if (self.$addons.requestfix && key === 'request') {
-                                    RequestMQ.request(obj);
-                                } else {
-                                    return wx[key](obj);
-                                }
-                            }
-                        };
-                    }
-                });
-                wepy[key] = native[key];
-            } else {
-                Object.defineProperty(native, key, {
-                    get () { return (...args) => wx[key].apply(wx, args) }
-                });
-                wepy[key] = native[key];
-            }
-        });
-
-    }
-}
diff --git a/packages/wepy/src/base.js b/packages/wepy/src/base.js
deleted file mode 100644
index bbeb2e5cd..000000000
--- a/packages/wepy/src/base.js
+++ /dev/null
@@ -1,214 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-import event from './event';
-import util from './util';
-
-const PAGE_EVENT = ['onLoad', 'onReady', 'onShow', 'onHide', 'onUnload', 'onPullDownRefresh', 'onReachBottom', 'onShareAppMessage'];
-const APP_EVENT = ['onLaunch', 'onShow', 'onHide', 'onError'];
-
-
-let $bindEvt = (config, com, prefix) => {
-    com.$prefix = util.camelize(prefix || '');
-    Object.getOwnPropertyNames(com.components || {}).forEach((name) => {
-        let cClass = com.components[name];
-        let child = new cClass();
-        child.$initMixins();
-        child.$name = name;
-        let comPrefix = prefix ? (prefix + child.$name + '$') : ('$' + child.$name + '$');
-
-        com.$com[name] = child;
-
-        $bindEvt(config, child, comPrefix);
-    });
-    Object.getOwnPropertyNames(com.constructor.prototype || []).forEach((prop) => {
-        if(prop !== 'constructor' && PAGE_EVENT.indexOf(prop) === -1) {
-            config[prop] = function () {
-                com.constructor.prototype[prop].apply(com, arguments);
-                com.$apply();
-            }
-        }
-    });
-
-    let allMethods = Object.getOwnPropertyNames(com.methods || []);
-
-    com.$mixins.forEach((mix) => {
-        allMethods = allMethods.concat(Object.getOwnPropertyNames(mix.methods || []));
-    });
-
-    allMethods.forEach((method, i) => {
-        config[com.$prefix + method] = function (e, ...args) {
-            let evt = new event('system', this, e.type);
-            evt.$transfor(e);
-            let wepyParams = [], paramsLength = 0, tmp, p, comIndex;
-            if (e.currentTarget && e.currentTarget.dataset) {
-                tmp = e.currentTarget.dataset;
-                while(tmp['wpy' + method.toLowerCase() + (p = String.fromCharCode(65 + paramsLength++))] !== undefined) {
-                    wepyParams.push(tmp['wpy' + method.toLowerCase() + p]);
-                }
-                if (tmp.comIndex !== undefined) {
-                    comIndex = tmp.comIndex;
-                }
-            }
-
-            // Update repeat components data.
-            if (comIndex !== undefined) {
-                comIndex = ('' + comIndex).split('-');
-                let level = comIndex.length, tmp = level;
-                while(level-- > 0) {
-                    tmp = level;
-                    let tmpcom = com;
-                    while (tmp-- > 0) {
-                        tmpcom = tmpcom.$parent;
-                    }
-                    tmpcom.$setIndex(comIndex.shift());
-                }
-            }
-
-            args = args.concat(wepyParams);
-            let rst, mixRst;
-            let comfn = com.methods[method];
-            if (comfn) {
-                rst = comfn.apply(com, args.concat(evt));
-            }
-            com.$mixins.forEach((mix) => {
-                mix.methods[method] && (mixRst = mix.methods[method].apply(com, args.concat(evt)));
-            });
-            com.$apply();
-            return comfn ? rst : mixRst;
-        }
-    });
-    return config;
-};
-
-
-export default {
-    $createApp (appClass, appConfig) {
-        let config = {};
-        let app = new appClass();
-
-        if (!this.$instance) {
-            app.$init(this, appConfig);
-            this.$instance = app;
-        }
-
-        // This is for test case
-        if (arguments.length === 2 && arguments[1] === true) {
-            config.$app = app;
-        }
-
-        app.$wxapp = getApp();
-
-        APP_EVENT.forEach((v) => {
-            config[v] = (...args) => {
-                let rst;
-                app[v] && (rst = app[v].apply(app, args));
-                return rst;
-            };
-        });
-        return config;
-    },
-    $createPage (pageClass, pagePath) {
-        let self = this;
-        let config = {}, k;
-        let page = new pageClass();
-        if (typeof pagePath === 'string') {
-            this.$instance.$pages['/' + pagePath] = page;
-        }
-        page.$initMixins();
-        // This will be a circum Object
-        if ((typeof pagePath === 'boolean' && pagePath) || (arguments.length === 3 && arguments[2] === true))
-            config.$page = page;
-
-        config.onLoad = function (...args) {
-
-            page.$name = pageClass.name || 'unnamed';
-            page.$init(this, self.$instance, self.$instance);
-
-            let prevPage = self.$instance.__prevPage__;
-            let secParams = {};
-            secParams.from = prevPage ? prevPage : undefined;
-
-            if (prevPage && Object.keys(prevPage.$preloadData).length > 0) {
-                secParams.preload = prevPage.$preloadData;
-                prevPage.$preloadData = {};
-            }
-            if (page.$prefetchData && Object.keys(page.$prefetchData).length > 0) {
-                secParams.prefetch = page.$prefetchData;
-                page.$prefetchData = {};
-            }
-            args.push(secParams);
-            page.onLoad && page.onLoad.apply(page, args);
-
-            page.$mixins.forEach((mix) => {
-                mix['onLoad'] && mix['onLoad'].apply(page, args);
-            });
-
-            page.$apply();
-        };
-
-        config.onShow = function (...args) {
-
-            self.$instance.__prevPage__ = page;
-
-            page.onShow && page.onShow.apply(page, args);
-
-            page.$mixins.forEach((mix) => {
-                mix['onShow'] && mix['onShow'].apply(page, args);
-            });
-
-            let pages = getCurrentPages();
-            let pageId = pages[pages.length - 1].__route__;
-            let webViewId = pages[pages.length - 1].__wxWebviewId__;
-
-            if (self.$instance.__wxWebviewId__ !== webViewId) { // if same page redirect, pageId will be the same, so changed to use webview Id
-
-                page.$wxpage = this; // same page redirect, have to update the $wxpage, otherwise setData will goes to the old view
-
-                self.$instance.__route__ = pageId;
-                self.$instance.__wxWebviewId__ = webViewId;
-
-                page.onRoute && page.onRoute.apply(page, args);
-
-                page.$mixins.forEach((mix) => {
-                    mix['onRoute'] && mix['onRoute'].apply(page, args);
-                });
-            }
-
-            page.$apply();
-        };
-
-        PAGE_EVENT.forEach((v) => {
-            if (v !== 'onLoad' && v !== 'onShow') {
-                config[v] = (...args) => {
-                    let rst;
-                    page[v] && (rst = page[v].apply(page, args));
-
-                    if (v === 'onShareAppMessage')
-                        return rst;
-
-                    page.$mixins.forEach((mix) => {
-                        mix[v] && mix[v].apply(page, args);
-                    });
-
-                    page.$apply();
-
-                    return rst;
-                };
-            }
-        });
-
-        if (!page.onShareAppMessage) {
-            delete config.onShareAppMessage;
-        }
-
-        return $bindEvt(config, page, '');
-    },
-}
diff --git a/packages/wepy/src/component.js b/packages/wepy/src/component.js
deleted file mode 100644
index 3825568fb..000000000
--- a/packages/wepy/src/component.js
+++ /dev/null
@@ -1,580 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-import event from './event';
-import util from './util';
-
-
-const Props = {
-    check (t, val) {
-        switch (t) {
-            case String:
-                return typeof(val) === 'string';
-            case Number:
-                return typeof(val) === 'number';
-            case Boolean:
-                return typeof(val) === 'boolean';
-            case Function:
-                return typeof(val) === 'function';
-            case Object:
-                return typeof(val) === 'object';
-            case Array:
-                return toString.call(val) === '[object Array]';
-            default:
-                return val instanceof t;
-        }
-    },
-    build (props) {
-        let rst = {};
-        if (typeof(props) === 'string') {
-            rst[props] = {};
-        } else if (toString.call(props) === '[object Array]') {
-            props.forEach((p) => {
-                rst[p] = {};
-            });
-        } else {
-            Object.keys(props).forEach(p => {
-                if (typeof(props[p]) === 'function') {
-                    rst[p] = {
-                        type: [props[p]]
-                    }
-                } else if (toString.call(props[p]) === '[object Array]') {
-                    rst[p] = {
-                        type: props[p]
-                    }
-                } else
-                    rst[p] = props[p];
-
-                if (rst[p].type && toString.call(rst[p].type) !== '[object Array]')
-                    rst[p].type = [rst[p].type];
-            });
-        }
-        return rst;
-    },
-    valid (props, key, val) {
-        let valid = false;
-        if (props[key]) {
-            if (!props[key].type) {
-                valid = true;
-            } else {
-                return props[key].type.some(t => this.check(t, val));
-            }
-        }
-        return valid;
-    },
-    getValue (props, key, value) {
-        var rst;
-        if (value !== undefined && this.valid(props, key, value)) {
-            rst = value;
-        } else if (typeof(props[key].default) === 'function') {
-            rst = props[key].default();
-        } else
-            rst = props[key].default;
-        return props[key].coerce ? props[key].coerce(rst) : rst;
-    }
-};
-
-export default class {
-
-    $com = {};
-    $events = {};
-    $mixins = [];
-
-    $isComponent = true;
-    $prefix = '';
-
-    $mappingProps = {};
-
-    data = {};
-    methods = {};
-
-    $init ($wxpage, $root, $parent) {
-        let self = this;
-
-        this.$wxpage = $wxpage;
-        if (this.$isComponent) {
-            this.$root = $root || this.$root;
-            this.$parent = $parent || this.$parent;
-            this.$wxapp = this.$root.$parent.$wxapp;
-        }
-
-        if (this.props) {
-            this.props = Props.build(this.props);
-        }
-
-        let k, defaultData = {};
-
-
-        let props = this.props;
-        let key, val, binded;
-        let inRepeat = false, repeatKey;
-
-
-        // save a init data.
-        if (this.$initData === undefined) {
-            this.$initData = util.$copy(this.data, true);
-        } else {
-            this.data = util.$copy(this.$initData, true);
-        }
-
-        if (this.$props) { // generate mapping Props
-            for (key in this.$props) {
-                for (binded in this.$props[key]) {
-                    if (/\.sync$/.test(binded)) { // sync goes to mapping
-                        if (!this.$mappingProps[this.$props[key][binded]])
-                            this.$mappingProps[this.$props[key][binded]] = {};
-                        this.$mappingProps[this.$props[key][binded]][key] = binded.substring(7, binded.length - 5);
-                    }
-                }
-            }
-        }
-
-        if (props) {
-            for (key in props) {
-                val = undefined;
-                if ($parent && $parent.$props && $parent.$props[this.$name]) {
-                    val = $parent.$props[this.$name][key];
-                    binded = $parent.$props[this.$name][`v-bind:${key}.once`] || $parent.$props[this.$name][`v-bind:${key}.sync`];
-                    if (binded) {
-                        if (typeof(binded) === 'object') {
-                            props[key].repeat = binded.for;
-                            props[key].item = binded.item;
-                            props[key].index = binded.index;
-                            props[key].key = binded.key;
-                            props[key].value = binded.value;
-                            
-                            inRepeat = true;
-
-                            let bindfor = binded.for, binddata = $parent;
-                            bindfor.split('.').forEach(t => {
-                                binddata = binddata ? binddata[t] : {};
-                            });
-                            if (binddata && (typeof binddata === 'object' || typeof binddata === 'string')) {
-                                repeatKey = Object.keys(binddata)[0];
-                            }
-
-                            if (!this.$mappingProps[key]) this.$mappingProps[key] = {};
-                            this.$mappingProps[key]['parent'] = {
-                                mapping: binded.for,
-                                from: key
-                            };
-                        } else {
-                            val = $parent[binded];
-                            if (props[key].twoWay) {
-                                if (!this.$mappingProps[key]) this.$mappingProps[key] = {};
-                                this.$mappingProps[key]['parent'] = binded;
-                            }
-                        }
-                    } else if (typeof val === 'object' && val.value !== undefined) { // 静态传值
-                        this.data[key] = val.value;
-                    }
-                }
-                if (!this.data[key] && !props[key].repeat) {
-                    val = Props.getValue(props, key, val);
-                    this.data[key] = val;
-                }
-            }
-        }
-
-        if (typeof this.data === 'function') {
-            this.data = this.data.apply(this.data);
-        }
-
-        for (k in this.data) {
-            defaultData[`${this.$prefix}${k}`] = this.data[k];
-            this[k] = this.data[k];
-            //this[k] = util.$copy(this.data[k], true);
-        }
-
-        this.$data = util.$copy(this.data, true);
-        if (inRepeat && repeatKey !== undefined)
-            this.$setIndex(repeatKey);
-
-        if (this.computed) {
-            for (k in this.computed) {
-                let fn = this.computed[k];
-                defaultData[`${this.$prefix}${k}`] = fn.call(this);
-                this[k] = util.$copy(defaultData[`${this.$prefix}${k}`], true);
-            }
-        }
-        this.setData(defaultData);
-
-        let coms = Object.getOwnPropertyNames(this.$com);
-        if (coms.length) {
-            coms.forEach((name) => {
-                this.$com[name].$init(this.getWxPage(), $root, this);
-                this.$com[name].onLoad && this.$com[name].onLoad();
-
-                this.$com[name].$mixins.forEach((mix) => {
-                    mix['onLoad'] && mix['onLoad'].call(this.$com[name]);
-                });
-
-                this.$com[name].$apply();
-            });
-        }
-    }
-
-    $initMixins () {
-        if (this.mixins) {
-            if (typeof(this.mixins) === 'function') {
-                this.mixins = [this.mixins];
-            }
-        } else {
-            this.mixins = [];
-        }
-        this.mixins.forEach((mix) => {
-            let inst = new mix();
-            inst.$init(this);
-            this.$mixins.push(inst);
-        });
-    }
-
-    onLoad () {
-    }
-
-    setData (k, v) {
-        if (typeof(k) === 'string') {
-            if (v) {
-                let tmp = {};
-                tmp[k] = v;
-                k = tmp;
-            } else {
-                let tmp = {};
-                tmp[k] = this.data[`${k}`];
-                k = tmp;
-            }
-            return this.$wxpage.setData(k);
-        }
-        let t = null, reg = new RegExp('^' + this.$prefix.replace(/\$/g, '\\$'), 'ig');
-        for (t in k) {
-            let noPrefix = t.replace(reg, '');
-            this.$data[noPrefix] = util.$copy(k[t], true);
-        }
-        // In the same page redirection, $wxpage does not update, so use the page $wxpage
-        return this.$root.$wxpage.setData(k);
-    }
-
-    getWxPage () {
-        return this.$wxpage;
-    }
-
-    getCurrentPages () {
-        return getCurrentPages();
-    }
-
-    /**
-     * 对于在repeat中的组件，index改变时需要修改对应的数据
-     */
-    $setIndex (index) {
-        this.$index = index;
-
-        let props = this.props,
-            $parent = this.$parent;
-        let key, val, binded;
-        if (props) {
-            for (key in props) {
-                val = undefined;
-                if ($parent && $parent.$props && $parent.$props[this.$name]) {
-                    val = $parent.$props[this.$name][key];
-                    binded = $parent.$props[this.$name][`v-bind:${key}.once`] || $parent.$props[this.$name][`v-bind:${key}.sync`];
-                    if (binded) {
-                        if (typeof(binded) === 'object') {
-                            let bindfor = binded.for, binddata = $parent;
-                            bindfor.split('.').forEach(t => {
-                                binddata = binddata ? binddata[t] : {};
-                            });
-
-                            index = Array.isArray(binddata) ? +index : index;
-
-                            if (props[key].value === props[key].item) {
-                                val = binddata[index];
-                            } else if (props[key].value === props[key].index) {
-                                val = index;
-                            } else if (props[key].value === props[key].key) {
-                                val = index;
-                            } else {
-                                val = $parent[props[key].value];
-                            }
-                            this.$index = index;
-                            this.data[key] = val;
-                            this[key] = val;
-                            this.$data[key] = util.$copy(this[key], true);
-                        }
-                    }
-                }
-            }
-            // Clear all childrens index;
-            for (key in this.$com) {
-                this.$com[key].$index = undefined;
-            }
-        }
-
-    }
-
-    $getComponent(com) {
-        if (typeof(com) === 'string') {
-            if (com.indexOf('/') === -1) {
-                return this.$com[com];
-            } else if (com === '/') {
-                return this.$parent;
-            } else {
-                let path = com.split('/');
-                path.forEach((s, i) => {
-                    if (i === 0) {
-                        if (s === '') {   //   /a/b/c
-                            com = this.$root;
-                        } else if (s === '.') {
-                            // ./a/b/c
-                            com = this;
-                        } else if (s === '..') {
-                            // ../a/b/c
-                            com = this.$parent;
-                        } else {
-                            com = this.$getComponent(s);
-                        }
-                    } else if (s) {
-                        com = com.$com[s];
-                    }
-                });
-            }
-        }
-        return (typeof(com) !== 'object') ? null : com;
-    }
-
-    $invoke (com, method, ...args) {
-        com = this.$getComponent(com);
-
-        if (!com) {
-            throw new Error('Invalid path: ' + com);
-        }
-
-        let fn = com.methods ? com.methods[method] : '';
-
-        if (typeof(fn) === 'function') {
-            let $evt = new event('', this, 'invoke');
-            let rst = fn.apply(com, args.concat($evt));
-            com.$apply();
-            return rst;
-        } else {
-            fn = com[method];
-        }
-
-        if (typeof(fn) === 'function') {
-            return fn.apply(com, args);
-        } else {
-            throw new Error('Invalid method: ' + method);
-        }
-    }
-
-    $broadcast (evtName, ...args) {
-        let com = this;
-        let $evt = typeof(evtName) === 'string' ? new event(evtName, this, 'broadcast') : $evt;
-        let queue = [com];
-
-        while(queue.length && $evt.active) {
-            let current = queue.shift();
-            for (let c in current.$com) {
-                c = current.$com[c];
-                queue.push(c);
-                let fn = getEventsFn(c, evtName);
-                if (fn) {
-                    c.$apply(() => {
-                        fn.apply(c, args.concat($evt));
-                    });
-                }
-                if (!$evt.active)
-                    break;
-            }
-        }
-    }
-
-    $emit (evtName, ...args) {
-        let com = this;
-        let source = this;
-        let $evt = new event(evtName, source, 'emit');
-
-        args = args.concat($evt);
-
-        // User custom event;
-        if (this.$parent && this.$parent.$events && this.$parent.$events[this.$name]) {
-            let method = this.$parent.$events[this.$name]['v-on:' + evtName];
-            if (method && this.$parent.methods) {
-                let fn = this.$parent.methods[method];
-                if (typeof(fn) === 'function') {
-                    this.$parent.$apply(() => {
-                        fn.apply(this.$parent, args);
-                    });
-                    return;
-                } else {
-                    throw new Error(`Invalid method from emit, component is ${this.$parent.$name}, method is ${method}. Make sure you defined it already.\n`);
-                }
-            }
-        }
-        while(com && com.$isComponent !== undefined && $evt.active) {
-            // 保存 com 块级作用域组件实例
-            let comContext = com;
-            let fn = getEventsFn(comContext, evtName);
-            if (fn) {
-                if (typeof fn === 'function') {
-                    comContext.$apply(() => {
-                        fn.apply(comContext, args);
-                    });
-                } else if (Array.isArray(fn)) {
-                    fn.forEach(f => {
-                        f.apply(comContext, args);
-                    })
-                    comContext.$apply();
-                }
-            }
-            com = comContext.$parent;
-        }
-    }
-
-    $on (evtName, fn) {
-        if (typeof evtName === 'string') {
-            (this.$events[evtName] || (this.$events[evtName] = [])).push(fn);
-        } else if (Array.isArray(evtName)) {
-            evtName.forEach(k => {
-                this.$on(k, fn);
-            });
-        } else if (typeof evtName === 'object') {
-            for (let k in evtName) {
-                this.$on(k, evtName[k]);
-            }
-        }
-        return this;
-    }
-
-    $once (evtName, fn) {
-        let self = this;
-        let oncefn = function oncefn () {
-            self.$off(evtName, oncefn);
-            fn.apply(self, arguments);
-        }
-        oncefn.fn = fn;
-        this.$on(evtName, oncefn);
-    }
-
-    $off (evtName, fn) {
-        // off all events;
-        if (evtName === undefined) {
-            this.$events = {};
-        } else if (typeof evtName === 'string') {
-            if (fn) {
-                let fns = this.$events[evtName];
-                let i = fns.length;
-                while (i--) {
-                    if (fn === fns[i] || fn === fns[i].fn) {
-                        fns.splice(i, 1);
-                        break;
-                    }
-                }
-            } else {
-                this.$events[evtName] = [];
-            }
-        } else if (Array.isArray(evtName)) {
-            evtName.forEach(k => {
-                this.$off(k, fn);
-            });
-        }
-        return this;
-    }
-
-    $apply (fn) {
-        if (typeof(fn) === 'function') {
-            fn.call(this);
-            this.$apply();
-        } else {
-            if (this.$$phase) {
-                this.$$phase = '$apply';
-            } else {
-                this.$digest();
-            }
-        }
-    }
-
-    $digest () {
-        let k;
-        let originData = this.$data;
-        this.$$phase = '$digest';
-        while (this.$$phase) {
-            let readyToSet = {};
-            if (this.computed) {
-                for (k in this.computed) { // If there are computed property, calculated every times
-                    let fn = this.computed[k], val = fn.call(this);
-                    if (!util.$isEqual(this[k], val)) { // Value changed, then send to ReadyToSet
-                        readyToSet[this.$prefix + k] = val;
-                        this[k] = util.$copy(val, true);
-                    }
-                }
-            }
-            for (k in originData) {
-                if (!util.$isEqual(this[k], originData[k])) { // compare if new data is equal to original data
-                    // data watch trigger
-                    if (this.watch) {
-                        if (this.watch[k]) {
-                            if (typeof this.watch[k] === 'function') {
-                                this.watch[k].call(this, this[k], originData[k]);
-                            } else if (typeof this.watch[k] === 'string' && typeof this.methods[k] === 'function') {
-                                this.methods[k].call(this, this[k], originData[k]);
-                            }
-                        }
-                    }
-                    // Send to ReadyToSet
-                    readyToSet[this.$prefix + k] = this[k]; 
-                    this.data[k] = this[k];
-                    originData[k] = util.$copy(this[k], true);
-                    if (this.$repeat && this.$repeat[k]) {
-                        let $repeat = this.$repeat[k];
-                        this.$com[$repeat.com].data[$repeat.props] = this[k];
-                        this.$com[$repeat.com].$setIndex(0);
-                        this.$com[$repeat.com].$apply();
-                    }
-                    if (this.$mappingProps[k]) {
-                        Object.keys(this.$mappingProps[k]).forEach((changed) => {
-                            let mapping = this.$mappingProps[k][changed];
-                            if (typeof(mapping) === 'object') {
-                                this.$parent.$apply();
-                            } else if (changed === 'parent' && !util.$isEqual(this.$parent.$data[mapping], this[k])) {
-                                this.$parent[mapping] = this[k];
-                                this.$parent.data[mapping] = this[k];
-                                this.$parent.$apply();
-                            } else if (changed !== 'parent' && !util.$isEqual(this.$com[changed].$data[mapping], this[k])) {
-                                this.$com[changed][mapping] = this[k];
-                                this.$com[changed].data[mapping] = this[k];
-                                this.$com[changed].$apply();
-                            }
-                        });
-                    }
-                }
-            }
-            if (Object.keys(readyToSet).length) {
-                this.setData(readyToSet);
-            }
-            this.$$phase = (this.$$phase === '$apply') ? '$digest' : false;
-        }
-    }
-
-}
-
-function getEventsFn (comContext, evtName) {
-    let fn = comContext.events ? comContext.events[evtName] : (comContext.$events[evtName] ? comContext.$events[evtName] : undefined);
-    const typeFn = typeof(fn);
-    let fnFn;
-    if (typeFn === 'string') {
-        // 如果 events[k] 是 string 类型 则认为是调用 methods 上方法
-        const method = comContext.methods && comContext.methods[fn];
-        if (typeof(method) === 'function') {
-            fnFn = method;
-        }
-    } else if (typeFn === 'function' || Array.isArray(fn)) {
-        fnFn = fn;
-    }
-    return fnFn;
-}
diff --git a/packages/wepy/src/event.js b/packages/wepy/src/event.js
deleted file mode 100644
index e6c05cd46..000000000
--- a/packages/wepy/src/event.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-export default class {
-
-    active = true;
-
-    constructor (name, source, type) {
-
-        this.name = name;
-        this.source = source;
-        this.type = type;
-    }
-
-    $destroy () {
-        this.active = false;
-    }
-
-    $transfor(wxevent) {
-        let k = 0;
-        for (k in wxevent) {
-            this[k] = wxevent[k];
-        }
-    }
-}
diff --git a/packages/wepy/src/mixin.js b/packages/wepy/src/mixin.js
deleted file mode 100644
index 34eddae45..000000000
--- a/packages/wepy/src/mixin.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-export default class {
-
-    data = {};
-
-    components = {};
-
-    methods = {};
-
-    events = {};
-
-    $init (parent) {
-        let k;
-
-        // 自定义属性覆盖
-        Object.getOwnPropertyNames(this)
-            .concat(Object.getOwnPropertyNames(Object.getPrototypeOf(this)))
-            .forEach((k) => {
-                if (k[0] + k[1] !== 'on' && k !== 'constructor') {
-                    if (!parent[k])
-                        parent[k] = this[k];
-                }
-        });
-
-
-        // 数据，事件，组件覆盖
-        ['data', 'events', 'components'].forEach((item) => {
-            Object.getOwnPropertyNames(this[item]).forEach((k) => {
-                if (k !== 'init' && !parent[item][k])
-                    parent[item][k] = this[item][k];
-            });
-        });
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy/src/native.js b/packages/wepy/src/native.js
deleted file mode 100644
index 9c7c7b939..000000000
--- a/packages/wepy/src/native.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-export default {
-};
-
-
diff --git a/packages/wepy/src/page.js b/packages/wepy/src/page.js
deleted file mode 100644
index 1d7e941c9..000000000
--- a/packages/wepy/src/page.js
+++ /dev/null
@@ -1,107 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-import native from './native';
-import component from './component';
-import util from './util';
-
-export default class extends component {
-
-    $isComponent = false;
-
-
-    $preloadData = {};
-
-    $prefetchData = {};
-
-    $init (wxpage, $parent) {
-
-        this.$parent = $parent;
-        this.$root = this;
-        if (!$parent.$wxapp) {
-            $parent.$wxapp = getApp();
-        }
-        this.$wxapp = $parent.$wxapp;
-        super.$init(wxpage, this);
-    }
-
-    onLoad () {
-        super.onLoad();
-    }
-
-    $preload(key, data) {
-        if (typeof(key) === 'object') {
-            let k;
-            for (k in key) {
-                this.$preload(k, key[k]);
-            }
-        } else {
-            this.$preloadData[key] = data;
-        }
-    }
-
-    $route(type, url, params = {}) {
-        if (typeof(url) === 'string') {
-            let s = url + '?';
-            if (params) {
-                let k;
-                for (k in params) {
-                    s += `${k}=${params[k]}&`
-                }
-            }
-            s = s.substring(0, s.length - 1);
-            url = {url: s};
-        } else {
-            params = util.$getParams(url.url);
-        }
-        // __route__ will be undefined if it called from onLoad
-        if (!this.$parent.__route__) {
-            this.$parent.__route__ = getCurrentPages()[0].__route__;
-            this.$parent.__wxWebviewId__ = getCurrentPages()[0].__wxWebviewId__;
-        }
-        let absoluteRoute = this.$parent.__route__[0] !== '/' ? ('/' + this.$parent.__route__) : this.$parent.__route__;
-        let realPath = util.$resolvePath(absoluteRoute, url.url.split('?')[0]);
-        let goTo = this.$parent.$pages[realPath];
-        if (goTo && goTo.onPrefetch) {
-            let prevPage = this.$parent.__prevPage__;
-            let preloadData = {};
-            if (prevPage && Object.keys(prevPage.$preloadData).length > 0) {
-                preloadData = prevPage.$preloadData;
-            }
-            goTo.$prefetchData = goTo.onPrefetch(params, {from: this, preload: preloadData});
-        }
-        return native[type](url);
-    }
-
-    $redirect(url, params) {
-        return this.$route('redirectTo', url, params);
-    }
-
-    $navigate(url, params) {
-        return this.$route('navigateTo', url, params);
-    }
-
-    $switch(url) {
-        if (typeof(url) === 'string')
-            url = {url: url};
-
-        return native.switchTab(url);
-    }
-
-    $back(delta) {
-        let p = delta || {};
-        if (typeof(p) === 'number')
-            p = {delta: p};
-
-        if (!p.delta)
-            p.delta = 1;
-
-        return native.navigateBack(p);
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy/src/util.js b/packages/wepy/src/util.js
deleted file mode 100644
index 3691b4e30..000000000
--- a/packages/wepy/src/util.js
+++ /dev/null
@@ -1,307 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-export default {
-    $isEmpty (obj) {
-        return Object.keys(obj).length === 0;
-    },
-
-    $isEqual (a, b, aStack, bStack) {
-        // Identical objects are equal. `0 === -0`, but they aren't identical.
-        // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
-        if (a === b) return a !== 0 || 1 / a === 1 / b;
-        // `NaN`s are equivalent, but non-reflexive.
-        if (a !== a) return b !== b;
-        // A strict comparison is necessary because `null == undefined`.
-        if (!a || !b) return a === b;
-        // Exhaust primitive checks
-        var type = typeof a;
-        if (type !== 'function' && type !== 'object' && typeof b !== 'object') return false;
-        return this.$isDeepEqual(a, b, aStack, bStack);
-    },
-
-    $isDeepEqual (a, b, aStack, bStack) {
-        let self = this;
-        // Compare `[[Class]]` names.
-        var className = toString.call(a);
-        if (className !== toString.call(b)) return false;
-        switch (className) {
-          // Strings, numbers, regular expressions, dates, and booleans are compared by value.
-          case '[object RegExp]':
-          // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
-          case '[object String]':
-            // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
-            // equivalent to `new String("5")`.
-            return '' + a === '' + b;
-          case '[object Number]':
-            // `NaN`s are equivalent, but non-reflexive.
-            // Object(NaN) is equivalent to NaN.
-            if (+a !== +a) return +b !== +b;
-            // An `egal` comparison is performed for other numeric values.
-            return +a === 0 ? 1 / +a === 1 / b : +a === +b;
-          case '[object Date]':
-          case '[object Boolean]':
-            // Coerce dates and booleans to numeric primitive values. Dates are compared by their
-            // millisecond representations. Note that invalid dates with millisecond representations
-            // of `NaN` are not equivalent.
-            return +a === +b;
-          case '[object Symbol]':
-            var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
-            return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
-        }
-
-        var areArrays = className === '[object Array]';
-        if (!areArrays) {
-          if (typeof a !== 'object' || typeof b !== 'object') return a === b;
-
-          // Objects with different constructors are not equivalent, but `Object`s or `Array`s
-          // from different frames are.
-          var aCtor = a.constructor, bCtor = b.constructor;
-          if (aCtor !== bCtor && !(typeof aCtor === 'function' && aCtor instanceof aCtor &&
-                                   typeof bCtor === 'function' && bCtor instanceof bCtor)
-                              && ('constructor' in a && 'constructor' in b)) {
-            return false;
-          }
-        }
-        // Assume equality for cyclic structures. The algorithm for detecting cyclic
-        // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
-
-        // Initializing stack of traversed objects.
-        // It's done here since we only need them for objects and arrays comparison.
-        aStack = aStack || [];
-        bStack = bStack || [];
-        var length = aStack.length;
-        while (length--) {
-          // Linear search. Performance is inversely proportional to the number of
-          // unique nested structures.
-          if (aStack[length] === a) return bStack[length] === b;
-        }
-
-        // Add the first object to the stack of traversed objects.
-        aStack.push(a);
-        bStack.push(b);
-
-        // Recursively compare objects and arrays.
-        if (areArrays) {
-          // Compare array lengths to determine if a deep comparison is necessary.
-          length = a.length;
-          if (length !== b.length) return false;
-          // Deep compare the contents, ignoring non-numeric properties.
-          while (length--) {
-            if (!self.$isEqual(a[length], b[length], aStack, bStack)) return false;
-          }
-        } else {
-          // Deep compare objects.
-          var keys = Object.keys(a), key;
-          length = keys.length;
-          // Ensure that both objects contain the same number of properties before comparing deep equality.
-          if (Object.keys(b).length !== length) return false;
-          while (length--) {
-            // Deep compare each member
-            key = keys[length];
-            if (!(self.$has(b, key) && self.$isEqual(a[key], b[key], aStack, bStack))) return false;
-          }
-        }
-        // Remove the first object from the stack of traversed objects.
-        aStack.pop();
-        bStack.pop();
-        return true;
-    },
-
-    $has (obj, path) {
-        if (toString.call(path) !== '[object Array]') {
-            return obj && hasOwnProperty.call(obj, path);
-        }
-        var length = path.length;
-        for (var i = 0; i < length; i++) {
-            var key = path[i];
-            if (!obj || !hasOwnProperty.call(obj, key)) {
-                return false;
-            }
-            obj = obj[key];
-        }
-        return !!length;
-    },
-
-    $extend () {
-        var options, name, src, copy, copyIsArray, clone,
-        target = arguments[ 0 ] || {},
-        i = 1,
-        length = arguments.length,
-        deep = false;
-        var self = this;
-
-        // Handle a deep copy situation
-        if ( typeof target === 'boolean' ) {
-            deep = target;
-
-            // Skip the boolean and the target
-            target = arguments[ i ] || {};
-            i++;
-        }
-
-        // Handle case when target is a string or something (possible in deep copy)
-        if ( typeof target !== 'object' && !(typeof(target) === 'function') ) {
-            target = {};
-        }
-
-        // Extend jQuery itself if only one argument is passed
-        if ( i === length ) {
-            target = this;
-            i--;
-        }
-
-        for ( ; i < length; i++ ) {
-
-            // Only deal with non-null/undefined values
-            if ( ( options = arguments[ i ] ) ) {
-
-                // Extend the base object
-                for ( name in options ) {
-                    src = target[ name ];
-                    copy = options[ name ];
-
-                    // Prevent never-ending loop
-                    if ( target === copy ) {
-                        continue;
-                    }
-
-                    // Recurse if we're merging plain objects or arrays
-                    if ( deep && copy && ( self.$isPlainObject( copy ) ||
-                        ( copyIsArray = Array.isArray( copy ) ) ) ) {
-
-                        if ( copyIsArray ) {
-                            copyIsArray = false;
-                            clone = src && Array.isArray( src ) ? src : [];
-
-                        } else {
-                            clone = src && self.$isPlainObject( src ) ? src : {};
-                        }
-
-                        // Never move original objects, clone them
-                        target[ name ] = self.$extend( deep, clone, copy );
-
-                    // Don't bring in undefined values => bring undefined values
-                    } else {
-                        target[ name ] = copy;
-                    }
-                }
-            }
-        }
-
-        // Return the modified object
-        return target;
-    },
-
-    $copy (obj, deep = false) {
-        if (Array.isArray(obj)) {
-            return this.$extend(deep, [], obj);
-        } else if ('' + obj === 'null') {
-            return obj;
-        } else if (typeof (obj) === 'object') {
-            return this.$extend(deep, {}, obj);
-        } else
-            return obj;
-    },
-
-    $isPlainObject (obj) {
-        var proto, Ctor;
-
-        // Detect obvious negatives
-        // Use toString instead of jQuery.type to catch host objects
-        if ( !obj || Object.prototype.toString.call( obj ) !== '[object Object]' ) {
-            return false;
-        }
-
-        proto = Object.getPrototypeOf( obj );
-
-        // Objects with no prototype (e.g., `Object.create( null )`) are plain
-        if ( !proto ) {
-            return true;
-        }
-
-        // Objects with prototype are plain iff they were constructed by a global Object function
-        Ctor = Object.prototype.hasOwnProperty.call( proto, 'constructor' ) && proto.constructor;
-        return typeof Ctor === 'function' && Object.prototype.hasOwnProperty.toString.call( Ctor ) === Object.prototype.hasOwnProperty.toString.call(Object);
-    },
-
-    /**
-     * resolve path
-     * @param  {[string]} route ['/page/index']
-     * @param  {[string]} url   ['./page2']
-     * @return {[string]}       ['/page/page2']
-     */
-    $resolvePath (route, url) {
-        if (!url)
-            return route;
-        if (url[0] === '/') { // /index
-            url = url.substr(1);
-            return this.$resolvePath('', url);
-        }
-        if (url[0] !== '.') { // index
-            return this.$resolvePath(route, './' + url);
-        }
-        let current = route.split('/');
-        if (url[0] === '.' && url[1] === '/') { // ./index
-            url = url.substr(2);
-            if (url[0] !== '.') {
-                if (current.length)
-                    current[current.length - 1] = url;
-                else
-                    current = [url];
-                return current.length === 1 ? ('/' + current[0]) : current.join('/');
-            }
-            return this.$resolvePath(current.join('/'), url);
-        }
-        if (url[0] === '.' && url[1] === '.' && url[2] === '/') { // ../index || ....../index || ../../../index
-            url = url.replace(/^\.*/ig, '');
-            current.pop();
-            return this.$resolvePath(current.join('/'), '.' + url);
-        }
-        if (url[0] === '.') {
-            return this.$resolvePath(route, url.substr(1));
-        }
-    },
-    /**
-     * get url params
-     * @param  {String} url index?a=1&b=2
-     * @return {Object}     {a:1,b:2}
-     */
-    $getParams (url) {
-        let rst = {};
-        let quoteIndex = url.indexOf('?');
-
-        if (quoteIndex !== -1) {
-            let str = url.substr(quoteIndex + 1);
-            let tmp;
-            str.split('&').forEach(v => {
-                tmp = v.split('=');
-                rst[tmp[0]] = decodeURIComponent(tmp[1]);
-            });
-       }
-       return rst;
-    },
-    /**
-    * Hyphenate a camelCase string.
-    */
-    hyphenate (str) {
-        return str
-            .replace(/([^-])([A-Z])/g, '$1-$2')
-            .replace(/([^-])([A-Z])/g, '$1-$2')
-            .toLowerCase();
-    },
-    /**
-     * Camelize a hyphen-delimited string.
-     */
-    camelize (str) {
-        return str.replace(/-(\w)/g, (_, c) => c ? c.toUpperCase() : '');
-    }
-};
-
-
diff --git a/packages/wepy/src/wepy.js b/packages/wepy/src/wepy.js
deleted file mode 100644
index a1aad268e..000000000
--- a/packages/wepy/src/wepy.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-import app from './app';
-import page from './page';
-import component from './component';
-import event from './event';
-import base from './base';
-import util from './util';
-import mixin from './mixin';
-
-
-export default {
-    event: event,
-    app: app,
-    component: component,
-    page: page,
-    mixin: mixin,
-
-    $createApp: base.$createApp,
-    $createPage: base.$createPage,
-
-    $isEmpty: util.$isEmpty,
-    $isEqual: util.$isEqual,
-    $isDeepEqual: util.$isDeepEqual,
-    $has: util.$has,
-    $extend: util.$extend,
-    $isPlainObject: util.$isPlainObject,
-    $copy: util.$copy,
-};
-
-
diff --git a/packages/wepy/test/app.js b/packages/wepy/test/app.js
deleted file mode 100644
index 25179cf77..000000000
--- a/packages/wepy/test/app.js
+++ /dev/null
@@ -1,333 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-var assert = require('assert');
-var app = require('../lib/app').default;
-var wepy = require('../lib/wepy').default;
-var App = require('./fake/app');
-var wxfake = require('./wxfake');
-
-
-wxfake.resetGlobal();
-
-describe('app.js', () => {
-
-
-    let appConfig = wepy.$createApp(App, true);
-    let app = appConfig.$app;
-
-
-
-    it('wx instance', () => {
-        assert.strictEqual(app.$wxapp.app, 'app', 'wxapp equal getApp()');
-
-        assert.strictEqual(typeof wepy.getUserInfo, 'function', 'api init');
-    });
-
-
-    it('api call', () => {
-        wepy.getUserInfo({
-            success: function (res) {
-                assert.strictEqual(res.name, 'fakeID', 'wepy.getUserInfo success');
-            }
-        });
-
-        wepy.login({
-            fail: function (res) {
-                assert.strictEqual(res.code, 'xxx', 'wepy.login fail');
-            }
-        });
-
-        wepy.request({
-            data: {
-                number: 1
-            },
-            success: function (res) {
-                assert.strictEqual(res.number, 1, 'wepy.request success');
-            }
-        });
-
-        assert.strictEqual(wepy.createCanvasContext(), 'createCanvasContext', 'wepy.createCanvasContext called');
-    });
-
-
-    it('api use promisify', () => {
-
-        app.use('promisify');
-
-        assert.strictEqual(wepy.getUserInfo() instanceof Promise, true, 'it\'s a Promise');
-
-        wepy.getUserInfo().then(function (res) {
-            assert.strictEqual(res.name, 'fakeID', 'wepy.getUserInfo promisify success');
-        });
-
-        wepy.login().then(function (res) {
-        }).catch(function (res) {
-            assert.strictEqual(res.code, 'xxx', 'wepy.login promisify fail');
-        });
-
-        wepy.request({data: {number: 2}}).then(function (res) {
-            assert.strictEqual(res.number, 2, 'wepy.request success');
-        });
-
-        assert.strictEqual(wepy.createCanvasContext(), 'createCanvasContext', 'wepy.createCanvasContext called');
-
-    });
-
-    it('api use requestfix', () => {
-
-        app.$addons.promisify = undefined;
-        app.use('requestfix');
-
-        assert.strictEqual(wepy.getUserInfo() instanceof Promise, false, 'it\'s not a Promise');
-
-        wepy.request({
-            data: {
-                number: 1
-            },
-            success: function (res) {
-                assert.strictEqual(res.number, 1, 'wepy.request 1 success');
-            }
-        });
-        wepy.request({
-            data: {
-                number: 2
-            },
-            success: function (res) {
-                assert.strictEqual(res.number, 2, 'wepy.request 2 success');
-            }
-        });
-        wepy.request({
-            data: {
-                number: 3
-            },
-            success: function (res) {
-                assert.strictEqual(res.number, 3, 'wepy.request 3 success');
-            }
-        });
-        wepy.request({
-            data: {
-                number: 4
-            },
-            success: function (res) {
-                assert.strictEqual(res.number, 4, 'wepy.request 4 success');
-            }
-        });
-        wepy.request({
-            data: {
-                number: 5
-            },
-            success: function (res) {
-                assert.strictEqual(res.number, 5, 'wepy.request 5 success');
-            }
-        });
-        wepy.request({
-            data: {
-                number: 6
-            },
-            success: function (res) {
-                assert.strictEqual(res.number, 6, 'wepy.request 6 success');
-            }
-        });
-    });
-
-
-
-    it('api use both requestfix and promisify', () => {
-
-        app.use('promisify');
-        app.use('requestfix');
-
-        assert.strictEqual(wepy.getUserInfo() instanceof Promise, true, 'it\'s a Promise');
-
-        wepy.request({data: {number: 1}}).then(function (res) {
-            assert.strictEqual(res.number, 1, 'wepy.request 1 success');
-        });
-        wepy.request({data: {number: 2}}).then(function (res) {
-            assert.strictEqual(res.number, 2, 'wepy.request 2 success');
-        });
-        wepy.request({data: {number: 3}}).then(function (res) {
-            assert.strictEqual(res.number, 3, 'wepy.request 3 success');
-        });
-        wepy.request({data: {number: 4}}).then(function (res) {
-            assert.strictEqual(res.number, 4, 'wepy.request 4 success');
-        });
-        wepy.request({data: {number: 5}}).then(function (res) {
-            assert.strictEqual(res.number, 5, 'wepy.request 5 success');
-        });
-        wepy.request({data: {number: 6}}).then(function (res) {
-            assert.strictEqual(res.number, 6, 'wepy.request 6 success');
-        });
-        wepy.request({data: {number: 7}}).then(function (res) {
-            assert.strictEqual(res.number, 7, 'wepy.request 7 success');
-        });
-
-    });
-
-
-    it('api intercept return false', () => {
-
-        app.$addons.promisify = undefined;
-        app.$addons.requestfix = undefined;
-
-        app.intercept('request', {
-            config: function (p) {
-                return false;
-            }
-        });
-        wepy.request({
-            data: {number: 1},
-            success: function (res) {
-                assert.strictEqual(res.number, 2222222, 'Should not go here');
-            },
-            fail: function (e) {
-                assert.strictEqual(e, 'aborted by interceptor', 'wepy.request intercept test success');
-            }
-        });
-
-        app.use('promisify');
-        app.use('requestfix');
-
-        wepy.request({data: {number: 1}}).then(function (res) {
-            assert.strictEqual(res.number, 2222222, 'Should not go here');
-        }).catch(function (e) {
-            assert.strictEqual(e, 'aborted by interceptor', 'wepy.request intercept test success');
-        });
-    });
-
-
-    it('api intercept', () => {
-
-        app.$addons.promisify = undefined;
-        app.$addons.requestfix = undefined;
-
-        app.intercept('request', {
-            config: function (p) {
-                p.data.number++;
-                return p;
-            },
-            success: function (p) {
-                p.number++;
-                return p;
-            }
-        });
-        wepy.request({
-            data: {number: 1},
-            success: function (res) {
-                assert.strictEqual(res.number, 3, 'wepy.request intercept test success');
-            },
-            fail: function (e) {
-                assert.strictEqual(e, 2222222, 'Should not go here');
-            }
-        });
-
-        app.use('promisify');
-        app.use('requestfix');
-
-        wepy.request({data: {number: 1}}).then(function (res) {
-            assert.strictEqual(res.number, 3, 'wepy.request promisfy intercept test success');
-        }).catch(function (e) {
-            assert.strictEqual(e, 'aborted by interceptor wrong', 'Should not go here');
-        });
-
-    });
-
-
-    it('api use 3rd part', () => {
-
-        let C = function () {
-            this.name = 'addon';
-        };
-
-        app.use(C, 1, 2, 3);
-
-        assert.strictEqual(app.$addons.C.name, 'addon', '3rd part addon');
-
-    });
-
-    it('api support [upload/download]Task Object', () => {
-
-        app.$addons.promisify = undefined;
-
-        const uploadTask = wepy.uploadFile({
-            url: 'https://example.weixin.qq.com/upload', //仅为示例，非真实的接口地址
-            filePath: 'tempFilePath',
-            name: 'file',
-        })
-        // 返回的 task obj 应该有这两个方法
-        assert.strictEqual(typeof uploadTask.onProgressUpdate, 'function')
-        assert.strictEqual(typeof uploadTask.abort, 'function')
-
-        uploadTask.onProgressUpdate((res) => {
-            assert.strictEqual(res.progress, 50, 'progress should be 50');
-            assert.strictEqual(res.totalBytesSent, 512, 'totalBytesSent should be 512');
-            assert.strictEqual(res.totalBytesExpectedToSend, 1024, 'totalBytesExpectedToSend should be 512');
-            assert.notStrictEqual(res.totalBytesExpectedToSend, 2048, 'totalBytesExpectedToSend not equal 2048');
-        })
-        // should console 'upload abort'
-        uploadTask.abort()
-
-
-        const downloadTask = wepy.downloadFile({
-            url: 'https://example.weixin.qq.com/upload', //仅为示例，非真实的接口地址
-            filePath: 'tempFilePath',
-            name: 'file',
-        })
-        assert.strictEqual(typeof downloadTask.onProgressUpdate, 'function')
-        assert.strictEqual(typeof downloadTask.abort, 'function')
-
-        downloadTask.onProgressUpdate((res) => {
-            assert.strictEqual(res.progress, 50, 'progress should be 50');
-            assert.strictEqual(res.totalBytesSent, 512, 'totalBytesSent should be 512');
-            assert.strictEqual(res.totalBytesExpectedToSend, 1024, 'totalBytesExpectedToSend should be 512');
-            assert.notStrictEqual(res.totalBytesExpectedToSend, 2048, 'totalBytesExpectedToSend not equal 2048');
-        })
-        // should console 'upload abort'
-        downloadTask.abort()
-
-    });
-
-    it('use promisify api support [upload/download]Task Object with fluent methods', () => {
-
-        app.use('promisify');
-
-        wepy.uploadFile({
-            url: 'https://example.weixin.qq.com/upload', //仅为示例，非真实的接口地址
-            filePath: 'tempFilePath',
-            name: 'file',
-        })
-        .progress(res => {
-            assert.strictEqual(res.progress, 50, 'progress should be 50');
-            assert.strictEqual(res.totalBytesSent, 512, 'totalBytesSent should be 512');
-            assert.strictEqual(res.totalBytesExpectedToSend, 1024, 'totalBytesExpectedToSend should be 512');
-            assert.notStrictEqual(res.totalBytesExpectedToSend, 2048, 'totalBytesExpectedToSend not equal 2048');
-        })
-        .abort(() => console.info('uploadFile abort custom'))
-        .then((res) => {
-            assert.strictEqual(res.success, 'success', 'upload success');
-        });
-
-        wepy.downloadFile({
-            url: 'https://example.weixin.qq.com/upload', //仅为示例，非真实的接口地址
-            filePath: 'tempFilePath',
-            name: 'file',
-        })
-        .progress(res => {
-            assert.strictEqual(res.progress, 50, 'progress should be 50');
-            assert.strictEqual(res.totalBytesSent, 512, 'totalBytesSent should be 512');
-            assert.strictEqual(res.totalBytesExpectedToSend, 1024, 'totalBytesExpectedToSend should be 512');
-            assert.notStrictEqual(res.totalBytesExpectedToSend, 2048, 'totalBytesExpectedToSend not equal 2048');
-        })
-        .abort(() => console.info('downloadFile abort custom'))
-        .then((res) => {
-            assert.strictEqual(res.success, 'success', 'download success');
-        });
-    });
-});
\ No newline at end of file
diff --git a/packages/wepy/test/base.js b/packages/wepy/test/base.js
deleted file mode 100644
index 1a3fae0ee..000000000
--- a/packages/wepy/test/base.js
+++ /dev/null
@@ -1,117 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-var assert = require('assert');
-var wepy = require('../lib/wepy.js').default;
-var wxfake = require('./wxfake');
-
-
-var App = require('./fake/app');
-var Index = require('./fake/page');
-
-
-wxfake.resetGlobal();
-
-
-describe('base.js', () => {
-
-
-    it('create app', () => {
-        wxfake.resetGlobal();
-
-        let config = wepy.$createApp(App, true);
-
-        assert.strictEqual(typeof config.$app.custom, 'function', 'return a app instance');
-    });
-
-    it('create page', () => {
-        let page = wepy.$createPage(Index, true);
-
-        page.onLoad.call(wxfake.getWxPage());
-
-        assert.strictEqual(typeof page.onShow, 'function', 'return a page object');
-
-        //page.onLoad.call(wxfake.getWxPage(), {p: 1});
-
-
-        page.onShow.call(wxfake.getWxPage(), {p: 1});
-
-        let comEvt = new wepy.event('test_com_tap', page, 'test_case');
-        comEvt.$transfor({
-            currentTarget: {
-                dataset: {
-                    wpytapA: 'a',
-                    wpytapB: 'b',
-                    wpytapC: 'c'
-                }
-            }
-        });
-        page.$coma$tap(comEvt);
-
-        page.tap(new wepy.event('test_page_tap', page, 'test_case'));
-
-
-        let repeatEvt = new wepy.event('reapt_evt', page, 'test_case');
-        repeatEvt.$transfor({
-            currentTarget: {
-                dataset: {
-                    wpytapA: '1',
-                    wpytapB: '2',
-                    comIndex: '1'
-                }
-            }
-        });
-
-        page.$repeatitem$tap(repeatEvt);
-
-        assert.strictEqual(page.$page.myList[1].id, 'changed by repeat item', 'parent list changed by repeat');
-
-
-        let repeatInRepeatEvt = new wepy.event('repeat_in_repeat_evt', page, 'test_case');
-        repeatInRepeatEvt.$transfor({
-            currentTarget: {
-                dataset: {
-                    wpytapA: '100',
-                    comIndex: '1-1'
-                }
-            }
-        });
-        page.$repeatitem$repeatinrepeat$tap(repeatInRepeatEvt);
-
-
-        let repeatInRepeatEvt2 = new wepy.event('repeat_in_repeat_evt_again', page, 'test_case');
-        repeatInRepeatEvt2.$transfor({
-            currentTarget: {
-                dataset: {
-                    comIndex: '1-2'
-                }
-            }
-        });
-        page.$repeatitem$repeatinrepeat$tap2(repeatInRepeatEvt2);
-
-
-        page.custom('user_custom');
-
-
-        let index = page.$page;
-
-
-        assert.strictEqual(index instanceof Index, true, 'return a page object');
-
-        assert.strictEqual(index.$wxapp.app, global.getApp().app, '$wxapp reuturns getApp()');
-
-        assert.strictEqual(index.getCurrentPages()[0]['__wxWebviewId__'], 0, 'getCurrentPages');
-
-
-        assert.strictEqual(index.$com.coma.$wxapp.app, global.getApp().app, '$wxapp reuturns getApp()');
-
-        assert.strictEqual(index.$com.coma.getCurrentPages()[0]['__wxWebviewId__'], 0, 'getCurrentPages');
-
-    });
-});
\ No newline at end of file
diff --git a/packages/wepy/test/component.js b/packages/wepy/test/component.js
deleted file mode 100644
index 504b64c54..000000000
--- a/packages/wepy/test/component.js
+++ /dev/null
@@ -1,262 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-var assert = require('assert');
-var wepy = require('../lib/wepy.js').default;
-var wxfake = require('./wxfake');
-
-var App = require('./fake/app');
-var Index = require('./fake/page');
-var ComA = require('./fake/com_a');
-
-var ComAA = require('./fake/com_a_a');
-
-var Index = require('./fake/page');
-
-var MixinA = require('./fake/mixin');
-
-var wxfake = require('./wxfake');
-
-
-describe('component.js', () => {
-
-
-    wxfake.resetGlobal();
-
-    let appConfig = wepy.$createApp(App, true);
-    let pageConfig = wepy.$createPage(Index, true);
-    pageConfig.onLoad.call(wxfake.getWxPage());
-
-
-
-    let index = new Index();
-    index.$init(wxfake.getWxPage(), wxfake.getWxPage());
-
-    let com = new ComA();
-    com.$init(wxfake.getWxPage(), index, index);
-
-
-    com.prefix = '$coma';
-
-    it('constructor', () => {
-        try {
-            let inst = ComA();
-        } catch (e) {
-            inst = null;
-            assert.strictEqual(e instanceof TypeError, true, 'throw a TypeError');
-        }
-        assert.strictEqual(inst, null, 'Component can not call as a function');
-
-
-    });
-
-    it('new', () => {
-        assert.strictEqual(com instanceof ComA, true, 'create a component instance');
-
-        assert.strictEqual(com.$isComponent, true, 'component is not a component');
-
-    });
-
-    it('$init', () => {
-        assert.strictEqual(com.getCurrentPages()[0].__route__, 'pages/page1', 'get current pages');
-    });
-
-    it('add mixin', () => {
-
-        com.mixins = MixinA;
-        com.$initMixins();
-
-        assert.strictEqual(com.$mixins[0] instanceof MixinA, true, 'added a mixin for component');
-    });
-
-    it('setData', () => {
-        assert.deepEqual(com.setData('a', 1), {a:1}, 'set data with two string params');
-        assert.deepEqual(com.setData({'a': 1}), {a:1}, 'set data with a object');
-        assert.deepEqual(com.setData('a'), {a:1}, 'set data with one string params');
-    });
-
-
-    it('watch', () => {
-        index.testWatch = 'newVal';
-        index.testFuncWatch = 'new';
-        index.$apply();
-    });
-
-    it('$apply', () => {
-        com.a = 2;
-        com.$apply();
-
-        assert.strictEqual(com.$$phase, false, 'normal apply');
-
-
-        com.$apply(function () {
-            com.a = 3;
-        });
-        assert.strictEqual(com.$$phase, false, 'function apply');
-
-        com.$$phase = '$digest';
-        com.$apply();
-        assert.strictEqual(com.$$phase, '$apply', 'loop apply');
-
-        com.$digest();
-        assert.strictEqual(com.$$phase, false, 'digest');
-
-    });
-
-
-    it('computed test', () => {
-        com.num = 11;
-        com.$apply();
-
-        assert.strictEqual(com.computedNum, 11 * 2, 'test computed');
-    });
-
-    it('$emit', () => {
-        let page = new Index();
-        page.methods.testEmitFn = function (a, b, c, evt) {
-            assert.strictEqual(arguments.length, 4, 'test emit function arguments number');
-            assert.strictEqual(evt.name, 'test-emit-string', 'test emit function');
-            assert.strictEqual(evt.type, 'emit', 'test emit event type');
-            assert.strictEqual(evt.source, com, 'test emit event source');
-            assert.strictEqual(a + b + c, 1 + 2 + 3, 'test emit params');
-        };
-        page.events = {
-            'test-emit': function (a, b, c, evt) {
-                assert.strictEqual(arguments.length, 4, 'test emit function arguments number');
-                assert.strictEqual(evt.name, 'test-emit', 'test emit function');
-                assert.strictEqual(evt.type, 'emit', 'test emit event type');
-                assert.strictEqual(evt.source, com, 'test emit event source');
-                assert.strictEqual(a + b + c, 1 + 2 + 3, 'test emit params');
-            },
-            'test-emit-string': 'testEmitFn'
-        }
-        com.$parent = page;
-        com.$emit('test-emit', 1, 2, 3);
-        com.$emit('test-emit-string', 1, 2, 3);
-
-        page = pageConfig.$page;
-
-        try {
-            page.$com.coma.$emit('fn', 'a', 'b');
-            assert.strictEqual(false, true, 'emit an invalid method will always cause an error');
-        } catch (e) {
-        }
-
-        page.methods.customEvent = function (a, b, evt) {
-            assert.strictEqual(evt.type, 'emit', 'test emit event type');
-            assert.strictEqual(a + b, 'ab', 'test emit params');
-
-        };
-        page.$com.coma.$emit('fn', 'a', 'b');
-
-    });
-
-    it('$broadcast', () => {
-        let childCom = new ComAA();
-        let childchildCom = new ComAA();
-        childCom.$com = {
-            comaaa: childchildCom
-        };
-        childCom.methods.testBroastFn = function (a, b, c, evt) {
-            assert.strictEqual(arguments.length, 4, 'test broadcast function arguments number');
-            assert.strictEqual(evt.name, 'test-broadcast-string', 'test broadcast function');
-            assert.strictEqual(evt.type, 'broadcast', 'test broadcast event type');
-            assert.strictEqual(evt.source, com, 'test broadcast event source');
-            assert.strictEqual(a + b + c, 1 + 2 + 3, 'test broadcast params');
-        };
-        childCom.events = {
-            'test-broadcast': function (a, b, c, evt) {
-                assert.strictEqual(arguments.length, 4, 'test broadcast function arguments number');
-                assert.strictEqual(evt.name, 'test-broadcast', 'test broadcast function');
-                assert.strictEqual(evt.type, 'broadcast', 'test broadcast event type');
-                assert.strictEqual(evt.source, com, 'test broadcast event source');
-                assert.strictEqual(a + b + c, 1 + 2 + 3, 'test broadcast params');
-            },
-            'test-broadcast-string': 'testBroastFn'
-        }
-        childchildCom.events = childCom.events;
-        com.$com = {comaa: childCom, comab: childCom};
-        com.$broadcast('test-broadcast', 1, 2, 3);
-        com.$broadcast('test-broadcast-string', 1, 2, 3);
-    });
-
-    it('$invoke', () => {
-        let appConfig = wepy.$createApp(App, true);
-        let pageConfig = wepy.$createPage(Index, true);
-
-        let page = pageConfig.$page;
-        let app = appConfig.$app;
-
-        pageConfig.onLoad.call(wxfake.getWxPage());
-
-
-        page.$invoke('./coma/comaa', 'testInvoke', 'arg1', 'arg2');
-        page.$invoke('./coma/comaa', 'testCustomInvoke', 'arg1', 'arg2');
-
-    });
-
-    it('$invoke', () => {
-        let page = new Index();
-        com.$parent = page;
-        com.$root = page;
-        page.$com = {coma: com, comb: com};
-        page.customMethod = function (a, b, c) {
-            assert.strictEqual(a + b + c, 1 + 2 + 3, 'test invoke parent');
-        }
-        let childCom = new ComAA();
-        let childchildCom = new ComAA();
-        childCom.$prefix = '$coma$comaa$'
-
-        childCom.customMethod = function (a, b, c) {
-            //console.log('customMethod');
-            assert.strictEqual(a + b + c, 1 + 2 + 3, 'test invoke params');
-        };
-        childCom.methods = {
-            'method': function (evt, a, b, c) {
-                //console.log('invoke method');
-                //console.log(arguments);
-            }
-        }
-        childCom.events = {
-            'test-invoke': function (evt, a, b, c) {
-                //console.log('test-invoke');
-                assert.strictEqual(evt.name, 'test-invoke', 'test invoke function');
-                assert.strictEqual(evt.type, 'invoke', 'test invoke event type');
-                assert.strictEqual(evt.source, com, 'test invoke event source');
-                assert.strictEqual(a + b + c, 1 + 2 + 3, 'test invoke params');
-            }
-        }
-        childchildCom.$prefix = '$coma$comaa$comaaa';
-        childchildCom.events = childCom.events;
-        com.$com = {comaa: childCom, comab: childCom};
-
-        com.$invoke('comaa', 'customMethod', 1, 2, 3);
-
-        //com.$invoke('comaa', 'tap', 1, 2, 3);
-
-        com.$invoke('/', 'customMethod', 1, 2, 3);
-        com.$invoke('/coma/comaa', 'customMethod', 1, 2, 3);
-        com.$invoke('../comb', 'customMethod', 1, 2, 3);
-        com.$invoke('./comaa', 'customMethod', 1, 2, 3);
-        try {
-            com.$invoke('comaa', 'undefinedFunc', 1, 2, 3);
-        } catch (e) {
-            assert.strictEqual(e.message.indexOf('Invalid method') > -1, true, 'test invoke undefined method');
-        }
-
-        try {
-            com.$invoke('comx', 'undefinedFunc', 1, 2, 3);
-        } catch (e) {
-            assert.strictEqual(e.message.indexOf('Invalid path') > -1, true, 'test invoke undefined method');
-        }
-
-    });
-
-
-});
diff --git a/packages/wepy/test/event.js b/packages/wepy/test/event.js
deleted file mode 100644
index 7ff5edd45..000000000
--- a/packages/wepy/test/event.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-var assert = require('assert');
-var event = require('../lib/event.js').default;
-
-
-describe('event.js', () => {
-
-    it('new', () => {
-        let inst = new event();
-        assert.strictEqual(inst.active, true, 'event default active');
-    });
-
-    it('destroy', () => {
-        let inst = new event();
-        inst.$destroy();
-        assert.strictEqual(inst.active, false, 'event destroy');
-    });
-
-    it('transfor', () => {
-        let inst = new event();
-        inst.$transfor({a:1});
-        assert.strictEqual(inst.a, 1, 'event transfor');
-
-    });
-
-    it('constructor', () => {
-        try {
-            let inst = event();
-        } catch (e) {
-            inst = null;
-            assert.strictEqual(e instanceof TypeError, true, 'throw a TypeError');
-        }
-        assert.strictEqual(inst, null, 'event can not call as a function');
-    });
-});
\ No newline at end of file
diff --git a/packages/wepy/test/fake/app.js b/packages/wepy/test/fake/app.js
deleted file mode 100644
index d4d34422a..000000000
--- a/packages/wepy/test/fake/app.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-let assert = require('assert');
-
-let wepy = require('../../lib/wepy.js').default;
-
-module.exports = class App extends wepy.app {
-
-    custom () {}
-}
\ No newline at end of file
diff --git a/packages/wepy/test/fake/com_a.js b/packages/wepy/test/fake/com_a.js
deleted file mode 100644
index 12aefe9c5..000000000
--- a/packages/wepy/test/fake/com_a.js
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-let assert = require('assert');
-
-let wepy = require('../../lib/wepy.js').default;
-
-let ComAA = require('./com_a_a');
-
-
-function Car() {
-
-}
-Car.prototype.run = function () {}
-
-module.exports = class Com extends wepy.component {
-
-
-    constructor () {
-        super();
-        this.data = {
-            'a': 1,
-            'num': 10,
-        };
-        this.computed = {
-            computedNum: function () {
-                return this.num * 2;
-            }
-        };
-        this.methods = {
-            'tap': function (a, b, c, evt) {
-                assert.strictEqual(evt.name, 'test_com_tap', 'com tap triggered');
-                assert.strictEqual(a, 'a', 'com tap triggered with addtional params');
-                assert.strictEqual(b, 'b', 'com tap triggered with addtional params');
-                assert.strictEqual(c, 'c', 'com tap triggered with addtional params');
-            }
-        };
-
-        this.components = {
-            comaa: ComAA
-        }
-
-        this.props = {
-            comprop1: String,
-            comprop2: [Number, String, Boolean],
-            comprop3: {
-                coerce: function (v) {
-                    return +v;
-                },
-                default: 50
-            },
-            comprop4: Object,
-            comprop5: {
-                default: 60
-            },
-            onceProp: {
-                default: 70
-            },
-            staticDefault: {
-                default: 'static'
-            },
-            funcProp: {
-                default: function () {
-                    return 'func';
-                }
-            },
-            staticAndCoerce: {
-                default: 1,
-                coerce: function (v) {
-                    return v + 1;
-                }
-            },
-
-            syncProp: {
-                default: 80
-            },
-            twoWayProp: {
-                default: 70,
-                twoWay: true
-            },
-            comprop10: {
-                type: [Boolean, Function, Object, Array, Car],
-                coerce: function (v) {
-                    return v + 1;
-                },
-                default: function () {
-                    return 50
-                }
-            },
-        };
-
-        this.$props = {
-            comaa: { 'v-bind:comaaprop.sync': 'twoWayProp' }
-        };
-    }
-
-    customMethod () {
-
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy/test/fake/com_a_a.js b/packages/wepy/test/fake/com_a_a.js
deleted file mode 100644
index 76b09ae4c..000000000
--- a/packages/wepy/test/fake/com_a_a.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-let assert = require('assert');
-
-let wepy = require('../../lib/wepy.js').default;
-
-module.exports = class Com extends wepy.component {
-    constructor () {
-        super();
-        this.data = {
-            'a': 1
-        };
-        this.methods = {
-            'tap': function (evt) {
-                assert.strictEqual(evt.name, 'test_com_tap', 'com tap triggered');
-            },
-            'testInvoke': function (arg1, arg2, evt) {
-                assert.strictEqual(arguments.length, 3, 'testInvoke argument number');
-                assert.strictEqual(arg1, 'arg1', 'testInvoke argument 1');
-                assert.strictEqual(arg2, 'arg2', 'testInvoke argument 2');
-                assert.strictEqual(evt.type, 'invoke', 'testInvoke event type');
-            }
-        };
-
-
-
-        this.props = {
-            'comaaprop': {
-                twoWay: true
-            }
-        };
-    }
-
-    customMethod () {
-
-    }
-
-    testCustomInvoke (arg1, arg2) {
-        assert.strictEqual(arguments.length, 2, 'testCustomInvoke argument number');
-        assert.strictEqual(arg1, 'arg1', 'testCustomInvoke argument 1');
-        assert.strictEqual(arg2, 'arg2', 'testCustomInvoke argument 2');
-    }
-}
diff --git a/packages/wepy/test/fake/com_b.js b/packages/wepy/test/fake/com_b.js
deleted file mode 100644
index 200e11ba2..000000000
--- a/packages/wepy/test/fake/com_b.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-let assert = require('assert');
-
-let wepy = require('../../lib/wepy.js').default;
-
-module.exports = class Com extends wepy.component {
-
-
-    constructor () {
-        super();
-        this.data = {
-            'a': 1
-        };
-
-        this.props = ['combprop1', 'combprop2'];
-    }
-
-}
\ No newline at end of file
diff --git a/packages/wepy/test/fake/com_c.js b/packages/wepy/test/fake/com_c.js
deleted file mode 100644
index 9a71ddefd..000000000
--- a/packages/wepy/test/fake/com_c.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-let assert = require('assert');
-
-let wepy = require('../../lib/wepy.js').default;
-
-module.exports = class Com extends wepy.component {
-
-
-    constructor () {
-        super();
-        this.data = function () {
-            return {
-                key: 'test function data'
-            };
-        };
-        this.props = ['combprop1', 'combprop2'];
-    }
-
-}
diff --git a/packages/wepy/test/fake/mixin.js b/packages/wepy/test/fake/mixin.js
deleted file mode 100644
index 89da1edd3..000000000
--- a/packages/wepy/test/fake/mixin.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-let assert = require('assert');
-
-let wepy = require('../../lib/wepy.js').default;
-
-module.exports = class Mix extends wepy.mixin {
-    constructor () {
-        super();
-        this.data = {
-            'a': 1
-        };
-        this.methods = {
-            'tap': function () {},
-            'notInPage': function () {}
-        };
-    }
-
-    func1 () {
-        return 'mixin-func1';
-    }
-
-    func2 () {
-        return 'mixin-func2';
-    }
-
-    onLoad() {
-
-    }
-
-    onShow () {
-
-    }
-}
diff --git a/packages/wepy/test/fake/page.js b/packages/wepy/test/fake/page.js
deleted file mode 100644
index 90c25f695..000000000
--- a/packages/wepy/test/fake/page.js
+++ /dev/null
@@ -1,127 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-let assert = require('assert');
-
-let wepy = require('../../lib/wepy.js').default;
-let Mix = require('./mixin');
-let ComA = require('./com_a');
-let ComB = require('./com_b');
-let ComC = require('./com_c');
-
-
-let RepeatItem = require('./repeatItem');
-
-module.exports = class Index extends wepy.page {
-    constructor () {
-        super(1, 2, 3);
-        this.methods = {
-            'tap': function (evt) {
-                assert.strictEqual(evt.name, 'test_page_tap', 'page tap triggered');
-            },
-            'testFuncWatch': function (curVal, oldVal) {
-                assert.strictEqual(curVal, 'new', 'data function watch change');
-                assert.strictEqual(oldVal, 'old', 'data function watch change');
-            }
-        };
-        this.components = {
-            coma: ComA,
-            comb: ComB,
-            comc: ComC,
-            repeatitem: RepeatItem
-        };
-        this.watch = {
-            testWatch: function (curVal, oldVal) {
-                assert.strictEqual(curVal, 'newVal', 'data watch change');
-                assert.strictEqual(oldVal, 'oldVal', 'data watch change');
-            },
-            testFuncWatch: 'testFuncWatch'
-        };
-        this.data = {
-            'testWatch': 'oldVal',
-            'testFuncWatch': 'old',
-            'a': 1,
-            'objProp': {a:1},
-            'c': 'string',
-            'stringNumber': '123',
-            'testValid': '50',
-            myList: [{
-                id: 1,
-                name: '点击改变',
-                list: [{
-                    childid: '1.1',
-                    childname: '子项，点我改变'
-                }, {
-                    childid: '1.2',
-                    childname: '子项，点我改变'
-                }, {
-                    childid: '1.3',
-                    childname: '子项，点我改变'
-                }]
-            }, {
-                id: 2,
-                name: '点击改变',
-                list: [{
-                    childid: '2.1',
-                    childname: '子项，点我改变'
-                }, {
-                    childid: '2.2',
-                    childname: '子项，点我改变'
-                }, {
-                    childid: '2.3',
-                    childname: '子项，点我改变'
-                }]
-            }, {
-                id: 3,
-                name: '点击改变',
-                list: [{
-                    childid: '3.1',
-                    childname: '子项，点我改变'
-                }]
-            }]
-        };
-        this.mixins = [Mix];
-
-        this.$props = {
-            coma: {
-                'v-bind:comprop1.once': 'c',
-                'comprop2': 'static props',
-                'v-bind:comprop4.once': 'objProp',
-                'v-bind:onceProp.once': 'testValid',
-                'v-bind:syncProp.sync': 'testValid',
-                'v-bind:twoWayProp.once': 'testValid',
-                'v-bind:comprop3.once': 'stringNumber',
-                'v-bind:comprop10.once': 'a'
-            },
-            'repeatitem': { 
-                'v-bind:ritem.once': { 'for': 'myList', 'item': 'item', 'index': 'index', 'key': 'key', 'value': 'item' }, 
-                'v-bind:rindex.once': { 'for': 'myList', 'item': 'item', 'index': 'index', 'key': 'key', 'value': 'index' }
-            } 
-        };
-
-        this.$events = {
-            coma: {
-                'v-on:fn': 'customEvent'
-            }
-        };
-    }
-    onShow (args) {
-        assert.strictEqual(this instanceof Index, true, 'page onShow triggered, this is self');
-        assert.strictEqual(args.p, 1, 'page onShow triggered with params');
-    }
-    custom (arg) {
-        assert.strictEqual(this instanceof Index, true, 'page custom method triggered, this is self');
-        assert.strictEqual(arg, 'user_custom', 'page custom method triggered with params');
-    }
-
-
-    func1 () {
-        return 'parent-func1';
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy/test/fake/page2.js b/packages/wepy/test/fake/page2.js
deleted file mode 100644
index fed93752a..000000000
--- a/packages/wepy/test/fake/page2.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-let assert = require('assert');
-
-let wepy = require('../../lib/wepy.js').default;
-
-module.exports = class Page2 extends wepy.page {
-    constructor () {
-        super(1, 2, 3);
-        this.methods = {
-        };
-        this.components = {
-        };
-        this.data = {
-        };
-
-        this.$props = {
-        };
-
-        this.$events = {
-        };
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy/test/fake/repeatItem.js b/packages/wepy/test/fake/repeatItem.js
deleted file mode 100644
index 3cee78766..000000000
--- a/packages/wepy/test/fake/repeatItem.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-let assert = require('assert');
-
-let wepy = require('../../lib/wepy.js').default;
-
-
-let RepeatInRepeatItem = require('./repeatinrepeat');
-
-
-module.exports = class RepeatItem extends wepy.component {
-
-
-    constructor () {
-        super();
-        this.data = {
-        };
-        this.computed = {
-        };
-        this.methods = {
-            tap: function (a, b, e) {
-                assert.strictEqual(this.ritem.id, 2, 'repeat items events triggered');
-                assert.strictEqual(e.name, 'reapt_evt', 'reapt_evt argument number');
-                assert.strictEqual(a, '1', 'reapt_evt argument 1');
-                assert.strictEqual(b, '2', 'reapt_evt argument 2');
-                this.ritem.id = 'changed by repeat item';
-            }
-        };
-
-        this.components = {
-            repeatinrepeat: RepeatInRepeatItem
-        }
-
-        this.props = {
-            ritem: Object,
-            rindex: String,
-        };
-
-        this.$props = {
-            'repeatinrepeat': { 
-                'v-bind:rritem.once': { 'for': 'ritem.list', 'item': 'item', 'index': 'index', 'key': 'key', 'value': 'item' } 
-            }
-        };
-    }
-
-    customMethod () {
-
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy/test/fake/repeatinrepeat.js b/packages/wepy/test/fake/repeatinrepeat.js
deleted file mode 100644
index 12c6ed67a..000000000
--- a/packages/wepy/test/fake/repeatinrepeat.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-let assert = require('assert');
-
-let wepy = require('../../lib/wepy.js').default;
-
-
-module.exports = class RepeatInRepeat extends wepy.component {
-
-
-    constructor () {
-        super();
-        this.data = {
-        };
-        this.computed = {
-        };
-        this.methods = {
-            tap: function (a, e) {
-                assert.strictEqual(this.rritem.childid, '2.2', 'repeat in repeat items events triggered');
-                assert.strictEqual(e.name, 'repeat_in_repeat_evt', 'repeat_in_repeat_evt argument number');
-                assert.strictEqual(a, '100', 'repeat_in_repeat_evt argument 1');
-            },
-            tap2: function (e) {
-                assert.strictEqual(this.rritem.childid, '2.3', 'repeat in repeat items events triggered');
-                assert.strictEqual(e.name, 'repeat_in_repeat_evt_again', 'repeat_in_repeat_evt_again argument number');
-            }
-        };
-
-        this.components = {
-        }
-
-        this.props = {
-            rritem: Object,
-        };
-
-        this.$props = {
-        };
-    }
-
-    customMethod () {
-
-    }
-}
\ No newline at end of file
diff --git a/packages/wepy/test/index.js b/packages/wepy/test/index.js
deleted file mode 100644
index e8d0e96ae..000000000
--- a/packages/wepy/test/index.js
+++ /dev/null
@@ -1,178 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
- 
-var assert = require('assert');
-var wepy = require('../lib/wepy.js').default;
-
-
-describe('index.js', () => {
-    it('wepy.$isEmpty', () => {
-        assert.strictEqual(wepy.$isEmpty({}), true, '{} is empty');
-        assert.strictEqual(wepy.$isEmpty([]), true, '[] is empty');
-    });
-
-
-    it('wepy.$isDeepEqual', () => {
-        let a = {a:{b:{c:{d:1}}}};
-        let b = {a:{b:{c:{d:2}}}};
-        assert.strictEqual(wepy.$isDeepEqual(a, b), false);
-
-
-        let c = {a:{b:[1,2,3,{e:[12,3,{a:'1'}]}]}};
-        let d = {a:{b:[1,2,3,{e:[12,3,{a:'1'}]}]}};
-        assert.strictEqual(wepy.$isDeepEqual(c, d), true);
-
-
-        a = {a:{b:[1,2,3,{e:[12,3,{a:'1'}]}]}};
-        b = {a:{b:[1,2,3,{e:[12,3,{a:'1'}]}]}};
-        assert.strictEqual(wepy.$isDeepEqual(a, b), true);
-
-
-        assert.strictEqual(wepy.$isDeepEqual(new String('123'), '123'), true, 'compare new String');
-
-        assert.strictEqual(wepy.$isDeepEqual(new Number('123'), 123), true, 'compare new Number');
-
-        assert.strictEqual(wepy.$isDeepEqual(/^a/, new RegExp('^a')), true, 'compare reg express');
-
-        assert.strictEqual(wepy.$isDeepEqual(true, true), true, 'compare Boolean');
-
-        assert.strictEqual(wepy.$isDeepEqual(NaN, NaN), true, 'compare NaN');
-
-        assert.strictEqual(wepy.$isDeepEqual(0, 0), true, 'compare 0');
-
-        let date = new Date();
-        let cdate = new Date(+date);
-
-        assert.strictEqual(wepy.$isDeepEqual(date, cdate), true, 'compare Date');
-
-
-        assert.strictEqual(wepy.$isDeepEqual(Symbol('123'), Symbol('123')), false, 'compare Symbol');
-
-        assert.strictEqual(wepy.$isDeepEqual(void 0, void 0), true, 'compare undefined');
-
-        assert.strictEqual(wepy.$isDeepEqual(function () {return this}, function () {return this}), false, 'compare function');
-
-        assert.strictEqual(wepy.$isDeepEqual(new function () {return this}, new function () {return this}), false, 'compare new instance');
-
-    });
-    it('wepy.$isEqual', () => {
-        let a = {a:{b:[1,2,3,{e:[12,3,{a:'1'}]}]}};
-        let b = {a:{b:[1,2,3,{e:[12,3,{a:'1'}]}]}};
-        assert.equal(wepy.$isEqual(a, b), true, 'wepy.$isEqual({a:{b:[1,2,3,{e:[12,3,{a:\'1\'}]}]}}, {a:{b:[1,2,3,{e:[12,3,{a:\'1\'}]}]}})');
-
-
-        assert.equal(wepy.$isEqual(null, undefined), false, 'wepy.$isEqual(null, undeifned)');
-
-        assert.equal(wepy.$isEqual(0, false), false, 'wepy.$isEqual(0, false)');
-
-        assert.equal(wepy.$isEqual(0, 0), true, 'compare 0');
-
-        assert.equal(wepy.$isEqual(NaN, NaN), true, 'compare NaN');
-
-
-        assert.equal(wepy.$isEqual(undefined, 0), false, 'compare undefined');
-
-        assert.equal(wepy.$isEqual([1], 1), false, 'wepy.$isEqual([1], 1)');
-
-        assert.equal(wepy.$isEqual('a', 'a'), true, 'wepy.$isEqual(\'a\', \'a\')');
-
-    });
-    it('wepy.$has', () => {
-        let a = {a: 1};
-        let b = 'a';
-        assert.strictEqual(wepy.$has(a, b), true, 'wepy.$has({a:1},a)');
-
-        a = {a:{b:2}};
-        b = 'b';
-        assert.strictEqual(wepy.$has(a, b), false, 'wepy.$has({a:{b:2}},b)');
-
-
-        assert.strictEqual(wepy.$has({a: {b: 'foo'}}, ['a', 'b']), true, 'can check for nested properties.');
-        assert.strictEqual(wepy.$has({a: {b: 'foo'}}, ['a', 'c']), false, 'can check for nested properties.');
-    });
-    // extends
-    it('wepy.$extend', () => {
-        let result;
-
-        assert.strictEqual(wepy.$extend({a: 'b'}).a, 'b', 'only 1 arguments');
-
-        assert.strictEqual(wepy.$extend(1, {a: 'b'}).a, 'b', 'target is not a object');
-        assert.strictEqual(wepy.$extend({}, {a: 'b'}).a, 'b', 'can extend an object with the attributes of another');
-        assert.strictEqual(wepy.$extend({a: 'x'}, {a: 'b'}).a, 'b', 'properties in source override destination');
-        assert.strictEqual(wepy.$extend({x: 'x'}, {a: 'b'}).x, 'x', 'properties not in source don\'t get overridden');
-
-
-        result = wepy.$extend({x: 'x'}, {a: 'a'}, {b: 'b'});
-        assert.deepEqual(result, {x: 'x', a: 'a', b: 'b'}, 'can extend from multiple source objects');
-        result = wepy.$extend({x: 'x'}, {a: 'a', x: 2}, {a: 'b'});
-        assert.deepEqual(result, {x: 2, a: 'b'}, 'extending from multiple source objects last property trumps');
-        result = wepy.$extend({}, {a: void 0, b: null});
-        assert.deepEqual(Object.keys(result), ['a', 'b'], 'bring in undefined values');
-
-
-        var F = function() {};
-        F.prototype = {a: 'b'};
-        var subObj = new F();
-        subObj.c = 'd';
-        assert.deepEqual(wepy.$extend({}, subObj), {a: 'b', c: 'd'}, 'extend copies all properties from source');
-        wepy.$extend(subObj, {});
-        assert.deepEqual(subObj.hasOwnProperty('a'), false, 'extend does not convert destination object\'s \'in\' properties to \'own\' properties');
-
-        result = {};
-        wepy.$extend(result, null, void 0, {a: 1});
-
-        assert.strictEqual(result.a, 1, 'should not error on `null` or `undefined` sources');
-
-        assert.deepEqual(wepy.$extend(null, {a: 1}), {a: 1}, 'extending null');
-        assert.deepEqual(wepy.$extend(void 0, {a: 1}), {a: 1}, 'extending undefined');
-    });
-
-
-
-    // copy
-    it('wepy.$copy', () => {
-        let original, changed;
-
-
-        assert.strictEqual(wepy.$copy(1), 1, 'copy a number');
-        assert.strictEqual(wepy.$copy('a'), 'a', 'copy a string');
-        assert.strictEqual(wepy.$copy(void 0), void 0, 'copy undefined');
-        assert.strictEqual(wepy.$copy(null), null, 'copy null');
-        assert.strictEqual(wepy.$copy(false), false, 'copy boolean');
-
-        original = function () {};
-
-        assert.strictEqual(wepy.$copy(original), original, 'copy funciton');
-        assert.deepEqual(wepy.$copy([1,2,3]), [1, 2, 3], 'copy array');
-
-        original = {a:{b:[1,2,{c:3}]}};
-        changed = wepy.$copy(original);
-        changed.a.b[2].c=4;
-        assert.deepEqual(changed, original, 'copy object without deep');
-
-        original = {a:{b:[1,2,{c:3}]}};
-        changed = wepy.$copy(original, true);
-        changed.a.b[2].c=4;
-
-        assert.strictEqual(wepy.$isEqual(changed, original), false, 'copy object with deep');
-
-        original = {a:{b:[1,2,{c:3}, {d: void 0}]}};
-        changed = wepy.$copy(original, true);
-
-        assert.strictEqual(wepy.$isEqual(changed, original), true, 'copy object with undefined with deep');
-
-
-    });
-
-
-
-
-
-})
\ No newline at end of file
diff --git a/packages/wepy/test/mixin.js b/packages/wepy/test/mixin.js
deleted file mode 100644
index 83bd0c999..000000000
--- a/packages/wepy/test/mixin.js
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-var assert = require('assert');
-var wepy = require('../lib/wepy.js').default;
-var mixin = require('../lib/mixin.js').default;
-var wxfake = require('./wxfake');
-var Index = require('./fake/page');
-var App = require('./fake/app');
-
-
-describe('mixin.js', () => {
-
-
-    let inst = new mixin();
-
-    it('constructor', () => {
-        try {
-            let mix = mixin();
-        } catch (e) {
-            mix = null;
-            assert.strictEqual(e instanceof TypeError, true, 'throw a TypeError');
-        }
-        assert.strictEqual(mix, null, 'mixin can not call as a function');
-    });
-
-    it('new', () => {
-        assert.strictEqual(Object.keys(inst.data).length, 0, 'mixin default active');
-    });
-
-    it('add mixin property', () => {
-        inst.data = {a: 1};
-        inst.methods = {
-            foo: function () {
-
-            }
-        }
-        assert.strictEqual(inst.data.a, 1, 'mixin data');
-    });
-
-    it('$init', () => {
-        let parent = {data: {b: 2, a: 2}};
-        inst.data = {a: 1, c: 1};
-        inst.$init(parent);
-
-        assert.strictEqual(parent.data.a, 2, 'parent data covered if exsit in parent.');
-        assert.strictEqual(parent.data.c, 1, 'mixin data copied if not exsit in parent.');
-    });
-
-
-    it('mixin function', () => {
-        let appConfig = wepy.$createApp(App, true);
-        let pageConfig = wepy.$createPage(Index, true);
-
-        let page = pageConfig.$page;
-        let app = appConfig.$app;
-
-        pageConfig.onLoad.call(wxfake.getWxPage());
-
-
-        assert.strictEqual(page.func1(), 'parent-func1', 'mixin customize function wont copy if parent function exsit.');
-        assert.strictEqual(page.func2(), 'mixin-func2', 'mixin customize function will copy if parent function exsit.');
-
-    });
-
-});
\ No newline at end of file
diff --git a/packages/wepy/test/page.js b/packages/wepy/test/page.js
deleted file mode 100644
index bf6527c0e..000000000
--- a/packages/wepy/test/page.js
+++ /dev/null
@@ -1,248 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-var assert = require('assert');
-var wepy = require('../lib/wepy.js').default;
-var native = require('../lib/native.js').default;
-var wxfake = require('./wxfake');
-
-wxfake.resetGlobal();
-
-var Index = require('./fake/page');
-var Page2 = require('./fake/page2');
-var App = require('./fake/app');
-
-
-let appConfig = wepy.$createApp(App, true);
-wepy.$instance = appConfig.$app;
-
-let pageConfig = wepy.$createPage(Index, 'pages/page1', true);
-let page2Config = wepy.$createPage(Page2, 'pages/page2', true);
-let page = pageConfig.$page;
-let app = appConfig.$app;
-
-pageConfig.onLoad.call(wxfake.getWxPage());
-pageConfig.onShow.call(wxfake.getWxPage(), {p: 1});
-
-
-describe('page.js', () => {
-
-    it('constructor', () => {
-        try {
-            let inst = Index();
-        } catch (e) {
-            inst = null;
-            assert.strictEqual(e instanceof TypeError, true, 'throw a TypeError');
-        }
-        assert.strictEqual(inst, null, 'Page can not call as a function');
-    });
-
-    it('private params', () => {
-        assert.strictEqual(page.$parent.__route__, 'pages/page1', '__route__');
-        assert.strictEqual(page.$parent.__prevPage__.$name, page.$name, '__prevPage__');
-    });
-
-    it('wx instance', () => {
-
-        assert.strictEqual(page.$wxapp.app, 'app', 'wxapp equal getApp()');
-
-        assert.strictEqual(page.getCurrentPages()[0]['__wxWebviewId__'], 0, 'getCurrentPages');
-
-        // app created many times in test case, can not make a object compare here.
-        assert.strictEqual(page.$parent.$wxapp.app, app.$wxapp.app, 'page\'s parent is page');
-
-        assert.strictEqual(page.$root, page, 'page\'s parent is page');
-
-        assert.strictEqual(page.$com.coma.$parent, page, 'component\'s parent is page');
-
-        assert.strictEqual(page.$com.coma.$root, page, 'component\'s root is page');
-
-        assert.strictEqual(page.$com.coma.$com.comaa.$parent, page.$com.coma, 'component\'s parent is parent component');
-
-        assert.strictEqual(page.$com.coma.$com.comaa.$root, page, 'component\'s root is page');
-
-
-    });
-
-    it('new', () => {
-
-        let page = new Index();
-
-        assert.strictEqual(page instanceof Index, true, 'create a page instance');
-
-        assert.strictEqual(page.$isComponent, false, 'page is not a component');
-
-    });
-
-
-    it('props', () => {
-        let pageConfig = wepy.$createPage(Index, true);
-        let page = pageConfig.$page;
-
-        pageConfig.onLoad.call(wxfake.getWxPage());
-
-        assert.strictEqual(page.$com.coma.comprop2, 'static props', 'static props checking');
-
-        assert.strictEqual(page.$com.coma.comprop3, 123, 'coerce change string to int');
-
-        assert.strictEqual(page.$com.coma.comprop4.a, 1, 'test object prop');
-
-        assert.strictEqual(page.$com.coma.comprop5, 60, 'test prop static default value');
-
-        assert.strictEqual(page.$com.coma.staticDefault, 'static', 'test prop static default value again');
-
-        assert.strictEqual(page.$com.coma.funcProp, 'func', 'test prop function default value');
-
-        assert.strictEqual(page.$com.coma.staticAndCoerce, 2, 'test prop default value with coerce');
-
-
-
-        assert.strictEqual(page.$com.coma.onceProp, '50', 'test once prop validate');
-        assert.strictEqual(page.$com.coma.syncProp, '50', 'test sync prop validate');
-        assert.strictEqual(page.$com.coma.twoWayProp, '50', 'test two way prop validate');
-
-        page.$com.coma.onceProp = 80;
-        page.$com.coma.$apply();
-
-        assert.strictEqual(page.testValid, '50', 'child prop.once changed will not change parent props');
-
-        page.testValid = 90;
-        page.$apply();
-
-
-        assert.strictEqual(page.$com.coma.onceProp, 80, 'parent prop.once changed will not change child props');
-        assert.strictEqual(page.$com.coma.twoWayProp, '50', 'parent prop.once changed will not change child props, even child prop is two way');
-
-
-        assert.strictEqual(page.$com.coma.syncProp, 90, 'parent prop.sync changed will change child props');
-
-        page.$com.coma.syncProp = 91;
-        page.$com.coma.$apply();
-
-        assert.strictEqual(page.testValid, 90, 'child prop changed will not change parent prop.sync');
-
-
-        page.$com.coma.twoWayProp = 92;
-        page.$com.coma.$apply();
-        assert.strictEqual(page.testValid, 92, 'child two way prop changed will change parent prop even it is once prop');
-
-        assert.strictEqual(page.$com.coma.syncProp, 92, 'sync prop changed, because parent prop changed');
-
-
-
-
-
-        assert.strictEqual(page.$com.coma.$com.comaa.comaaprop, 92, 'prop goes to all children');
-
-        page.$com.coma.$com.comaa.comaaprop = 100;
-        page.$com.coma.$com.comaa.$apply();
-
-        assert.strictEqual(page.$com.coma.twoWayProp, 100, 'parent prop changed will trigger child data changed');
-        assert.strictEqual(page.testValid, 100, 'child prop changed will trigger parent data changed');
-
-    });
-
-
-
-    it('$preload', () => {
-
-        
-        wepy.$instance.__prevPage__ = page;
-
-        let page2 = page2Config.$page;
-
-        page.$preload('a', 1);
-
-        page.$preload({b: 2, c: 3});
-
-        assert.strictEqual(Object.keys(page.$preloadData).length, 3, 'page preload testing arguments length');
-        assert.strictEqual(page.$preloadData.a, 1, 'page preload testing params 1');
-        assert.strictEqual(page.$preloadData.b, 2, 'page preload testing params 2');
-        assert.strictEqual(page.$preloadData.c, 3, 'page preload testing params 3');
-        
-
-
-        page2.onPrefetch = function (params, data) {
-            assert.strictEqual(params.a, 1, 'page preload testing params 1');
-            assert.strictEqual(params.b, 2, 'page preload testing params 1');
-            assert.strictEqual(data.from, page, 'page preload data from');
-            assert.strictEqual(data.preload.a, 1, 'page preload data 1');
-            assert.strictEqual(data.preload.b, 2, 'page preload data 2');
-            assert.strictEqual(data.preload.c, 3, 'page preload data 3');
-        };
-
-        page.$redirect('./page2', {a: 1, b: 2});
-
-        page2Config.onLoad.call(wxfake.getWxPage(), {a: 1, b: 2});
-        page2Config.onShow.call(wxfake.getWxPage());
-
-        assert.strictEqual(Object.keys(page.$preloadData).length, 0, 'page preload data will be cleared after redirect');
-
-
-        page2.$back();
-
-        pageConfig.onShow.call(wxfake.getWxPage(), {p: 1});
-
-        page.$preload({e: 2, f: 3});
-
-
-        page2.onPrefetch = function (params, data) {
-            assert.strictEqual(data.from, page, 'page preload data from');
-            assert.strictEqual(data.preload.e, 2, 'page preload data 1');
-            assert.strictEqual(data.preload.f, 3, 'page preload data 2');
-        };
-
-
-        page.$navigate({url: './page2?aa=1&bb=2'});
-
-        page2Config.onLoad.call(wxfake.getWxPage(), {aa: 1, bb: 2});
-        page2Config.onShow.call(wxfake.getWxPage());
-
-        page2.$back(5);
-
-        page.$switch('./page2');
-
-    });
-
-
-
-    it('onPrefetch', () => {
-        wepy.$instance.__prevPage__ = page;
-
-        let page2 = page2Config.$page;
-
-        page2.onPrefetch = function () {
-            return {time: 10};
-        };
-
-        page2.onLoad = function (params, data) {
-            assert.strictEqual(params.a, 1, 'page onload testing params 1');
-            assert.strictEqual(params.b, 2, 'page onload testing params 1');
-            assert.strictEqual(data.from, page, 'page onload data from');
-            assert.strictEqual(data.preload.e, 2, 'page onload data 1');
-            assert.strictEqual(data.preload.f, 3, 'page onload data 2');
-            assert.strictEqual(data.prefetch.time, 10, 'page prefetch data');
-        };
-
-        page.$preload({e: 2, f: 3});
-
-        page.$redirect('./page2', {a: 1, b: 2});
-
-        page2Config.onLoad.call(wxfake.getWxPage(), {a: 1, b: 2});
-    });
-
-
-    it('onReady', () => {
-        page2Config.onReady.call(wxfake.getWxPage());
-    });
-
-
-
-
-});
\ No newline at end of file
diff --git a/packages/wepy/test/util.js b/packages/wepy/test/util.js
deleted file mode 100644
index cd05b6e74..000000000
--- a/packages/wepy/test/util.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-
-var assert = require('assert');
-var util = require('../lib/util.js').default;
-
-
-describe('util.js', () => {
-
-    it('$resolvePath', () => {
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', 'page2'), '/page/abc/efg/hij/page2', `resolvePath('/page/abc/efg/hij/klm', 'page2')`);
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', '.'), '/page/abc/efg/hij/klm', `resolvePath('/page/abc/efg/hij/klm', '.')`);
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', '..'), '/page/abc/efg/hij/klm', `resolvePath('/page/abc/efg/hij/klm', '..')`);
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', 'a'), '/page/abc/efg/hij/a', `resolvePath('/page/abc/efg/hij/klm', 'a')`);
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', '.page2'), '/page/abc/efg/hij/page2', `resolvePath('/page/abc/efg/hij/klm', '.page2')`);
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', '.a'), '/page/abc/efg/hij/a', `resolvePath('/page/abc/efg/hij/klm', '.a')`);
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', '..page2'), '/page/abc/efg/hij/page2', `resolvePath('/page/abc/efg/hij/klm', '..page2')`);
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', '..aa'), '/page/abc/efg/hij/aa', `resolvePath('/page/abc/efg/hij/klm', '..aa')`);
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', './page2'), '/page/abc/efg/hij/page2', `resolvePath('/page/abc/efg/hij/klm', './page2')`);
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', '../page2'), '/page/abc/efg/page2', `resolvePath('/page/abc/efg/hij/klm', '../page2')`);
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', '.../page2'), '/page/abc/efg/page2', `resolvePath('/page/abc/efg/hij/klm', '.../page2')`);
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', '..../page2'), '/page/abc/efg/page2', `resolvePath('/page/abc/efg/hij/klm', '..../page2')`);
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', './../page2'), '/page/abc/efg/page2', `resolvePath('/page/abc/efg/hij/klm', './../page2')`);
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', './../../page2'), '/page/abc/page2', `resolvePath('/page/abc/efg/hij/klm', './../../page2')`);
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', './../.../page2'), '/page/abc/page2', `resolvePath('/page/abc/efg/hij/klm', './../.../page2')`);
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', './../../../page2'), '/page/page2', `resolvePath('/page/abc/efg/hij/klm', './../../../page2')`);
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', './../../../../page2'), '/page2', `resolvePath('/page/abc/efg/hij/klm', './../../../../page2')`);
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', './../../../../../page2'), '/page2', `resolvePath('/page/abc/efg/hij/klm', './../../../../page2')`);
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', '/page2'), '/page2', `resolvePath('/page/abc/efg/hij/klm', '/page2')`);
-
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', '//page2'), '/page2', `resolvePath('/page/abc/efg/hij/klm', '//page2')`);
-        assert.strictEqual(util.$resolvePath('/page/abc/efg/hij/klm', '/./page2'), '/page2', `resolvePath('/page/abc/efg/hij/klm', '/./page2')`);
-
-    });
-
-
-
-
-    it('$getParams', () => {
-
-        let p;
-
-        p = util.$getParams('index?a=1&b=2');
-
-        assert.strictEqual(Object.keys(p).length, 2, `$getParams('index?a=1&b=2')`);
-        assert.strictEqual(p.a, '1');
-        assert.strictEqual(p.b, '2');
-
-        p = util.$getParams('index?a=1&b=2&c=' + encodeURIComponent('中国'));
-
-        assert.strictEqual(Object.keys(p).length, 3, `$getParams('index?a=1&b=2')`);
-        assert.strictEqual(p.a, '1');
-        assert.strictEqual(p.b, '2');
-        assert.strictEqual(p.c, '中国');
-
-    });
-
-});
\ No newline at end of file
diff --git a/packages/wepy/test/wxfake.js b/packages/wepy/test/wxfake.js
deleted file mode 100644
index a7908cfa1..000000000
--- a/packages/wepy/test/wxfake.js
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * Tencent is pleased to support the open source community by making WePY available.
- * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
- * 
- * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
- * http://opensource.org/licenses/MIT
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- */
-
-module.exports = {
-    resetGlobal: function () {
-        if (typeof(window) !== 'undefined') {
-            global = window;
-        } else if (typeof(global) !== 'undefined') {
-            global = global;
-        } else {
-            gloabl = Function('return this')();
-        }
-
-        global.wx = {
-            request: function (p) {
-                p.success({
-                    number: p.data.number
-                });
-                p.complete({
-                    complete: 'complete'
-                });
-            },
-            pauseVoice: function () {},
-            getUserInfo: function (p) {
-                p.success({
-                    name: 'fakeID'
-                });
-                p.complete({
-                    complete: 'complete'
-                });
-            },
-            login: function (p) {
-                p.fail({
-                    code: 'xxx'
-                });
-                p.complete({
-                    complete: 'complete'
-                });
-            },
-            createCanvasContext: function () {
-                return 'createCanvasContext';
-            },
-            redirectTo: function () {
-                //console.log('redirectTo')
-            },
-            navigateTo: function () {
-                //console.log('navigateTo');
-            },
-            switchTab: function () {
-                //console.log('switchTab');
-            },
-            navigateBack: function () {
-                //console.log('navigateBack');
-            },
-            uploadFile: function (p) {
-                p.success({
-                    success: 'success'
-                });
-                p.complete({
-                    complete: 'complete'
-                });
-
-                const uploadTask = {
-                    onProgressUpdate: (callback) => callback({
-                        progress: 50,
-                        totalBytesSent: 512,
-                        totalBytesExpectedToSend: 1024
-                    }),
-                    abort: () => console.log('upload abort')
-                }
-                return uploadTask
-            },
-            downloadFile: function (p) {
-                p.success({
-                    success: 'success'
-                });
-                p.complete({
-                    complete: 'complete'
-                });
-
-                const downloadTask = {
-                    onProgressUpdate: (callback) => callback({
-                        progress: 50,
-                        totalBytesSent: 512,
-                        totalBytesExpectedToSend: 1024
-                    }),
-                    abort: () => console.log('download abort')
-                }
-                return downloadTask
-            },
-        };
-
-        global.getApp = function () { return {app:'app'}; };
-        global.getCurrentPages = function () { 
-            return [{__route__: 'pages/page1', __wxWebviewId__: 0}]; 
-        };
-    },
-    getWxPage: function () {
-        return {
-            $root: { '$wxapp': { app: 'app' } },
-            setData: function (v) { return v; },
-            $coma$comaa$tap: function () {
-                return arguments;
-            }
-        };
-    }
-};
\ No newline at end of file
diff --git a/packages/x/CHANGELOG.md b/packages/x/CHANGELOG.md
new file mode 100644
index 000000000..d2ebcba75
--- /dev/null
+++ b/packages/x/CHANGELOG.md
@@ -0,0 +1,64 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# 2.1.0 (2020-07-04)
+
+**Note:** Version bump only for package @wepy/x
+
+
+
+
+
+# 2.1.0-alpha.10 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/x
+
+
+
+
+
+# 2.1.0-alpha.9 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/x
+
+
+
+
+
+# 2.1.0-alpha.8 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/x
+
+
+
+
+
+# 2.1.0-alpha.7 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/x
+
+
+
+
+
+# 2.1.0-alpha.6 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/x
+
+
+
+
+
+# 2.1.0-alpha.5 (2020-06-21)
+
+**Note:** Version bump only for package @wepy/x
+
+
+
+
+
+# [2.1.0-alpha.4](https://github.com/Tencent/wepy/compare/v2.1.0-alpha.2...v2.1.0-alpha.4) (2020-06-20)
+
+**Note:** Version bump only for package @wepy/x
diff --git a/packages/x/README.md b/packages/x/README.md
new file mode 100644
index 000000000..2f51ce8b4
--- /dev/null
+++ b/packages/x/README.md
@@ -0,0 +1,78 @@
+[English](./README_EN.md) | 简体中文
+
+# WePY 2.0中的Vuex 
+
+## 安装
+
+```
+npm install @wepy/x vuex --save
+```
+
+## 用法
+
+1. 安装Vuex 
+
+```
+// app.wpy
+import wepy from '@wepy/core';
+import vuex from '@wepy/x';
+
+wepy.use(vuex);
+```
+
+2. 初始化store
+
+```
+// ~/store.js
+import Vuex from '@wepy/x';
+
+export default new Vuex.Store({
+  state: {
+    num: 0
+  },
+  mutations: {
+    increment (state) {
+      state.num++;
+    }
+  },
+  actions: {
+    increment ({ commit }) {
+      commit('increment');
+    },
+    incrementAsync ({ commit }) {
+      setTimeout(() => commit('increment'), 1000);
+    }
+  }
+})
+```
+
+3. 映射到组件
+
+```
+// ~/counter.wpy
+<template>
+  <div> {{num}} </div>
+  <button @tap="increment"> Increment </button>
+  <button @tap="incrementAsync"> Increment Async </button>
+</template>
+<script>
+import wepy from '@wepy/core';
+import { mapState, mapActions } from '@wepy/x';
+
+wepy.component({
+  computed: {
+    ...mapState([ 'num' ])
+  },
+  methods: {
+    ...mapActions([ 'increment', 'incrementAsync' ])
+  }
+})
+```
+
+## 文件
+
+[https://vuex.vuejs.org/](https://vuex.vuejs.org/)
+
+## 其他
+
+目前不支持 [Vuex 模块](https://vuex.vuejs.org/guide/modules.html) 。  在此处检查 [问题](https://github.com/Tencent/wepy/issues/2191) 。
\ No newline at end of file
diff --git a/packages/x/README_EN.md b/packages/x/README_EN.md
new file mode 100644
index 000000000..022c38187
--- /dev/null
+++ b/packages/x/README_EN.md
@@ -0,0 +1,73 @@
+English | [简体中文](./README.md)
+
+# Vuex in WePY 2.0 
+
+## Install
+
+```
+npm install @wepy/x vuex --save
+```
+
+## Usage
+
+1. Install Vuex 
+```
+// app.wpy
+import wepy from '@wepy/core';
+import vuex from '@wepy/x';
+
+wepy.use(vuex);
+```
+
+2. Initialize a store
+```
+// ~/store.js
+import Vuex from '@wepy/x';
+
+export default new Vuex.Store({
+  state: {
+    num: 0
+  },
+  mutations: {
+    increment (state) {
+      state.num++;
+    }
+  },
+  actions: {
+    increment ({ commit }) {
+      commit('increment');
+    },
+    incrementAsync ({ commit }) {
+      setTimeout(() => commit('increment'), 1000);
+    }
+  }
+})
+```
+
+3. Map to Component
+```
+// ~/counter.wpy
+<template>
+  <div> {{num}} </div>
+  <button @tap="increment"> Increment </button>
+  <button @tap="incrementAsync"> Increment Async </button>
+</template>
+<script>
+import wepy from '@wepy/core';
+import { mapState, mapActions } from '@wepy/x';
+
+wepy.component({
+  computed: {
+    ...mapState([ 'num' ])
+  },
+  methods: {
+    ...mapActions([ 'increment', 'incrementAsync' ])
+  }
+})
+```
+
+## Document 
+[https://vuex.vuejs.org/](https://vuex.vuejs.org/)
+
+## Other
+[Vuex Module](https://vuex.vuejs.org/guide/modules.html) is not supportted currently. Check the [Issue](https://github.com/Tencent/wepy/issues/2191) here.
diff --git a/packages/x/dist/index.js b/packages/x/dist/index.js
new file mode 100644
index 000000000..6382d0493
--- /dev/null
+++ b/packages/x/dist/index.js
@@ -0,0 +1,53 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+var vuex = require('vuex');
+
+var version = "2.0.4";
+
+function wepyInstall(wepy) {
+  vuex.install(wepy);
+
+  wepy.mixin({
+    created: function() {
+      var this$1 = this;
+
+      var computed = this.$options.computed;
+      var loop = function ( k ) {
+        if (computed[k].vuex) {
+          this$1.$watch(
+            k,
+            function() {
+              this._computedWatchers[k].evaluate();
+            },
+            { deep: true }
+          );
+        }
+      };
+
+      for (var k in computed) loop( k );
+    }
+  });
+}
+
+var index = {
+  Store: vuex.Store,
+  install: wepyInstall,
+  version: version,
+  mapState: vuex.mapState,
+  mapMutations: vuex.mapMutations,
+  mapGetters: vuex.mapGetters,
+  mapActions: vuex.mapActions,
+  createNamespacedHelpers: vuex.createNamespacedHelpers
+};
+
+exports.Store = vuex.Store;
+exports.mapState = vuex.mapState;
+exports.mapMutations = vuex.mapMutations;
+exports.mapGetters = vuex.mapGetters;
+exports.mapActions = vuex.mapActions;
+exports.createNamespacedHelpers = vuex.createNamespacedHelpers;
+exports.default = index;
+exports.install = wepyInstall;
+exports.version = version;
diff --git a/packages/x/index.js b/packages/x/index.js
new file mode 100644
index 000000000..ad0b67767
--- /dev/null
+++ b/packages/x/index.js
@@ -0,0 +1,65 @@
+import { Store, install, mapState, mapMutations, mapGetters, mapActions, createNamespacedHelpers } from 'vuex';
+
+const version = __VERSION__;
+
+function wepyInstall(wepy) {
+  install(wepy);
+
+  wepy.mixin({
+    created: function() {
+      let computed = this.$options.computed;
+      for (let k in computed) {
+        if (computed[k].vuex) {
+          this.$watch(
+            k,
+            function() {
+              this._computedWatchers[k].evaluate();
+            },
+            { deep: true }
+          );
+        }
+      }
+    },
+    // When page unload, page instance will lose.
+    // But the store data dependences they are still present
+    onUnload: function () {
+      // List all keys in computed watchers
+      for (let key in this._computedWatchers) {
+        const item = this._computedWatchers[key];
+        // Clean deps
+        item.deps = item.deps.filter(dep => {
+          // If sub.vm === current page, then remove it
+          dep.subs = dep.subs.filter(sub => sub.vm !== this);
+          if (dep.subs.length === 0) {
+            // Remove dep ids
+            item.depIds.delete(dep.id);
+            return false;
+          }
+          return true;
+        })
+      }
+    }
+  });
+}
+
+export default {
+  Store,
+  install: wepyInstall,
+  version,
+  mapState,
+  mapMutations,
+  mapGetters,
+  mapActions,
+  createNamespacedHelpers
+};
+
+export {
+  Store,
+  wepyInstall as install,
+  version,
+  mapState,
+  mapMutations,
+  mapGetters,
+  mapActions,
+  createNamespacedHelpers
+};
diff --git a/packages/x/package-lock.json b/packages/x/package-lock.json
new file mode 100644
index 000000000..bc1586c22
--- /dev/null
+++ b/packages/x/package-lock.json
@@ -0,0 +1,13 @@
+{
+	"name": "@wepy/x",
+	"version": "2.1.0",
+	"lockfileVersion": 1,
+	"requires": true,
+	"dependencies": {
+		"vuex": {
+			"version": "3.1.3",
+			"resolved": "https://registry.npmjs.org/vuex/-/vuex-3.1.3.tgz",
+			"integrity": "sha512-k8vZqNMSNMgKelVZAPYw5MNb2xWSmVgCKtYKAptvm9YtZiOXnRXFWu//Y9zQNORTrm3dNj1n/WaZZI26tIX6Mw=="
+		}
+	}
+}
diff --git a/packages/x/package.json b/packages/x/package.json
new file mode 100644
index 000000000..95adc1bc7
--- /dev/null
+++ b/packages/x/package.json
@@ -0,0 +1,33 @@
+{
+  "name": "@wepy/x",
+  "version": "2.1.1-alpha.0",
+  "description": "Vuex in WePY",
+  "main": "dist/index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/Tencent/wepy.git"
+  },
+  "keywords": [
+    "Vuex",
+    "WePY"
+  ],
+  "author": {
+    "name": "Gcaufy",
+    "email": "gcaufy@gmail.com"
+  },
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/Tencent/wepy/issues"
+  },
+  "homepage": "https://github.com/Tencent/wepy#readme",
+  "dependencies": {
+    "vuex": "^3.1.1"
+  },
+  "readme": "ERROR: No README data found!",
+  "_id": "@wepy/x@2.1.1-alpha.0",
+  "_commitid": "8358ad2",
+  "gitHead": "5a25776457360bbbbc54a4d059f6bc7c032d5df3"
+}
diff --git a/scripts/bootstrap.sh b/scripts/bootstrap.sh
old mode 100644
new mode 100755
index d54509b3c..904bba118
--- a/scripts/bootstrap.sh
+++ b/scripts/bootstrap.sh
@@ -1,6 +1,8 @@
-#!/bin/sh
+#!/bin/bash
 set -e
 
+prod=$1
+
 info() {
     printf "\e[34m[➧]\e[0m ${1}\n"
 }
@@ -24,9 +26,9 @@ function toPosixPath() {
 # Install packages, if yarn is installed then use yarn to install packages.
 function installPackage() {
     if type yarn >/dev/null 2>&1; then
-        yarn
+        yarn install $prod
     else
-        npm install
+        npm install $prod
     fi
 }
 
@@ -45,14 +47,18 @@ if [ "$uname"x = "Darwin"x ]; then
     globalDirForPosix="$globalDirForPosix/bin"
 fi
 
+
+if [ "$prod"x = "--production"x ]; then
+
 # Generate dev and debug bin file
-array=( dev debug )
-for mod in "${array[@]}"
-do
+  array=( dev debug )
+  for mod in "${array[@]}"
+  do
     params=""
     if [ "$mod"x = "debug"x ]; then
         params=" --inspect-brk"
     fi
+
     cat > "$globalDirForPosix/wepy-$mod" <<- EOF
 #!/bin/sh
 basedir=\$(dirname "\$(echo "\$0" | sed -e 's,\\\\,/,g')")
@@ -64,21 +70,21 @@ esac
 if [ -x "\$basedir/node" ]; then
   "\$basedir/node"$params "$currentDirForPosix/packages/wepy-cli/bin/wepy.js" "\$@"
   ret=\$?
-else 
+else
   node$params "$currentDirForPosix/packages/wepy-cli/bin/wepy.js" "\$@"
   ret=\$?
 fi
 exit \$ret
 EOF
 
-chmod +x "$globalDirForPosix/wepy-$mod"
-success "generated: $globalDirForPosix/wepy-$mod"
+    chmod +x "$globalDirForPosix/wepy-$mod"
+    success "generated: $globalDirForPosix/wepy-$mod"
 
 
     # If it's win then generate cmd file
     if [ "$os"x = "win"x  ]; then
 
-        cat > "$globalDirForPosix/wepy-$mod.cmd" <<- EOF
+      cat > "$globalDirForPosix/wepy-$mod.cmd" <<- EOF
 @IF EXIST "%~dp0\node.exe" (
   "%~dp0\node.exe"$params "$currentDirForWin\packages\wepy-cli\bin\wepy.js" %*
 ) ELSE (
@@ -89,12 +95,12 @@ success "generated: $globalDirForPosix/wepy-$mod"
 )
 EOF
 
-        success "generated: $globalDirForPosix/wepy-$mod.cmd"
+      success "generated: $globalDirForPosix/wepy-$mod.cmd"
 
     fi
-done
-
+  done
 
+fi
 
 cd $currentDirForPosix
 
diff --git a/scripts/build.js b/scripts/build.js
new file mode 100644
index 000000000..8fed9f243
--- /dev/null
+++ b/scripts/build.js
@@ -0,0 +1,57 @@
+const path = require('path');
+const fs = require('fs-extra');
+const rollup = require('rollup');
+const zlib = require('zlib');
+const config = require('./config');
+
+function build(config) {
+  let output = config.output;
+  let { file } = output;
+
+  return rollup
+    .rollup(config)
+    .then(bundle => bundle.generate(output))
+    .then(rst => {
+      write(file, rst.code);
+    })
+    .catch(e => {
+      throw e;
+    });
+}
+
+function write(dest, code, zip) {
+  return new Promise((resolve, reject) => {
+    function report(extra) {
+      // eslint-disable-next-line
+      console.log(blue(path.relative(process.cwd(), dest)) + ' ' + getSize(code) + (extra || ''));
+      resolve();
+    }
+
+    fs.outputFile(dest, code)
+      .then(() => {
+        if (zip) {
+          zlib.gzip(code, (err, zipped) => {
+            if (err) return reject(err);
+            report(' (gzipped: ' + getSize(zipped) + ')');
+          });
+        } else {
+          report();
+        }
+      })
+      .catch(reject);
+  });
+}
+
+function getSize(code) {
+  return (code.length / 1024).toFixed(2) + 'kb';
+}
+
+function blue(str) {
+  return '\x1b[1m\x1b[34m' + str + '\x1b[39m\x1b[22m';
+}
+
+let configs = config.getAllBuilds();
+
+configs.forEach(config => {
+  build(config);
+});
diff --git a/scripts/build.sh b/scripts/build.sh
old mode 100644
new mode 100755
index 0702a9b34..d3e19f3f2
--- a/scripts/build.sh
+++ b/scripts/build.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 set -e
 
 if [ -z "$TEST_GREP" ]; then
@@ -16,4 +16,4 @@ cd packages/wepy/
 babel --presets es2015,stage-1 src/ --out-dir lib/ --source-maps
 
 cd ../wepy-cli/
-babel --presets es2015,stage-1 src/ --out-dir lib/ --source-maps
\ No newline at end of file
+babel --presets es2015,stage-1 src/ --out-dir lib/ --source-maps
diff --git a/scripts/ci-release.js b/scripts/ci-release.js
new file mode 100644
index 000000000..813371c59
--- /dev/null
+++ b/scripts/ci-release.js
@@ -0,0 +1,73 @@
+/* eslint no-console: 0 */
+
+const execa = require('execa');
+
+const ALLOW_VERSION = ['major', 'minor', 'patch', 'premajor', 'preminor', 'prepatch', 'prerelease'];
+const ALLOW_TAG = ['alpha', 'beta', 'next'];
+
+// release: major release
+// release: patch release on alpha
+// release: prepatch release on beta
+
+function parseMsg(msg) {
+  if (!msg.startsWith('release:')) {
+    throw Error('This is not a release message');
+  }
+  const words = msg.replace('release: ', '').split(' ');
+  const version = words[0];
+  const tag = words[3];
+
+  if (ALLOW_VERSION.indexOf(version) === -1) {
+    throw new Error(`Invalid version: ${version}`);
+  }
+
+  if (tag && ALLOW_TAG.indexOf(tag) === -1) {
+    throw new Error(`Invalid tag: ${tag}`);
+  }
+
+  return {
+    version,
+    tag
+  };
+}
+
+function release(version, tag) {
+  console.log(`Ready to release a ${version} version${tag ? ' on ' + tag : ''}.`);
+
+  const cmds = [
+    'lerna',
+    'version',
+    version,
+    '--yes',
+    '--force-publish',
+    '--conventional-commits',
+    '--create-release',
+    'github'
+  ];
+
+  if (tag) {
+    // cmds.push('--dist-tag', tag);
+  }
+  console.log('EXEC: ' + cmds.join(' '));
+
+  execa('npx', cmds)
+    .then(res => console.log(res.stdout))
+    .then(() => {
+      const cmds = ['lerna', 'exec', '--', 'npm', 'publish', '--access', 'public'];
+      if (tag) {
+        cmds.push('--tag', tag);
+      }
+      return execa('npx', cmds);
+    })
+    .then(res => console.log(res.stdout))
+    .catch(e => console.log(e));
+}
+
+const commitMsg = process.env.COMMIT_MESSAGE;
+
+if (commitMsg) {
+  const { version, tag } = parseMsg(commitMsg);
+
+  release(version, tag);
+}
+
diff --git a/scripts/clean.js b/scripts/clean.js
new file mode 100644
index 000000000..5bdcd231d
--- /dev/null
+++ b/scripts/clean.js
@@ -0,0 +1,10 @@
+const rimraf = require('rimraf');
+
+console.log('Clear all dependencies');
+
+rimraf.sync('node_modules');
+rimraf.sync('yarn.lock');
+rimraf.sync('package-lock.json');
+rimraf.sync('packages/*/node_modules');
+rimraf.sync('packages/*/yarn.lock');
+rimraf.sync('packages/*/package-lock.json');
diff --git a/scripts/clean.sh b/scripts/clean.sh
deleted file mode 100644
index bc65394b4..000000000
--- a/scripts/clean.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/sh
-set -e
-
-if [ -z "$TEST_GREP" ]; then
-   TEST_GREP=""
-fi
-
-node="node"
-
-if [ "$TEST_DEBUG" ]; then
-   node="node --inspect --debug-brk"
-fi
-
-
-rm -rf packages/*/node_modules
-rm -rf packages/*/lib
diff --git a/scripts/config.js b/scripts/config.js
new file mode 100644
index 000000000..8844d1571
--- /dev/null
+++ b/scripts/config.js
@@ -0,0 +1,102 @@
+const buble = require('rollup-plugin-buble');
+const replace = require('rollup-plugin-replace');
+const path = require('path');
+
+const banner = `
+ /* Tencent is pleased to support the open source community by making WePY available.
+ * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
+ * http://opensource.org/licenses/MIT
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */`;
+
+const resolvePkgInfo = pkg => {
+  const pkgPath = path.resolve(__dirname, '../packages', pkg, 'package.json');
+  return require(pkgPath);
+};
+
+const builds = {
+  core: {
+    entry: 'packages/core/index.js',
+    dest: 'packages/core/dist/wepy.js',
+    env: 'development',
+    format: 'cjs',
+    version: resolvePkgInfo('core').version,
+    banner
+  },
+  'core-ant': {
+    entry: 'packages/core/index.ant.js',
+    dest: 'packages/core/dist/wepy.ant.js',
+    env: 'development',
+    format: 'cjs',
+    version: resolvePkgInfo('core').version,
+    banner
+  },
+  redux: {
+    entry: 'packages/redux/index.js',
+    dest: 'packages/redux/dist/index.js',
+    env: 'development',
+    format: 'cjs',
+    version: resolvePkgInfo('redux').version,
+    banner
+  },
+  x: {
+    entry: 'packages/x/index.js',
+    dest: 'packages/x/dist/index.js',
+    env: 'development',
+    format: 'cjs',
+    version: resolvePkgInfo('x').version,
+    banner
+  },
+  'use-promisify': {
+    entry: 'packages/use-promisify/index.js',
+    dest: 'packages/use-promisify/dist/index.js',
+    env: 'development',
+    format: 'cjs',
+    version: resolvePkgInfo('use-promisify').version,
+    banner
+  },
+  'use-intercept': {
+    entry: 'packages/use-intercept/index.js',
+    dest: 'packages/use-intercept/dist/index.js',
+    env: 'development',
+    format: 'cjs',
+    version: resolvePkgInfo('use-intercept').version,
+    banner
+  }
+};
+
+function getConfig(name) {
+  let opt = builds[name];
+  let config = {
+    input: opt.entry,
+    external: opt.external,
+    plugins: [
+      buble({
+        objectAssign: 'Object.assign'
+      })
+    ].concat(opt.options || []),
+    output: {
+      file: opt.dest,
+      format: opt.format,
+      banner: opt.banner,
+      name: opt.moduleName || 'WePY'
+    }
+  };
+  if (opt.env) {
+    config.plugins.push(
+      replace({
+        'process.env.NODE_ENV': JSON.stringify(opt.env),
+        __VERSION__: JSON.stringify(opt.version)
+      })
+    );
+  }
+  return config;
+}
+if (process.env.TARGET) {
+  module.exports = getConfig(process.env.TARGET);
+} else {
+  exports.getBuild = getConfig;
+  exports.getAllBuilds = () => Object.keys(builds).map(getConfig);
+}
diff --git a/scripts/gen.sh b/scripts/gen.sh
deleted file mode 100644
index 2a92cef01..000000000
--- a/scripts/gen.sh
+++ /dev/null
@@ -1,97 +0,0 @@
-#!/bin/sh
-
-
-# test wepy new demo
-
-# Start in tasks/ even if run from root directory
-cd "$(dirname "$0")"
-
-function cleanup() {
-    echo 'Cleaning up.'
-}
-
-
-# Error messages are redirected to stderr
-function handle_error() {
-    echo "$(basename $0): ERROR! An error was encountered executing line $1." 1>&2;
-    cleanup
-    echo 'Exiting with error.' 1>&2;
-    exit 1
-}
-
-
-function handle_exit() {
-    cleanup
-    echo 'Exiting without error.' 1>&2;
-    exit
-}
-
-
-# Exit the script with a helpful error message when any error is encountered
-trap 'set +x; handle_error $LINENO $BASH_COMMAND' ERR
-
-# Cleanup before exit on any termination signal
-trap 'set +x; handle_exit' SIGQUIT SIGTERM SIGINT SIGKILL SIGHUP
-
-# Echo every command being executed
-set -x
-
-
-# Go to root
-cd ..
-root_path=$PWD
-
-
-npm link packages/wepy-cli
-
-
-wepy -v
-
-wepy new demo
-
-wepy new emptydemo --empty
-
-wepy new reduxdemo --redux
-
-wepy new nolintdemo --no-lint
-
-cd demo
-node "$root_path"/packages/wepy-cli/bin/wepy.js build
-
-node "$root_path"/packages/wepy-cli/bin/wepy.js build --output web
-
-node "$root_path"/packages/wepy-cli/bin/wepy.js build --output web --platform qq
-
-node "$root_path"/packages/wepy-cli/bin/wepy.js build --output web --platform wechat
-
-node "$root_path"/packages/wepy-cli/bin/wepy.js build --output ant
-
-cd ../emptydemo
-node "$root_path"/packages/wepy-cli/bin/wepy.js build
-
-cd ../nolintdemo
-node "$root_path"/packages/wepy-cli/bin/wepy.js build
-
-cd ../reduxdemo
-node "$root_path"/packages/wepy-cli/bin/wepy.js build
-
-
-cd ..
-# Test build demos
-
-git clone https://github.com/wepyjs/wepy-wechat-demo.git
-
-cd wepy-wechat-demo
-npm install
-node "$root_path"/packages/wepy-cli/bin/wepy.js build
-npm run build
-
-cd ..
-git clone https://github.com/wepyjs/wepy-weui-demo.git
-cd wepy-weui-demo
-npm install
-node "$root_path"/packages/wepy-cli/bin/wepy.js build
-npm run build
-
-# Cleanup
-cleanup
\ No newline at end of file
diff --git a/scripts/install_dev.sh b/scripts/install_dev.sh
new file mode 100755
index 000000000..18dc4f843
--- /dev/null
+++ b/scripts/install_dev.sh
@@ -0,0 +1,91 @@
+#!/bin/bash
+set -e
+
+prod=$1
+
+info() {
+    printf "\e[34m[➧]\e[0m ${1}\n"
+}
+
+error() {
+    printf "\e[31m[✘]\e[0m ${1}\n"
+}
+
+success() {
+    printf "\e[32m[✔]\e[0m ${1}\n"
+}
+
+function toWinPath() {
+    echo "$1" | sed -e 's/^\///' -e 's/\//\\/g' -e 's/^./\0:/'
+}
+
+function toPosixPath() {
+    echo "/$1" | sed -e 's/\\/\//g' -e 's/://' -e 's/\/\//\//g'
+}
+
+
+globalDirForWin=$(npm config get prefix)
+currentDirForPosix=$(pwd)
+
+currentDirForWin=$(toWinPath $currentDirForPosix)
+globalDirForPosix=$(toPosixPath $globalDirForWin)
+
+
+os="win"
+uname=$(uname)
+
+if [ "$uname"x = "Darwin"x ]; then
+    os="mac"
+    globalDirForPosix="$globalDirForPosix/bin"
+fi
+
+
+# Generate dev and debug bin file
+array=( dev debug )
+for mod in "${array[@]}"
+do
+  params=""
+  if [ "$mod"x = "debug"x ]; then
+      params=" --inspect-brk"
+  fi
+
+  cat > "$globalDirForPosix/wepy-$mod" <<- EOF
+#!/bin/sh
+basedir=\$(dirname "\$(echo "\$0" | sed -e 's,\\\\,/,g')")
+
+case \`uname\` in
+  *CYGWIN*) basedir=\`cygpath -w "\$basedir"\`;;
+esac
+
+if [ -x "\$basedir/node" ]; then
+"\$basedir/node"$params "$currentDirForPosix/packages/cli/bin/wepy.js" "\$@"
+ret=\$?
+else
+node$params "$currentDirForPosix/packages/cli/bin/wepy.js" "\$@"
+ret=\$?
+fi
+exit \$ret
+EOF
+
+  chmod +x "$globalDirForPosix/wepy-$mod"
+  success "generated: $globalDirForPosix/wepy-$mod"
+
+
+  # If it's win then generate cmd file
+  if [ "$os"x = "win"x  ]; then
+
+    cat > "$globalDirForPosix/wepy-$mod.cmd" <<- EOF
+@IF EXIST "%~dp0\node.exe" (
+"%~dp0\node.exe"$params "$currentDirForWin\packages\cli\bin\wepy.js" %*
+) ELSE (
+@SETLOCAL
+@SET PATHEXT=%PATHEXT:;.JS;=;%
+node$params "$currentDirForWin\packages\cli\bin\wepy.js" %*
+
+)
+EOF
+
+    success "generated: $globalDirForPosix/wepy-$mod.cmd"
+
+  fi
+done
diff --git a/scripts/npm-ci-release.js b/scripts/npm-ci-release.js
new file mode 100644
index 000000000..4e77aee51
--- /dev/null
+++ b/scripts/npm-ci-release.js
@@ -0,0 +1,45 @@
+/* eslint no-console: 0 */
+
+const path = require('path');
+const execa = require('execa');
+
+const version = process.argv[2];
+// @wepy/cli@2.0.0-alpha.11
+
+if (!version.startsWith('@wepy')) {
+  console.log('Do nothing with this version: "' + version + '"');
+  process.exit();
+}
+const client = 'npm';
+// eslint-disable-next-line no-unused-vars
+const [_, packageName, ver] = version.split('@');
+const dirname = packageName.split('/')[1];
+
+if (!dirname || !ver) {
+  console.log('Invalid version: "' + version + '"');
+  process.exit();
+}
+
+const tag = ver.indexOf('alpha') > -1 ? 'alpha' : ver.indexOf('beta') > -1 ? 'beta' : '';
+
+let publishParams = ['publish', '--access', 'public'];
+
+if (tag) {
+  publishParams = publishParams.concat(['--tag', tag]);
+}
+
+const cwd = path.join(process.cwd(), 'packages', dirname);
+
+console.log('CWD: ' + cwd);
+console.log('EXEC: ' + [client].concat(publishParams).join(' '));
+
+execa(client, publishParams, { cwd })
+  .then(res => {
+    console.log(res.stdout);
+    const distTagParams = ['dist-tag', 'add', version, 'next'];
+    console.log('EXEC: ' + [client].concat(distTagParams).join(' '));
+    return execa(client, distTagParams, { cwd });
+  })
+  .catch(e => {
+    console.log(e);
+  });
diff --git a/scripts/npm-tags.js b/scripts/npm-tags.js
new file mode 100644
index 000000000..24aa7a541
--- /dev/null
+++ b/scripts/npm-tags.js
@@ -0,0 +1,48 @@
+const fs = require('fs');
+const path = require('path');
+const { spawnSync } = require('child_process');
+
+/**
+ *
+ * Useage:
+ * node ./scripts/npm-tags.js beta next
+ */
+
+const packages = fs.readdirSync(path.join(__dirname, '..', 'packages'));
+
+function updateAllTag(oldTag, newTag) {
+  packages.forEach(pkg => {
+    updateOneTag(pkg, oldTag, newTag);
+  });
+}
+
+function updateOneTag(pkg, oldTag, newTag) {
+  process.env.FORCE_COLOR = 1;
+
+  const npmPkgName = `@wepy/${pkg}`;
+
+  const viewCmd = ['npm', 'view', npmPkgName, 'dist-tags.' + oldTag];
+
+  console.log('EXEC: ' + viewCmd.join(' '));
+
+  const res = spawnSync(viewCmd.shift(), viewCmd);
+
+  const version = res.stdout.toString('utf-8').trim();
+
+  console.log('OUTPUT: ' + version);
+
+  const addCmd = ['npm', 'dist-tag', 'add', npmPkgName + '@' + version, newTag];
+
+  console.log('EXEC: ' + addCmd.join(' '));
+
+  const outputRes = spawnSync(addCmd.shift(), addCmd);
+
+  const output = outputRes.stdout.toString('utf-8').trim();
+
+  console.log('OUTPUT: ' + output);
+}
+
+// eslint-disable-next-line no-unused-vars
+(function main([bin, file, ...args]) {
+  updateAllTag.apply(null, args);
+})(process.argv);
diff --git a/scripts/npm_publish/index.js b/scripts/npm_publish/index.js
new file mode 100755
index 000000000..e83cfa972
--- /dev/null
+++ b/scripts/npm_publish/index.js
@@ -0,0 +1,31 @@
+#!/usr/bin/env node
+
+const commander = require('commander');
+const autoPublish = require('./lib/auto');
+const interactPublish = require('./lib/interact');
+const isGitWorkTreeClean = require('./lib/check_repo_clean');
+const log = require('./lib/log');
+
+isGitWorkTreeClean()
+  .then(() => {
+    commander
+      .command('publish [name]')
+      .option('-t, --tag <tag>', 'publish tag')
+      .option('-v, --version <ver>', 'publish version')
+      .option('-i, --increase <increase>', 'version increase')
+      .option('-q, --no-interact', 'with out interact')
+      .action(function(name, opt) {
+        name = name || '*';
+
+        if (opt.interact) {
+          interactPublish(name, opt);
+        } else {
+          autoPublish(name, opt);
+        }
+      });
+
+    commander.parse(process.argv);
+  })
+  .catch(e => {
+    log.error(e.message);
+  });
diff --git a/scripts/npm_publish/lib/auto.js b/scripts/npm_publish/lib/auto.js
new file mode 100644
index 000000000..6ee078980
--- /dev/null
+++ b/scripts/npm_publish/lib/auto.js
@@ -0,0 +1,92 @@
+const path = require('path');
+const readPkg = require('read-pkg');
+const writePkg = require('write-pkg');
+const semver = require('semver');
+
+const execa = require('execa');
+
+const log = require('./log');
+
+const githash = () => execa('git', ['rev-parse', '--short', 'HEAD']).then(rst => rst.stdout);
+
+const gitadd = files => execa('git', ['add'].concat(files));
+
+const gitcommit = msg => execa('git', ['commit', '-m', `${msg}`, '--no-verify']);
+
+const gittag = msg => execa('git', ['tag', `${msg}`]);
+
+const gitpush = () => execa('git', ['push']);
+
+const gitpushtag = () => execa('git', ['push', '--tags']);
+
+const publishParams = ['publish', '.', '--access=public'];
+
+const npmpublish = tag => execa('npm', tag ? publishParams.concat(['--tag', tag]) : publishParams);
+
+/*
+ * auto publish a npm package
+ */
+module.exports = function autoPublish(nameOrPkg, opt) {
+  let pkg;
+  if (!opt.interact) {
+    if (!opt.name) {
+      log.error('Missing a package name');
+      return;
+    }
+    if (!opt.ver && !opt.increase) {
+      log.error('You have to set a version or a increase');
+      return;
+    }
+  }
+
+  if (typeof nameOrPkg === 'string') {
+    // Enter directory
+    let cwd = path.join('packages', nameOrPkg);
+    process.chdir(cwd);
+    pkg = readPkg.sync({ cwd: './' });
+  } else {
+    pkg = nameOrPkg;
+  }
+
+  // Only give a increase
+  if (!opt.interact && opt.increase && !opt.ver) {
+    opt.ver = opt.tag ? semver.inc(pkg.version, opt.increase, opt.tag) : semver.inc(pkg.version, opt.increase);
+  }
+
+  return githash()
+    .then(hash => {
+      let id = `${pkg.name}@${opt.ver}`;
+      log.info('Writing package.json');
+      return writePkg(Object.assign({}, pkg, { version: opt.ver, _id: id, _commitid: hash })).then(() => {
+        log.info('Tag: ' + id);
+        gitadd('package.json')
+          .then(() => {
+            return gitcommit('release: ' + id);
+          })
+          .then(() => {
+            return gittag(id);
+          })
+          .then(() => {
+            return gitpush();
+          })
+          .then(() => {
+            return gitpushtag();
+          })
+          .then(() => {
+            log.info('Pushing to npm');
+            if (opt.tag && opt.tag !== 'release') {
+              return npmpublish(opt.tag);
+            } else {
+              return npmpublish();
+            }
+          })
+          .then(() => {
+            log.success('done');
+            return true;
+          });
+      });
+    })
+    .catch(e => {
+      log.error(e);
+    });
+};
diff --git a/scripts/npm_publish/lib/check_repo_clean.js b/scripts/npm_publish/lib/check_repo_clean.js
new file mode 100644
index 000000000..20de2e191
--- /dev/null
+++ b/scripts/npm_publish/lib/check_repo_clean.js
@@ -0,0 +1,13 @@
+const execa = require('execa');
+
+// check if the work tree is clean
+module.exports = function isWorkTreeClean() {
+  return execa('git', ['status', '-s']).then(rst => {
+    if (rst.stderr) {
+      throw new Error(rst.stderr);
+    } else if (rst.stdout) {
+      throw new Error('Work tree is not clean, check "git status"');
+    }
+    return true;
+  });
+};
diff --git a/scripts/npm_publish/lib/interact.js b/scripts/npm_publish/lib/interact.js
new file mode 100644
index 000000000..79c3e50a2
--- /dev/null
+++ b/scripts/npm_publish/lib/interact.js
@@ -0,0 +1,104 @@
+const path = require('path');
+const readPkg = require('read-pkg');
+const semver = require('semver');
+const chalk = require('chalk');
+const { Select, Input } = require('enquirer');
+
+const autoPublish = require('./auto');
+const log = require('./log');
+
+const PACKAGES_DIR = './packages/';
+
+/*
+ * interact publish a npm package
+ */
+module.exports = function interactPublish(name, opt) {
+  let flow = Promise.resolve(name);
+
+  if (name === '*') {
+    const util = require('util');
+    const fs = require('fs');
+    const readdir = util.promisify(fs.readdir);
+
+    flow = readdir(PACKAGES_DIR)
+      .then(dirs => {
+        return dirs.filter(dir => fs.statSync(path.join(PACKAGES_DIR, dir)).isDirectory());
+      })
+      .then(dirs => {
+        return new Select({
+          name: 'package',
+          message: 'Pick a package:',
+          choices: dirs
+        }).run();
+      });
+  }
+
+  flow
+    .then(name => {
+      // Enter directory
+      let cwd = path.join('packages', name);
+      process.chdir(cwd);
+
+      let pkg = readPkg.sync({ cwd: './' });
+      let pkgVersion = pkg.version;
+
+      log.info('Publish package: ' + chalk.cyan(`${pkg.name}@${pkg.version}`));
+
+      let publishOpt = {
+        version: opt.ver || '',
+        tag: opt.tag || ''
+      };
+
+      return new Select({
+        name: 'tag',
+        message: 'Pick a tag:',
+        choices: ['release', 'alpha', 'beta', 'custom']
+      })
+        .run()
+        .then(tag => {
+          if (tag === 'custom') {
+            return new Input({
+              message: 'Input custom tag'
+            }).run();
+          }
+          publishOpt.tag = tag;
+          return tag;
+        })
+        .then(tag => {
+          let choices = [];
+          choices = ['patch', 'minor', 'major'].map(v => {
+            if (tag !== 'release') {
+              v = 'pre' + v;
+            }
+            let ver = semver.inc(pkgVersion, v, tag === 'release' ? '' : tag);
+            return {
+              message: `${v} (${ver})`,
+              value: ver
+            };
+          });
+          if (tag !== 'release') {
+            let prerelease = semver.inc(pkgVersion, 'prerelease', tag);
+            choices.push({
+              message: `prerelease (${prerelease})`,
+              value: prerelease
+            });
+          }
+          return new Select({
+            name: 'version',
+            message: 'Chooice a publish version:',
+            choices: choices
+          }).run();
+        })
+        .then(version => {
+          publishOpt.ver = version;
+          publishOpt.interact = true;
+          return autoPublish(pkg, publishOpt);
+        });
+    })
+    .catch(e => {
+      if (e !== '') {
+        // Command + C cancelled the selection.
+        log.error(e);
+      }
+    });
+};
diff --git a/scripts/npm_publish/lib/log.js b/scripts/npm_publish/lib/log.js
new file mode 100644
index 000000000..f692373d9
--- /dev/null
+++ b/scripts/npm_publish/lib/log.js
@@ -0,0 +1,16 @@
+const chalk = require('chalk');
+
+module.exports = {
+  info(msg) {
+    // eslint-disable-next-line no-console
+    console.log(chalk.yellow('⦿ ') + msg);
+  },
+  success(msg) {
+    // eslint-disable-next-line no-console
+    console.log(chalk.green('✔ ') + msg);
+  },
+  error(e) {
+    // eslint-disable-next-line no-console
+    console.log(chalk.red('✘ ') + e);
+  }
+};
diff --git a/scripts/release.js b/scripts/release.js
new file mode 100644
index 000000000..8b4433762
--- /dev/null
+++ b/scripts/release.js
@@ -0,0 +1,81 @@
+const semver = require('semver');
+const execa = require('execa');
+const { Select, Input } = require('enquirer');
+
+/*
+ * interact publish a npm package
+ */
+function interactPublish() {
+  let flow = Promise.resolve();
+  return flow
+    .then(() => {
+      let publishOpt = {
+        version: '',
+        tag: ''
+      };
+
+      const pkgVersion = require('../lerna.json').version;
+
+      return new Select({
+        name: 'tag',
+        message: 'Pick a tag:',
+        choices: ['release', 'alpha', 'beta', 'custom']
+      })
+        .run()
+        .then(tag => {
+          if (tag === 'custom') {
+            return new Input({
+              message: 'Input custom tag'
+            }).run();
+          }
+          publishOpt.tag = tag;
+          return tag;
+        })
+        .then(tag => {
+          let choices = [];
+          choices = ['patch', 'minor', 'major'].map(v => {
+            if (tag !== 'release') {
+              v = 'pre' + v;
+            }
+            let ver = semver.inc(pkgVersion, v, tag === 'release' ? '' : tag);
+            return {
+              message: `${v} (${ver})`,
+              value: v
+            };
+          });
+          if (tag !== 'release') {
+            let prerelease = semver.inc(pkgVersion, 'prerelease', tag);
+            choices.push({
+              message: `prerelease (${prerelease})`,
+              value: 'prerelease'
+            });
+          }
+          return new Select({
+            name: 'version',
+            message: 'Chooice a publish version:',
+            choices: choices
+          }).run();
+        })
+        .then(version => {
+          publishOpt.version = version;
+          return publishOpt;
+        });
+    })
+    .catch(e => {
+      // eslint-disable-next-line
+      console.log(e);
+    });
+}
+
+interactPublish().then(opt => {
+  let msg = `release: ${opt.version} release`;
+  if (opt.tag) {
+    msg += ` on ${opt.tag}`;
+  }
+  const cmds = ['git', 'commit', '-m', `"${msg}"`, '--allow-empty', '--no-verify'];
+
+  execa(cmds.shift(), cmds).then(res => {
+    // eslint-disable-next-line
+    console.log(res.stdout);
+  });
+});
diff --git a/scripts/test-build.sh b/scripts/test-build.sh
new file mode 100755
index 000000000..a9182ffda
--- /dev/null
+++ b/scripts/test-build.sh
@@ -0,0 +1,82 @@
+#!/bin/bash
+
+# test wepy new demo
+
+# Start in tasks/ even if run from root directory
+cd "$(dirname "$0")"
+
+function cleanup() {
+    echo 'Cleaning up.'
+}
+
+
+# Error messages are redirected to stderr
+function handle_error() {
+    echo "$(basename $0): ERROR! An error was encountered executing line $1." 1>&2;
+    cleanup
+    echo 'Exiting with error.' 1>&2;
+    exit 1
+}
+
+
+function handle_exit() {
+    cleanup
+    echo 'Exiting without error.' 1>&2;
+    exit
+}
+
+
+# Exit the script with a helpful error message when any error is encountered
+trap 'set +x; handle_error $LINENO $BASH_COMMAND' ERR
+
+# Cleanup before exit on any termination signal
+trap 'set +x; handle_exit' SIGQUIT SIGTERM SIGINT SIGKILL SIGHUP
+
+# Echo every command being executed
+set -x
+
+
+# Go to root
+cd ..
+root_path=$PWD
+
+
+npm link packages/cli
+
+wepy -v
+
+wepy list
+
+mkdir -p /tmp/templates/
+cd /tmp/templates/
+
+exps="${root_path}/scripts/exps"
+for exp in ${exps}/*; do
+    name=$(basename $exp .exp)
+	expect "$root_path"/scripts/exps/"$name".exp "/tmp/templates/${name}"
+    pwd
+    ls -la
+	cd "/tmp/templates/${name}"
+	npm install
+	node "$root_path"/packages/cli/bin/wepy.js build
+done
+
+# Build multiple version for standard project.
+cd /tmp/templates/standard
+
+node "$root_path"/packages/cli/bin/wepy.js build
+
+# Test build demos
+cd /tmp/templates
+
+# node "$root_path"/packages/cli/bin/wepy.js init wepyjs/wepy-wechat-demo wepy-wechat-demo
+git clone https://github.com/wepyjs/wepy-wechat-demo.git --branch 2.0
+
+cd wepy-wechat-demo
+npm install
+npm run build
+
+cd ..
+
+# Cleanup
+cleanup
diff --git a/scripts/test.sh b/scripts/test.sh
deleted file mode 100644
index 9f2314c50..000000000
--- a/scripts/test.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/sh
-set -e
-
-if [ -z "$TEST_GREP" ]; then
-   TEST_GREP=""
-fi
-
-node="node"
-
-if [ "$TEST_DEBUG" ]; then
-   node="node --inspect --debug-brk"
-fi
-
-jsonlint -q ./docs/data/cases.json && echo 'cases.json ok.'
-jsonlint -q ./docs/data/donate.json && echo 'donate.json ok.'
-
-eslint packages/*
-istanbul cover ./node_modules/mocha/bin/_mocha -- -t 50000 --recursive  -R spec packages/*/test/
\ No newline at end of file
diff --git a/scripts/unittest.js b/scripts/unittest.js
new file mode 100644
index 000000000..1d076af05
--- /dev/null
+++ b/scripts/unittest.js
@@ -0,0 +1,42 @@
+const path = require('path');
+const { spawnSync } = require('child_process');
+
+const packages = [
+  'babel-plugin-import-regenerator',
+  'cli',
+  //'compiler-babel',
+  'compiler-less',
+  'compiler-sass',
+  //'compiler-stylus',
+  //'compiler-typescript',
+  'core',
+  'plugin-define'
+  //'plugin-eslint',
+  //'plugin-uglifyjs',
+  //'redux',
+  //'use-promisify',
+  //'x',
+];
+
+function testAll(pkgs) {
+  if (pkgs.length === 0) {
+    pkgs = packages;
+  }
+  pkgs.forEach(pkg => {
+    testOne(pkg);
+  });
+}
+
+function testOne(name) {
+  process.env.FORCE_COLOR = 1;
+  spawnSync('npm', ['run', 'test'], {
+    cwd: path.join(process.cwd(), 'packages', name),
+    env: process.env,
+    stdio: 'inherit'
+  });
+}
+
+// eslint-disable-next-line no-unused-vars
+(function main([bin, file, ...args]) {
+  testAll(args);
+})(process.argv);
diff --git a/test/build-cases/empty.sh b/test/build-cases/empty.sh
new file mode 100755
index 000000000..0e2decafc
--- /dev/null
+++ b/test/build-cases/empty.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+name=$(basename "$0" .sh)
+cd /tmp/templates/
+
+wepy init empty $name --no-interactive
+
+cd "$name"
+npm install
diff --git a/test/build-cases/standard.sh b/test/build-cases/standard.sh
new file mode 100755
index 000000000..878cc23db
--- /dev/null
+++ b/test/build-cases/standard.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+name=$(basename "$0" .sh)
+cd /tmp/templates/
+
+wepy init standard $name --no-interactive --name test-interactive
+
+cd "$name"
+npm install
diff --git a/test/build.sh b/test/build.sh
new file mode 100755
index 000000000..c5a6863f1
--- /dev/null
+++ b/test/build.sh
@@ -0,0 +1,74 @@
+#!/bin/bash
+
+# test wepy new demo
+
+# Start in tasks/ even if run from root directory
+cd "$(dirname "$0")"
+
+function cleanup() {
+    echo 'Cleaning up.'
+}
+
+
+# Error messages are redirected to stderr
+function handle_error() {
+    echo "$(basename $0): ERROR! An error was encountered executing line $1." 1>&2;
+    cleanup
+    echo 'Exiting with error.' 1>&2;
+    exit 1
+}
+
+
+function handle_exit() {
+    cleanup
+    echo 'Exiting without error.' 1>&2;
+    exit
+}
+
+
+# Exit the script with a helpful error message when any error is encountered
+trap 'set +x; handle_error $LINENO $BASH_COMMAND' ERR
+
+# Cleanup before exit on any termination signal
+trap 'set +x; handle_exit' SIGQUIT SIGTERM SIGINT SIGKILL SIGHUP
+
+# Echo every command being executed
+set -x
+
+
+# Go to root
+cd ..
+root_path=$PWD
+
+
+npm link packages/cli
+
+wepy -v
+
+wepy list
+
+mkdir -p /tmp/templates/
+cd /tmp/templates/
+
+buildcases="${root_path}/test/build-cases"
+for bc in ${buildcases}/*; do
+  name=$(basename $bc .sh)
+	"$root_path"/test/build-cases/"$name".sh
+	cd "/tmp/templates/${name}"
+	node "$root_path"/packages/cli/bin/wepy.js build
+done
+
+# Test build demos
+cd /tmp/templates
+
+# node "$root_path"/packages/cli/bin/wepy.js init wepyjs/wepy-wechat-demo wepy-wechat-demo
+git clone https://github.com/wepyjs/wepy-wechat-demo.git --branch 2.0
+
+cd wepy-wechat-demo
+npm install
+npm run build
+
+cd ..
+
+# Cleanup
+cleanup
diff --git a/test/scripts/ci-release.test.js b/test/scripts/ci-release.test.js
new file mode 100644
index 000000000..e69de29bb
diff --git a/test/unit.js b/test/unit.js
new file mode 100644
index 000000000..5555abc99
--- /dev/null
+++ b/test/unit.js
@@ -0,0 +1,47 @@
+const path = require('path');
+const { spawnSync } = require('child_process');
+
+const packages = [
+  'babel-plugin-import-regenerator',
+  'cli',
+  //'compiler-babel',
+  'compiler-less',
+  'compiler-sass',
+  //'compiler-stylus',
+  //'compiler-typescript',
+  'core',
+  'plugin-define',
+  //'plugin-eslint',
+  //'plugin-uglifyjs',
+  //'redux',
+  'use-intercept',
+  'use-promisify'
+  //'x',
+];
+
+function testAll(pkgs) {
+  if (pkgs.length === 0) {
+    pkgs = packages;
+  }
+  pkgs.forEach(pkg => {
+    testOne(pkg);
+  });
+}
+
+function testOne(name) {
+  process.env.FORCE_COLOR = 1;
+  const command = process.platform === 'win32' ? 'npm.cmd' : 'npm';
+  const result = spawnSync(command, ['run', 'test'], {
+    cwd: path.join(process.cwd(), 'packages', name),
+    env: process.env,
+    stdio: 'inherit'
+  });
+  if (result.status !== 0) {
+    throw new Error('Test cases failed in: ' + name);
+  }
+}
+
+// eslint-disable-next-line no-unused-vars
+(function main([bin, file, ...args]) {
+  testAll(args);
+})(process.argv);
diff --git a/verpub.config.js b/verpub.config.js
new file mode 100644
index 000000000..2cdcbd9ce
--- /dev/null
+++ b/verpub.config.js
@@ -0,0 +1,3 @@
+module.exports = {
+  publish: false
+};
diff --git a/yarn.lock b/yarn.lock
deleted file mode 100644
index ee531fecc..000000000
--- a/yarn.lock
+++ /dev/null
@@ -1,3814 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-abbrev@1, abbrev@1.0.x:
-  version "1.0.9"
-  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
-
-accord@^0.27.3:
-  version "0.27.3"
-  resolved "http://registry.npm.taobao.org/accord/download/accord-0.27.3.tgz#7fb9129709285caea84eb372c4e882031b7138e8"
-  dependencies:
-    convert-source-map "^1.5.0"
-    glob "^7.0.5"
-    indx "^0.2.3"
-    lodash.clone "^4.3.2"
-    lodash.defaults "^4.0.1"
-    lodash.flatten "^4.2.0"
-    lodash.merge "^4.4.0"
-    lodash.partialright "^4.1.4"
-    lodash.pick "^4.2.1"
-    lodash.uniq "^4.3.0"
-    resolve "^1.3.3"
-    semver "^5.3.0"
-    uglify-js "^2.8.22"
-    when "^3.7.8"
-
-acorn-jsx@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
-  dependencies:
-    acorn "^3.0.4"
-
-acorn@4.0.4:
-  version "4.0.4"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a"
-
-acorn@^3.0.4:
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
-
-ajv-keywords@^1.0.0:
-  version "1.5.1"
-  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
-
-ajv@^4.7.0, ajv@^4.9.1:
-  version "4.11.5"
-  resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.5.tgz#b6ee74657b993a01dce44b7944d56f485828d5bd"
-  dependencies:
-    co "^4.6.0"
-    json-stable-stringify "^1.0.1"
-
-align-text@^0.1.1, align-text@^0.1.3:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
-  dependencies:
-    kind-of "^3.0.2"
-    longest "^1.0.1"
-    repeat-string "^1.5.2"
-
-amdefine@>=0.0.4:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
-
-ansi-escapes@^1.1.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
-
-ansi-regex@^2.0.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
-
-ansi-styles@^2.2.1:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
-
-anymatch@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507"
-  dependencies:
-    arrify "^1.0.0"
-    micromatch "^2.1.5"
-
-aproba@^1.0.3:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab"
-
-archy@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
-
-are-we-there-yet@~1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3"
-  dependencies:
-    delegates "^1.0.0"
-    readable-stream "^2.0.0 || ^1.1.13"
-
-argparse@^1.0.7:
-  version "1.0.9"
-  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
-  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-flatten@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b"
-
-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-from@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195"
-
-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, array-uniq@^1.0.2:
-  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"
-
-arrify@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
-
-asap@~2.0.3:
-  version "2.0.6"
-  resolved "http://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
-
-asn1@~0.2.3:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
-
-assert-plus@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
-
-assert-plus@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
-
-async-each@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
-
-async@1.x, async@^1.4.0, async@^1.5.0:
-  version "1.5.2"
-  resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
-
-asynckit@^0.4.0:
-  version "0.4.0"
-  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
-
-aws-sign2@~0.6.0:
-  version "0.6.0"
-  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
-
-aws4@^1.2.1:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
-
-babel-cli@^6.18.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.23.0.tgz#52ff946a2b0f64645c35e7bd5eea267aa0948c0f"
-  dependencies:
-    babel-core "^6.23.0"
-    babel-polyfill "^6.23.0"
-    babel-register "^6.23.0"
-    babel-runtime "^6.22.0"
-    commander "^2.8.1"
-    convert-source-map "^1.1.0"
-    fs-readdir-recursive "^1.0.0"
-    glob "^7.0.0"
-    lodash "^4.2.0"
-    output-file-sync "^1.1.0"
-    path-is-absolute "^1.0.0"
-    slash "^1.0.0"
-    source-map "^0.5.0"
-    v8flags "^2.0.10"
-  optionalDependencies:
-    chokidar "^1.6.1"
-
-babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
-  dependencies:
-    chalk "^1.1.0"
-    esutils "^2.0.2"
-    js-tokens "^3.0.0"
-
-babel-core@^6.0.2, babel-core@^6.23.0:
-  version "6.23.1"
-  resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.23.1.tgz#c143cb621bb2f621710c220c5d579d15b8a442df"
-  dependencies:
-    babel-code-frame "^6.22.0"
-    babel-generator "^6.23.0"
-    babel-helpers "^6.23.0"
-    babel-messages "^6.23.0"
-    babel-register "^6.23.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.23.0"
-    babel-traverse "^6.23.1"
-    babel-types "^6.23.0"
-    babylon "^6.11.0"
-    convert-source-map "^1.1.0"
-    debug "^2.1.1"
-    json5 "^0.5.0"
-    lodash "^4.2.0"
-    minimatch "^3.0.2"
-    path-is-absolute "^1.0.0"
-    private "^0.1.6"
-    slash "^1.0.0"
-    source-map "^0.5.0"
-
-babel-eslint@^7.1.1:
-  version "7.1.1"
-  resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.1.1.tgz#8a6a884f085aa7060af69cfc77341c2f99370fb2"
-  dependencies:
-    babel-code-frame "^6.16.0"
-    babel-traverse "^6.15.0"
-    babel-types "^6.15.0"
-    babylon "^6.13.0"
-    lodash.pickby "^4.6.0"
-
-babel-generator@^6.23.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.23.0.tgz#6b8edab956ef3116f79d8c84c5a3c05f32a74bc5"
-  dependencies:
-    babel-messages "^6.23.0"
-    babel-runtime "^6.22.0"
-    babel-types "^6.23.0"
-    detect-indent "^4.0.0"
-    jsesc "^1.3.0"
-    lodash "^4.2.0"
-    source-map "^0.5.0"
-    trim-right "^1.0.1"
-
-babel-helper-bindify-decorators@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.22.0.tgz#d7f5bc261275941ac62acfc4e20dacfb8a3fe952"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-traverse "^6.22.0"
-    babel-types "^6.22.0"
-
-babel-helper-builder-binary-assignment-operator-visitor@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.22.0.tgz#29df56be144d81bdeac08262bfa41d2c5e91cdcd"
-  dependencies:
-    babel-helper-explode-assignable-expression "^6.22.0"
-    babel-runtime "^6.22.0"
-    babel-types "^6.22.0"
-
-babel-helper-call-delegate@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.22.0.tgz#119921b56120f17e9dae3f74b4f5cc7bcc1b37ef"
-  dependencies:
-    babel-helper-hoist-variables "^6.22.0"
-    babel-runtime "^6.22.0"
-    babel-traverse "^6.22.0"
-    babel-types "^6.22.0"
-
-babel-helper-define-map@^6.23.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.23.0.tgz#1444f960c9691d69a2ced6a205315f8fd00804e7"
-  dependencies:
-    babel-helper-function-name "^6.23.0"
-    babel-runtime "^6.22.0"
-    babel-types "^6.23.0"
-    lodash "^4.2.0"
-
-babel-helper-explode-assignable-expression@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.22.0.tgz#c97bf76eed3e0bae4048121f2b9dae1a4e7d0478"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-traverse "^6.22.0"
-    babel-types "^6.22.0"
-
-babel-helper-explode-class@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.22.0.tgz#646304924aa6388a516843ba7f1855ef8dfeb69b"
-  dependencies:
-    babel-helper-bindify-decorators "^6.22.0"
-    babel-runtime "^6.22.0"
-    babel-traverse "^6.22.0"
-    babel-types "^6.22.0"
-
-babel-helper-function-name@^6.22.0, babel-helper-function-name@^6.23.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.23.0.tgz#25742d67175c8903dbe4b6cb9d9e1fcb8dcf23a6"
-  dependencies:
-    babel-helper-get-function-arity "^6.22.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.23.0"
-    babel-traverse "^6.23.0"
-    babel-types "^6.23.0"
-
-babel-helper-get-function-arity@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.22.0.tgz#0beb464ad69dc7347410ac6ade9f03a50634f5ce"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.22.0"
-
-babel-helper-hoist-variables@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.22.0.tgz#3eacbf731d80705845dd2e9718f600cfb9b4ba72"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.22.0"
-
-babel-helper-optimise-call-expression@^6.23.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.23.0.tgz#f3ee7eed355b4282138b33d02b78369e470622f5"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.23.0"
-
-babel-helper-regex@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.22.0.tgz#79f532be1647b1f0ee3474b5f5c3da58001d247d"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.22.0"
-    lodash "^4.2.0"
-
-babel-helper-remap-async-to-generator@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.22.0.tgz#2186ae73278ed03b8b15ced089609da981053383"
-  dependencies:
-    babel-helper-function-name "^6.22.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.22.0"
-    babel-traverse "^6.22.0"
-    babel-types "^6.22.0"
-
-babel-helper-replace-supers@^6.22.0, babel-helper-replace-supers@^6.23.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.23.0.tgz#eeaf8ad9b58ec4337ca94223bacdca1f8d9b4bfd"
-  dependencies:
-    babel-helper-optimise-call-expression "^6.23.0"
-    babel-messages "^6.23.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.23.0"
-    babel-traverse "^6.23.0"
-    babel-types "^6.23.0"
-
-babel-helpers@^6.23.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.23.0.tgz#4f8f2e092d0b6a8808a4bde79c27f1e2ecf0d992"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-template "^6.23.0"
-
-babel-messages@^6.23.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-check-es2015-constants@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-syntax-async-functions@^6.8.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
-
-babel-plugin-syntax-async-generators@^6.5.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a"
-
-babel-plugin-syntax-class-constructor-call@^6.18.0:
-  version "6.18.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416"
-
-babel-plugin-syntax-class-properties@^6.8.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
-
-babel-plugin-syntax-decorators@^6.13.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b"
-
-babel-plugin-syntax-dynamic-import@^6.18.0:
-  version "6.18.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da"
-
-babel-plugin-syntax-exponentiation-operator@^6.8.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
-
-babel-plugin-syntax-export-extensions@^6.8.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721"
-
-babel-plugin-syntax-object-rest-spread@^6.8.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
-
-babel-plugin-syntax-trailing-function-commas@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
-
-babel-plugin-transform-async-generator-functions@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.22.0.tgz#a720a98153a7596f204099cd5409f4b3c05bab46"
-  dependencies:
-    babel-helper-remap-async-to-generator "^6.22.0"
-    babel-plugin-syntax-async-generators "^6.5.0"
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-async-to-generator@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.22.0.tgz#194b6938ec195ad36efc4c33a971acf00d8cd35e"
-  dependencies:
-    babel-helper-remap-async-to-generator "^6.22.0"
-    babel-plugin-syntax-async-functions "^6.8.0"
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-class-constructor-call@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.22.0.tgz#11a4d2216abb5b0eef298b493748f4f2f4869120"
-  dependencies:
-    babel-plugin-syntax-class-constructor-call "^6.18.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.22.0"
-
-babel-plugin-transform-class-properties@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.23.0.tgz#187b747ee404399013563c993db038f34754ac3b"
-  dependencies:
-    babel-helper-function-name "^6.23.0"
-    babel-plugin-syntax-class-properties "^6.8.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.23.0"
-
-babel-plugin-transform-decorators@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.22.0.tgz#c03635b27a23b23b7224f49232c237a73988d27c"
-  dependencies:
-    babel-helper-explode-class "^6.22.0"
-    babel-plugin-syntax-decorators "^6.13.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.22.0"
-    babel-types "^6.22.0"
-
-babel-plugin-transform-es2015-arrow-functions@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-block-scoping@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.23.0.tgz#e48895cf0b375be148cd7c8879b422707a053b51"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-template "^6.23.0"
-    babel-traverse "^6.23.0"
-    babel-types "^6.23.0"
-    lodash "^4.2.0"
-
-babel-plugin-transform-es2015-classes@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.23.0.tgz#49b53f326202a2fd1b3bbaa5e2edd8a4f78643c1"
-  dependencies:
-    babel-helper-define-map "^6.23.0"
-    babel-helper-function-name "^6.23.0"
-    babel-helper-optimise-call-expression "^6.23.0"
-    babel-helper-replace-supers "^6.23.0"
-    babel-messages "^6.23.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.23.0"
-    babel-traverse "^6.23.0"
-    babel-types "^6.23.0"
-
-babel-plugin-transform-es2015-computed-properties@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.22.0.tgz#7c383e9629bba4820c11b0425bdd6290f7f057e7"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-template "^6.22.0"
-
-babel-plugin-transform-es2015-destructuring@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.22.0.tgz#672397031c21610d72dd2bbb0ba9fb6277e1c36b"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.22.0"
-
-babel-plugin-transform-es2015-for-of@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-function-name@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.22.0.tgz#f5fcc8b09093f9a23c76ac3d9e392c3ec4b77104"
-  dependencies:
-    babel-helper-function-name "^6.22.0"
-    babel-runtime "^6.22.0"
-    babel-types "^6.22.0"
-
-babel-plugin-transform-es2015-literals@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-modules-amd@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.22.0.tgz#bf69cd34889a41c33d90dfb740e0091ccff52f21"
-  dependencies:
-    babel-plugin-transform-es2015-modules-commonjs "^6.22.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.22.0"
-
-babel-plugin-transform-es2015-modules-commonjs@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.23.0.tgz#cba7aa6379fb7ec99250e6d46de2973aaffa7b92"
-  dependencies:
-    babel-plugin-transform-strict-mode "^6.22.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.23.0"
-    babel-types "^6.23.0"
-
-babel-plugin-transform-es2015-modules-systemjs@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.23.0.tgz#ae3469227ffac39b0310d90fec73bfdc4f6317b0"
-  dependencies:
-    babel-helper-hoist-variables "^6.22.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.23.0"
-
-babel-plugin-transform-es2015-modules-umd@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.23.0.tgz#8d284ae2e19ed8fe21d2b1b26d6e7e0fcd94f0f1"
-  dependencies:
-    babel-plugin-transform-es2015-modules-amd "^6.22.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.23.0"
-
-babel-plugin-transform-es2015-object-super@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.22.0.tgz#daa60e114a042ea769dd53fe528fc82311eb98fc"
-  dependencies:
-    babel-helper-replace-supers "^6.22.0"
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-parameters@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.23.0.tgz#3a2aabb70c8af945d5ce386f1a4250625a83ae3b"
-  dependencies:
-    babel-helper-call-delegate "^6.22.0"
-    babel-helper-get-function-arity "^6.22.0"
-    babel-runtime "^6.22.0"
-    babel-template "^6.23.0"
-    babel-traverse "^6.23.0"
-    babel-types "^6.23.0"
-
-babel-plugin-transform-es2015-shorthand-properties@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.22.0.tgz#8ba776e0affaa60bff21e921403b8a652a2ff723"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.22.0"
-
-babel-plugin-transform-es2015-spread@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-sticky-regex@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.22.0.tgz#ab316829e866ee3f4b9eb96939757d19a5bc4593"
-  dependencies:
-    babel-helper-regex "^6.22.0"
-    babel-runtime "^6.22.0"
-    babel-types "^6.22.0"
-
-babel-plugin-transform-es2015-template-literals@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-typeof-symbol@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-unicode-regex@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.22.0.tgz#8d9cc27e7ee1decfe65454fb986452a04a613d20"
-  dependencies:
-    babel-helper-regex "^6.22.0"
-    babel-runtime "^6.22.0"
-    regexpu-core "^2.0.0"
-
-babel-plugin-transform-exponentiation-operator@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.22.0.tgz#d57c8335281918e54ef053118ce6eb108468084d"
-  dependencies:
-    babel-helper-builder-binary-assignment-operator-visitor "^6.22.0"
-    babel-plugin-syntax-exponentiation-operator "^6.8.0"
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-export-extensions@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653"
-  dependencies:
-    babel-plugin-syntax-export-extensions "^6.8.0"
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-object-rest-spread@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921"
-  dependencies:
-    babel-plugin-syntax-object-rest-spread "^6.8.0"
-    babel-runtime "^6.22.0"
-
-babel-plugin-transform-regenerator@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.22.0.tgz#65740593a319c44522157538d690b84094617ea6"
-  dependencies:
-    regenerator-transform "0.9.8"
-
-babel-plugin-transform-strict-mode@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.22.0.tgz#e008df01340fdc87e959da65991b7e05970c8c7c"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.22.0"
-
-babel-polyfill@^6.23.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d"
-  dependencies:
-    babel-runtime "^6.22.0"
-    core-js "^2.4.0"
-    regenerator-runtime "^0.10.0"
-
-babel-preset-es2015@^6.18.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.22.0.tgz#af5a98ecb35eb8af764ad8a5a05eb36dc4386835"
-  dependencies:
-    babel-plugin-check-es2015-constants "^6.22.0"
-    babel-plugin-transform-es2015-arrow-functions "^6.22.0"
-    babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
-    babel-plugin-transform-es2015-block-scoping "^6.22.0"
-    babel-plugin-transform-es2015-classes "^6.22.0"
-    babel-plugin-transform-es2015-computed-properties "^6.22.0"
-    babel-plugin-transform-es2015-destructuring "^6.22.0"
-    babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
-    babel-plugin-transform-es2015-for-of "^6.22.0"
-    babel-plugin-transform-es2015-function-name "^6.22.0"
-    babel-plugin-transform-es2015-literals "^6.22.0"
-    babel-plugin-transform-es2015-modules-amd "^6.22.0"
-    babel-plugin-transform-es2015-modules-commonjs "^6.22.0"
-    babel-plugin-transform-es2015-modules-systemjs "^6.22.0"
-    babel-plugin-transform-es2015-modules-umd "^6.22.0"
-    babel-plugin-transform-es2015-object-super "^6.22.0"
-    babel-plugin-transform-es2015-parameters "^6.22.0"
-    babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
-    babel-plugin-transform-es2015-spread "^6.22.0"
-    babel-plugin-transform-es2015-sticky-regex "^6.22.0"
-    babel-plugin-transform-es2015-template-literals "^6.22.0"
-    babel-plugin-transform-es2015-typeof-symbol "^6.22.0"
-    babel-plugin-transform-es2015-unicode-regex "^6.22.0"
-    babel-plugin-transform-regenerator "^6.22.0"
-
-babel-preset-stage-1@^6.16.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.22.0.tgz#7da05bffea6ad5a10aef93e320cfc6dd465dbc1a"
-  dependencies:
-    babel-plugin-transform-class-constructor-call "^6.22.0"
-    babel-plugin-transform-export-extensions "^6.22.0"
-    babel-preset-stage-2 "^6.22.0"
-
-babel-preset-stage-2@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.22.0.tgz#ccd565f19c245cade394b21216df704a73b27c07"
-  dependencies:
-    babel-plugin-syntax-dynamic-import "^6.18.0"
-    babel-plugin-transform-class-properties "^6.22.0"
-    babel-plugin-transform-decorators "^6.22.0"
-    babel-preset-stage-3 "^6.22.0"
-
-babel-preset-stage-3@^6.22.0:
-  version "6.22.0"
-  resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.22.0.tgz#a4e92bbace7456fafdf651d7a7657ee0bbca9c2e"
-  dependencies:
-    babel-plugin-syntax-trailing-function-commas "^6.22.0"
-    babel-plugin-transform-async-generator-functions "^6.22.0"
-    babel-plugin-transform-async-to-generator "^6.22.0"
-    babel-plugin-transform-exponentiation-operator "^6.22.0"
-    babel-plugin-transform-object-rest-spread "^6.22.0"
-
-babel-register@^6.23.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.23.0.tgz#c9aa3d4cca94b51da34826c4a0f9e08145d74ff3"
-  dependencies:
-    babel-core "^6.23.0"
-    babel-runtime "^6.22.0"
-    core-js "^2.4.0"
-    home-or-tmp "^2.0.0"
-    lodash "^4.2.0"
-    mkdirp "^0.5.1"
-    source-map-support "^0.4.2"
-
-babel-runtime@^6.18.0, babel-runtime@^6.22.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b"
-  dependencies:
-    core-js "^2.4.0"
-    regenerator-runtime "^0.10.0"
-
-babel-template@^6.22.0, babel-template@^6.23.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.23.0.tgz#04d4f270adbb3aa704a8143ae26faa529238e638"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-traverse "^6.23.0"
-    babel-types "^6.23.0"
-    babylon "^6.11.0"
-    lodash "^4.2.0"
-
-babel-traverse@^6.15.0, babel-traverse@^6.22.0, babel-traverse@^6.23.0, babel-traverse@^6.23.1:
-  version "6.23.1"
-  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.23.1.tgz#d3cb59010ecd06a97d81310065f966b699e14f48"
-  dependencies:
-    babel-code-frame "^6.22.0"
-    babel-messages "^6.23.0"
-    babel-runtime "^6.22.0"
-    babel-types "^6.23.0"
-    babylon "^6.15.0"
-    debug "^2.2.0"
-    globals "^9.0.0"
-    invariant "^2.2.0"
-    lodash "^4.2.0"
-
-babel-types@^6.15.0, babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.23.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf"
-  dependencies:
-    babel-runtime "^6.22.0"
-    esutils "^2.0.2"
-    lodash "^4.2.0"
-    to-fast-properties "^1.0.1"
-
-babel@^6.5.2:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel/-/babel-6.23.0.tgz#d0d1e7d803e974765beea3232d4e153c0efb90f4"
-
-babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0:
-  version "6.16.1"
-  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.16.1.tgz#30c5a22f481978a9e7f8cdfdf496b11d94b404d3"
-
-balanced-match@^0.4.1:
-  version "0.4.2"
-  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
-
-bcrypt-pbkdf@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
-  dependencies:
-    tweetnacl "^0.14.3"
-
-beeper@^1.0.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809"
-
-binary-extensions@^1.0.0:
-  version "1.8.0"
-  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774"
-
-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"
-
-boom@2.x.x:
-  version "2.10.1"
-  resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
-  dependencies:
-    hoek "2.x.x"
-
-brace-expansion@^1.0.0:
-  version "1.1.6"
-  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9"
-  dependencies:
-    balanced-match "^0.4.1"
-    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"
-
-browser-stdout@1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f"
-
-buffer-shims@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51"
-
-builtin-modules@^1.0.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
-
-caller-path@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
-  dependencies:
-    callsites "^0.2.0"
-
-callsites@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
-
-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@^1.0.2:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
-
-camelcase@^2.0.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
-
-caseless@~0.12.0:
-  version "0.12.0"
-  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
-
-center-align@^0.1.1:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
-  dependencies:
-    align-text "^0.1.3"
-    lazy-cache "^1.0.3"
-
-chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
-  dependencies:
-    ansi-styles "^2.2.1"
-    escape-string-regexp "^1.0.2"
-    has-ansi "^2.0.0"
-    strip-ansi "^3.0.0"
-    supports-color "^2.0.0"
-
-chokidar@^1.6.1:
-  version "1.6.1"
-  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2"
-  dependencies:
-    anymatch "^1.3.0"
-    async-each "^1.0.0"
-    glob-parent "^2.0.0"
-    inherits "^2.0.1"
-    is-binary-path "^1.0.0"
-    is-glob "^2.0.0"
-    path-is-absolute "^1.0.0"
-    readdirp "^2.0.0"
-  optionalDependencies:
-    fsevents "^1.0.0"
-
-circular-json@^0.3.1:
-  version "0.3.1"
-  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d"
-
-cli-cursor@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
-  dependencies:
-    restore-cursor "^1.0.1"
-
-cli-width@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a"
-
-cliui@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
-  dependencies:
-    center-align "^0.1.1"
-    right-align "^0.1.1"
-    wordwrap "0.0.2"
-
-clone-stats@^0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
-
-clone@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f"
-
-clone@^1.0.0, clone@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149"
-
-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"
-
-coffee-script@^1.10.0:
-  version "1.12.4"
-  resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.4.tgz#fe1bced97fe1fb3927b998f2b45616e0658be1ff"
-
-combined-stream@^1.0.5, combined-stream@~1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
-  dependencies:
-    delayed-stream "~1.0.0"
-
-command-join@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/command-join/-/command-join-1.1.1.tgz#09e7609012e1dd8b4f0a14fde41a69eff1d2111f"
-  dependencies:
-    array-from "^2.1.1"
-    repeat-string "^1.5.4"
-
-commander@2.9.0, commander@^2.8.1:
-  version "2.9.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
-  dependencies:
-    graceful-readlink ">= 1.0.0"
-
-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.4.6:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
-  dependencies:
-    inherits "^2.0.3"
-    readable-stream "^2.2.2"
-    typedarray "^0.0.6"
-
-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"
-
-convert-source-map@^1.1.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.4.0.tgz#e3dad195bf61bfe13a7a3c73e9876ec14a0268f3"
-
-convert-source-map@^1.5.0:
-  version "1.5.0"
-  resolved "http://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5"
-
-core-js@^2.4.0:
-  version "2.4.1"
-  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e"
-
-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"
-
-cross-spawn@^4.0.0:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41"
-  dependencies:
-    lru-cache "^4.0.1"
-    which "^1.2.9"
-
-cryptiles@2.x.x:
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
-  dependencies:
-    boom "2.x.x"
-
-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"
-
-d@^0.1.1, d@~0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309"
-  dependencies:
-    es5-ext "~0.10.2"
-
-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@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17"
-
-debug@2.2.0, debug@^2.1.1, debug@^2.2.0, debug@~2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
-  dependencies:
-    ms "0.7.1"
-
-debug@2.6.1:
-  version "2.6.1"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351"
-  dependencies:
-    ms "0.7.2"
-
-decamelize@^1.0.0, decamelize@^1.1.2:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
-
-deep-extend@~0.4.0:
-  version "0.4.1"
-  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253"
-
-deep-is@~0.1.3:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
-
-defaults@^1.0.0:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
-  dependencies:
-    clone "^1.0.2"
-
-del@^2.0.2:
-  version "2.2.2"
-  resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
-  dependencies:
-    globby "^5.0.0"
-    is-path-cwd "^1.0.0"
-    is-path-in-cwd "^1.0.0"
-    object-assign "^4.0.1"
-    pify "^2.0.0"
-    pinkie-promise "^2.0.0"
-    rimraf "^2.2.8"
-
-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"
-
-depd@1.1.0, depd@~1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3"
-
-deprecated@^0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19"
-
-destroy@~1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
-
-detect-file@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63"
-  dependencies:
-    fs-exists-sync "^0.1.0"
-
-detect-indent@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
-  dependencies:
-    repeating "^2.0.0"
-
-diff@1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf"
-
-doctrine@^1.2.2:
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
-  dependencies:
-    esutils "^2.0.2"
-    isarray "^1.0.0"
-
-duplexer2@0.0.2:
-  version "0.0.2"
-  resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
-  dependencies:
-    readable-stream "~1.1.9"
-
-duplexify@^3.5.0:
-  version "3.5.1"
-  resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.1.tgz#4e1516be68838bc90a49994f0b39a6e5960befcd"
-  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.1"
-  resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
-  dependencies:
-    jsbn "~0.1.0"
-
-ee-first@1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
-
-encodeurl@~1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
-
-end-of-stream@^1.0.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206"
-  dependencies:
-    once "^1.4.0"
-
-end-of-stream@~0.1.5:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf"
-  dependencies:
-    once "~1.3.0"
-
-errno@^0.1.1:
-  version "0.1.4"
-  resolved "http://registry.npm.taobao.org/errno/download/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d"
-  dependencies:
-    prr "~0.0.0"
-
-error-ex@^1.2.0:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
-  dependencies:
-    is-arrayish "^0.2.1"
-
-es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7:
-  version "0.10.12"
-  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047"
-  dependencies:
-    es6-iterator "2"
-    es6-symbol "~3.1"
-
-es6-iterator@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac"
-  dependencies:
-    d "^0.1.1"
-    es5-ext "^0.10.7"
-    es6-symbol "3"
-
-es6-map@^0.1.3:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897"
-  dependencies:
-    d "~0.1.1"
-    es5-ext "~0.10.11"
-    es6-iterator "2"
-    es6-set "~0.1.3"
-    es6-symbol "~3.1.0"
-    event-emitter "~0.3.4"
-
-es6-set@~0.1.3:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8"
-  dependencies:
-    d "~0.1.1"
-    es5-ext "~0.10.11"
-    es6-iterator "2"
-    es6-symbol "3"
-    event-emitter "~0.3.4"
-
-es6-symbol@3, es6-symbol@~3.1, es6-symbol@~3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa"
-  dependencies:
-    d "~0.1.1"
-    es5-ext "~0.10.11"
-
-es6-weak-map@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81"
-  dependencies:
-    d "^0.1.1"
-    es5-ext "^0.10.8"
-    es6-iterator "2"
-    es6-symbol "3"
-
-escape-html@~1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
-
-escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, 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"
-
-escodegen@1.8.x:
-  version "1.8.1"
-  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018"
-  dependencies:
-    esprima "^2.7.1"
-    estraverse "^1.9.1"
-    esutils "^2.0.2"
-    optionator "^0.8.1"
-  optionalDependencies:
-    source-map "~0.2.0"
-
-escope@^3.6.0:
-  version "3.6.0"
-  resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
-  dependencies:
-    es6-map "^0.1.3"
-    es6-weak-map "^2.0.1"
-    esrecurse "^4.1.0"
-    estraverse "^4.1.1"
-
-eslint@^3.11.1:
-  version "3.17.1"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.17.1.tgz#b80ae12d9c406d858406fccda627afce33ea10ea"
-  dependencies:
-    babel-code-frame "^6.16.0"
-    chalk "^1.1.3"
-    concat-stream "^1.4.6"
-    debug "^2.1.1"
-    doctrine "^1.2.2"
-    escope "^3.6.0"
-    espree "^3.4.0"
-    estraverse "^4.2.0"
-    esutils "^2.0.2"
-    file-entry-cache "^2.0.0"
-    glob "^7.0.3"
-    globals "^9.14.0"
-    ignore "^3.2.0"
-    imurmurhash "^0.1.4"
-    inquirer "^0.12.0"
-    is-my-json-valid "^2.10.0"
-    is-resolvable "^1.0.0"
-    js-yaml "^3.5.1"
-    json-stable-stringify "^1.0.0"
-    levn "^0.3.0"
-    lodash "^4.0.0"
-    mkdirp "^0.5.0"
-    natural-compare "^1.4.0"
-    optionator "^0.8.2"
-    path-is-inside "^1.0.1"
-    pluralize "^1.2.1"
-    progress "^1.1.8"
-    require-uncached "^1.0.2"
-    shelljs "^0.7.5"
-    strip-bom "^3.0.0"
-    strip-json-comments "~2.0.1"
-    table "^3.7.8"
-    text-table "~0.2.0"
-    user-home "^2.0.0"
-
-espree@^3.4.0:
-  version "3.4.0"
-  resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.0.tgz#41656fa5628e042878025ef467e78f125cb86e1d"
-  dependencies:
-    acorn "4.0.4"
-    acorn-jsx "^3.0.0"
-
-esprima@2.7.x, esprima@^2.7.1:
-  version "2.7.3"
-  resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
-
-esprima@^3.1.1:
-  version "3.1.3"
-  resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
-
-esrecurse@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220"
-  dependencies:
-    estraverse "~4.1.0"
-    object-assign "^4.0.1"
-
-estraverse@^1.9.1:
-  version "1.9.3"
-  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
-
-estraverse@^4.1.1, estraverse@^4.2.0:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
-
-estraverse@~4.1.0:
-  version "4.1.1"
-  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2"
-
-esutils@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
-
-etag@~1.8.0:
-  version "1.8.0"
-  resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051"
-
-event-emitter@~0.3.4:
-  version "0.3.4"
-  resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5"
-  dependencies:
-    d "~0.1.1"
-    es5-ext "~0.10.7"
-
-exit-hook@^1.0.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
-
-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-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"
-
-expand-tilde@^1.2.1, expand-tilde@^1.2.2:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449"
-  dependencies:
-    os-homedir "^1.0.1"
-
-extend@^3.0.0, extend@~3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4"
-
-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"
-
-extsprintf@1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
-
-fancy-log@^1.1.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948"
-  dependencies:
-    chalk "^1.1.1"
-    time-stamp "^1.0.0"
-
-fast-levenshtein@~2.0.4:
-  version "2.0.6"
-  resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
-
-figures@^1.3.5:
-  version "1.7.0"
-  resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
-  dependencies:
-    escape-string-regexp "^1.0.5"
-    object-assign "^4.1.0"
-
-file-entry-cache@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
-  dependencies:
-    flat-cache "^1.2.1"
-    object-assign "^4.0.1"
-
-filename-regex@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775"
-
-fill-range@^2.1.0:
-  version "2.2.3"
-  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
-  dependencies:
-    is-number "^2.1.0"
-    isobject "^2.0.0"
-    randomatic "^1.1.3"
-    repeat-element "^1.1.2"
-    repeat-string "^1.5.2"
-
-find-index@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4"
-
-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"
-
-findup-sync@^0.4.2:
-  version "0.4.3"
-  resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12"
-  dependencies:
-    detect-file "^0.1.0"
-    is-glob "^2.0.1"
-    micromatch "^2.3.7"
-    resolve-dir "^0.1.0"
-
-fined@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/fined/-/fined-1.0.2.tgz#5b28424b760d7598960b7ef8480dff8ad3660e97"
-  dependencies:
-    expand-tilde "^1.2.1"
-    lodash.assignwith "^4.0.7"
-    lodash.isempty "^4.2.1"
-    lodash.isplainobject "^4.0.4"
-    lodash.isstring "^4.0.1"
-    lodash.pick "^4.2.1"
-    parse-filepath "^1.0.1"
-
-first-chunk-stream@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e"
-
-first-chunk-stream@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70"
-  dependencies:
-    readable-stream "^2.0.2"
-
-flagged-respawn@^0.3.2:
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5"
-
-flat-cache@^1.2.1:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96"
-  dependencies:
-    circular-json "^0.3.1"
-    del "^2.0.2"
-    graceful-fs "^4.1.2"
-    write "^0.2.1"
-
-for-in@^1.0.1:
-  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"
-
-fork-stream@^0.0.4:
-  version "0.0.4"
-  resolved "https://registry.yarnpkg.com/fork-stream/-/fork-stream-0.0.4.tgz#db849fce77f6708a5f8f386ae533a0907b54ae70"
-
-form-data@~2.1.1:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4"
-  dependencies:
-    asynckit "^0.4.0"
-    combined-stream "^1.0.5"
-    mime-types "^2.1.12"
-
-fresh@0.5.0:
-  version "0.5.0"
-  resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e"
-
-fs-exists-sync@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add"
-
-fs-readdir-recursive@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560"
-
-fs.realpath@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
-
-fsevents@^1.0.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff"
-  dependencies:
-    nan "^2.3.0"
-    node-pre-gyp "^0.6.29"
-
-fstream-ignore@~1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
-  dependencies:
-    fstream "^1.0.0"
-    inherits "2"
-    minimatch "^3.0.0"
-
-fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10:
-  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.1:
-  version "2.7.3"
-  resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.3.tgz#1c23855f962f17b3ad3d0dc7443f304542edfe09"
-  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"
-
-gaze@^0.5.1:
-  version "0.5.2"
-  resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f"
-  dependencies:
-    globule "~0.1.0"
-
-generate-function@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
-
-generate-object-property@^1.1.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
-  dependencies:
-    is-property "^1.0.0"
-
-get-stdin@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
-
-getpass@^0.1.1:
-  version "0.1.6"
-  resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6"
-  dependencies:
-    assert-plus "^1.0.0"
-
-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.0.1:
-  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-stream@^3.1.5:
-  version "3.1.18"
-  resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b"
-  dependencies:
-    glob "^4.3.1"
-    glob2base "^0.0.12"
-    minimatch "^2.0.1"
-    ordered-read-streams "^0.1.0"
-    through2 "^0.6.1"
-    unique-stream "^1.0.0"
-
-glob-watcher@^0.0.6:
-  version "0.0.6"
-  resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b"
-  dependencies:
-    gaze "^0.5.1"
-
-glob2base@^0.0.12:
-  version "0.0.12"
-  resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56"
-  dependencies:
-    find-index "^0.1.1"
-
-glob@7.0.5:
-  version "7.0.5"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95"
-  dependencies:
-    fs.realpath "^1.0.0"
-    inflight "^1.0.4"
-    inherits "2"
-    minimatch "^3.0.2"
-    once "^1.3.0"
-    path-is-absolute "^1.0.0"
-
-glob@^4.3.1:
-  version "4.5.3"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f"
-  dependencies:
-    inflight "^1.0.4"
-    inherits "2"
-    minimatch "^2.0.1"
-    once "^1.3.0"
-
-glob@^5.0.15:
-  version "5.0.15"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
-  dependencies:
-    inflight "^1.0.4"
-    inherits "2"
-    minimatch "2 || 3"
-    once "^1.3.0"
-    path-is-absolute "^1.0.0"
-
-glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6:
-  version "7.1.1"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
-  dependencies:
-    fs.realpath "^1.0.0"
-    inflight "^1.0.4"
-    inherits "2"
-    minimatch "^3.0.2"
-    once "^1.3.0"
-    path-is-absolute "^1.0.0"
-
-glob@~3.1.21:
-  version "3.1.21"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd"
-  dependencies:
-    graceful-fs "~1.2.0"
-    inherits "1"
-    minimatch "~0.2.11"
-
-global-modules@^0.2.3:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d"
-  dependencies:
-    global-prefix "^0.1.4"
-    is-windows "^0.2.0"
-
-global-prefix@^0.1.4:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f"
-  dependencies:
-    homedir-polyfill "^1.0.0"
-    ini "^1.3.4"
-    is-windows "^0.2.0"
-    which "^1.2.12"
-
-globals@^9.0.0, globals@^9.14.0:
-  version "9.16.0"
-  resolved "https://registry.yarnpkg.com/globals/-/globals-9.16.0.tgz#63e903658171ec2d9f51b1d31de5e2b8dc01fb80"
-
-globby@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
-  dependencies:
-    array-union "^1.0.1"
-    arrify "^1.0.0"
-    glob "^7.0.3"
-    object-assign "^4.0.1"
-    pify "^2.0.0"
-    pinkie-promise "^2.0.0"
-
-globule@~0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5"
-  dependencies:
-    glob "~3.1.21"
-    lodash "~1.0.1"
-    minimatch "~0.2.11"
-
-glogg@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5"
-  dependencies:
-    sparkles "^1.0.0"
-
-graceful-fs@^3.0.0:
-  version "3.0.11"
-  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818"
-  dependencies:
-    natives "^1.1.0"
-
-graceful-fs@^4.1.2, graceful-fs@^4.1.4:
-  version "4.1.11"
-  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
-
-graceful-fs@~1.2.0:
-  version "1.2.3"
-  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364"
-
-"graceful-readlink@>= 1.0.0":
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
-
-growl@1.9.2:
-  version "1.9.2"
-  resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f"
-
-gulp-babel@^6.1.2:
-  version "6.1.2"
-  resolved "https://registry.yarnpkg.com/gulp-babel/-/gulp-babel-6.1.2.tgz#7c0176e4ba3f244c60588a0c4b320a45d1adefce"
-  dependencies:
-    babel-core "^6.0.2"
-    gulp-util "^3.0.0"
-    object-assign "^4.0.1"
-    replace-ext "0.0.1"
-    through2 "^2.0.0"
-    vinyl-sourcemaps-apply "^0.2.0"
-
-gulp-if@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/gulp-if/-/gulp-if-2.0.2.tgz#a497b7e7573005041caa2bc8b7dda3c80444d629"
-  dependencies:
-    gulp-match "^1.0.3"
-    ternary-stream "^2.0.1"
-    through2 "^2.0.1"
-
-gulp-less@^3.3.2:
-  version "3.3.2"
-  resolved "http://registry.npm.taobao.org/gulp-less/download/gulp-less-3.3.2.tgz#f6636adcc66150a8902719fa59963fc7f862a49a"
-  dependencies:
-    accord "^0.27.3"
-    gulp-util "^3.0.7"
-    less "2.6.x || ^2.7.1"
-    object-assign "^4.0.1"
-    through2 "^2.0.0"
-    vinyl-sourcemaps-apply "^0.2.0"
-
-gulp-line-ending-corrector@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/gulp-line-ending-corrector/-/gulp-line-ending-corrector-1.0.1.tgz#b9be88c24a00337c4983ff99a4f6c31af1d5654a"
-  dependencies:
-    coffee-script "^1.10.0"
-    gulp-util "^3.0.6"
-    line-ending-corrector "^1.0.0"
-    through2 "^2.0.0"
-
-gulp-match@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/gulp-match/-/gulp-match-1.0.3.tgz#91c7c0d7f29becd6606d57d80a7f8776a87aba8e"
-  dependencies:
-    minimatch "^3.0.3"
-
-gulp-newer@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/gulp-newer/-/gulp-newer-1.3.0.tgz#d50ecacbb822eda492b57324a6c85a07fd9a55c1"
-  dependencies:
-    glob "^7.0.3"
-    gulp-util "^3.0.7"
-    kew "^0.7.0"
-
-gulp-plumber@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/gulp-plumber/-/gulp-plumber-1.1.0.tgz#f12176c2d0422f60306c242fff6a01a394faba09"
-  dependencies:
-    gulp-util "^3"
-    through2 "^2"
-
-gulp-util@^3, gulp-util@^3.0.0, gulp-util@^3.0.6, gulp-util@^3.0.7:
-  version "3.0.8"
-  resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
-  dependencies:
-    array-differ "^1.0.0"
-    array-uniq "^1.0.2"
-    beeper "^1.0.0"
-    chalk "^1.0.0"
-    dateformat "^2.0.0"
-    fancy-log "^1.1.0"
-    gulplog "^1.0.0"
-    has-gulplog "^0.1.0"
-    lodash._reescape "^3.0.0"
-    lodash._reevaluate "^3.0.0"
-    lodash._reinterpolate "^3.0.0"
-    lodash.template "^3.0.0"
-    minimist "^1.1.0"
-    multipipe "^0.1.2"
-    object-assign "^3.0.0"
-    replace-ext "0.0.1"
-    through2 "^2.0.0"
-    vinyl "^0.5.0"
-
-gulp-watch@^4.3.11:
-  version "4.3.11"
-  resolved "https://registry.yarnpkg.com/gulp-watch/-/gulp-watch-4.3.11.tgz#162fc563de9fc770e91f9a7ce3955513a9a118c0"
-  dependencies:
-    anymatch "^1.3.0"
-    chokidar "^1.6.1"
-    glob-parent "^3.0.1"
-    gulp-util "^3.0.7"
-    object-assign "^4.1.0"
-    path-is-absolute "^1.0.1"
-    readable-stream "^2.2.2"
-    slash "^1.0.0"
-    vinyl "^1.2.0"
-    vinyl-file "^2.0.0"
-
-gulp@^3.9.1:
-  version "3.9.1"
-  resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4"
-  dependencies:
-    archy "^1.0.0"
-    chalk "^1.0.0"
-    deprecated "^0.0.1"
-    gulp-util "^3.0.0"
-    interpret "^1.0.0"
-    liftoff "^2.1.0"
-    minimist "^1.1.0"
-    orchestrator "^0.3.0"
-    pretty-hrtime "^1.0.0"
-    semver "^4.1.0"
-    tildify "^1.0.0"
-    v8flags "^2.0.2"
-    vinyl-fs "^0.3.0"
-
-gulplog@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5"
-  dependencies:
-    glogg "^1.0.0"
-
-handlebars@^4.0.1:
-  version "4.0.6"
-  resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7"
-  dependencies:
-    async "^1.4.0"
-    optimist "^0.6.1"
-    source-map "^0.4.4"
-  optionalDependencies:
-    uglify-js "^2.6"
-
-har-schema@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
-
-har-validator@~4.2.1:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
-  dependencies:
-    ajv "^4.9.1"
-    har-schema "^1.0.5"
-
-has-ansi@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
-  dependencies:
-    ansi-regex "^2.0.0"
-
-has-flag@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
-
-has-gulplog@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce"
-  dependencies:
-    sparkles "^1.0.0"
-
-has-unicode@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
-
-hawk@~3.1.3:
-  version "3.1.3"
-  resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
-  dependencies:
-    boom "2.x.x"
-    cryptiles "2.x.x"
-    hoek "2.x.x"
-    sntp "1.x.x"
-
-hoek@2.x.x:
-  version "2.16.3"
-  resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
-
-home-or-tmp@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
-  dependencies:
-    os-homedir "^1.0.0"
-    os-tmpdir "^1.0.1"
-
-homedir-polyfill@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc"
-  dependencies:
-    parse-passwd "^1.0.0"
-
-hosted-git-info@^2.1.4:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.2.0.tgz#7a0d097863d886c0fabbdcd37bf1758d8becf8a5"
-
-http-errors@~1.6.1:
-  version "1.6.1"
-  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257"
-  dependencies:
-    depd "1.1.0"
-    inherits "2.0.3"
-    setprototypeof "1.0.3"
-    statuses ">= 1.3.1 < 2"
-
-http-signature@~1.1.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
-  dependencies:
-    assert-plus "^0.2.0"
-    jsprim "^1.2.2"
-    sshpk "^1.7.0"
-
-ignore@^3.2.0:
-  version "3.2.4"
-  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.4.tgz#4055e03596729a8fabe45a43c100ad5ed815c4e8"
-
-image-size@~0.5.0:
-  version "0.5.5"
-  resolved "http://registry.npm.taobao.org/image-size/download/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
-
-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"
-
-indx@^0.2.3:
-  version "0.2.3"
-  resolved "http://registry.npm.taobao.org/indx/download/indx-0.2.3.tgz#15dcf56ee9cf65c0234c513c27fbd580e70fbc50"
-
-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@1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b"
-
-inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
-
-ini@^1.3.4, ini@~1.3.0:
-  version "1.3.4"
-  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
-
-inquirer@^0.12.0:
-  version "0.12.0"
-  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e"
-  dependencies:
-    ansi-escapes "^1.1.0"
-    ansi-regex "^2.0.0"
-    chalk "^1.0.0"
-    cli-cursor "^1.0.1"
-    cli-width "^2.0.0"
-    figures "^1.3.5"
-    lodash "^4.3.0"
-    readline2 "^1.0.1"
-    run-async "^0.1.0"
-    rx-lite "^3.1.2"
-    string-width "^1.0.1"
-    strip-ansi "^3.0.0"
-    through "^2.3.6"
-
-interpret@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c"
-
-invariant@^2.2.0:
-  version "2.2.2"
-  resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
-  dependencies:
-    loose-envify "^1.0.0"
-
-is-absolute@^0.2.3:
-  version "0.2.6"
-  resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb"
-  dependencies:
-    is-relative "^0.2.1"
-    is-windows "^0.2.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-binary-path@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
-  dependencies:
-    binary-extensions "^1.0.0"
-
-is-buffer@^1.0.2:
-  version "1.1.5"
-  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc"
-
-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-dotfile@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d"
-
-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.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
-
-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:
-  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-my-json-valid@^2.10.0:
-  version "2.16.0"
-  resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693"
-  dependencies:
-    generate-function "^2.0.0"
-    generate-object-property "^1.1.0"
-    jsonpointer "^4.0.0"
-    xtend "^4.0.0"
-
-is-number@^2.0.2, 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-path-cwd@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
-
-is-path-in-cwd@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc"
-  dependencies:
-    is-path-inside "^1.0.0"
-
-is-path-inside@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f"
-  dependencies:
-    path-is-inside "^1.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-property@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
-
-is-relative@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5"
-  dependencies:
-    is-unc-path "^0.1.1"
-
-is-resolvable@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62"
-  dependencies:
-    tryit "^1.0.1"
-
-is-typedarray@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
-
-is-unc-path@^0.1.1:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9"
-  dependencies:
-    unc-path-regex "^0.1.0"
-
-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@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c"
-
-isarray@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
-
-isarray@1.0.0, 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@^1.1.1:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0"
-
-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"
-
-isstream@~0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
-
-istanbul@^0.4.5:
-  version "0.4.5"
-  resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b"
-  dependencies:
-    abbrev "1.0.x"
-    async "1.x"
-    escodegen "1.8.x"
-    esprima "2.7.x"
-    glob "^5.0.15"
-    handlebars "^4.0.1"
-    js-yaml "3.x"
-    mkdirp "0.5.x"
-    nopt "3.x"
-    once "1.x"
-    resolve "1.1.x"
-    supports-color "^3.1.0"
-    which "^1.1.1"
-    wordwrap "^1.0.0"
-
-jodid25519@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967"
-  dependencies:
-    jsbn "~0.1.0"
-
-js-tokens@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7"
-
-js-yaml@3.x, js-yaml@^3.5.1:
-  version "3.8.2"
-  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.2.tgz#02d3e2c0f6beab20248d412c352203827d786721"
-  dependencies:
-    argparse "^1.0.7"
-    esprima "^3.1.1"
-
-jsbn@~0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
-
-jsesc@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
-
-jsesc@~0.5.0:
-  version "0.5.0"
-  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
-
-json-schema@0.2.3:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
-
-json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
-  dependencies:
-    jsonify "~0.0.0"
-
-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"
-
-json3@3.3.2:
-  version "3.3.2"
-  resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
-
-json5@^0.5.0:
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
-
-jsonify@~0.0.0:
-  version "0.0.0"
-  resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
-
-jsonpointer@^4.0.0:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
-
-jsprim@^1.2.2:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252"
-  dependencies:
-    extsprintf "1.0.2"
-    json-schema "0.2.3"
-    verror "1.3.6"
-
-kew@^0.7.0:
-  version "0.7.0"
-  resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b"
-
-kind-of@^3.0.2:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47"
-  dependencies:
-    is-buffer "^1.0.2"
-
-lazy-cache@^1.0.3:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
-
-lerna@2.0.0-beta.31:
-  version "2.0.0-beta.31"
-  resolved "https://registry.yarnpkg.com/lerna/-/lerna-2.0.0-beta.31.tgz#68da53b860f8193d4653a6d0601ef300b8d7176d"
-  dependencies:
-    async "^1.5.0"
-    chalk "^1.1.1"
-    cmd-shim "^2.0.2"
-    command-join "^1.1.1"
-    cross-spawn "^4.0.0"
-    glob "^7.0.6"
-    inquirer "^0.12.0"
-    lodash.find "^4.3.0"
-    lodash.unionwith "^4.2.0"
-    meow "^3.7.0"
-    minimatch "^3.0.0"
-    mkdirp "^0.5.1"
-    normalize-path "^2.0.1"
-    object-assign "^4.0.1"
-    object-assign-sorted "^1.0.0"
-    pad "^1.0.0"
-    path-exists "^2.1.0"
-    progress "^1.1.8"
-    read-cmd-shim "^1.0.1"
-    rimraf "^2.4.4"
-    semver "^5.1.0"
-    signal-exit "^2.1.2"
-    sync-exec "^0.6.2"
-
-"less@2.6.x || ^2.7.1", less@^2.7.3:
-  version "2.7.3"
-  resolved "http://registry.npm.taobao.org/less/download/less-2.7.3.tgz#cc1260f51c900a9ec0d91fb6998139e02507b63b"
-  optionalDependencies:
-    errno "^0.1.1"
-    graceful-fs "^4.1.2"
-    image-size "~0.5.0"
-    mime "^1.2.11"
-    mkdirp "^0.5.0"
-    promise "^7.1.1"
-    request "2.81.0"
-    source-map "^0.5.3"
-
-levn@^0.3.0, levn@~0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
-  dependencies:
-    prelude-ls "~1.1.2"
-    type-check "~0.3.2"
-
-liftoff@^2.1.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385"
-  dependencies:
-    extend "^3.0.0"
-    findup-sync "^0.4.2"
-    fined "^1.0.1"
-    flagged-respawn "^0.3.2"
-    lodash.isplainobject "^4.0.4"
-    lodash.isstring "^4.0.1"
-    lodash.mapvalues "^4.4.0"
-    rechoir "^0.6.2"
-    resolve "^1.1.7"
-
-line-ending-corrector@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/line-ending-corrector/-/line-ending-corrector-1.0.0.tgz#b13cdef8ad36aeec02a1f677621c41bd0253bd9b"
-  dependencies:
-    coffee-script "^1.10.0"
-
-load-json-file@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/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"
-
-lodash._baseassign@^3.0.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e"
-  dependencies:
-    lodash._basecopy "^3.0.0"
-    lodash.keys "^3.0.0"
-
-lodash._basecopy@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
-
-lodash._basecreate@^3.0.0:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821"
-
-lodash._basetostring@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5"
-
-lodash._basevalues@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7"
-
-lodash._getnative@^3.0.0:
-  version "3.9.1"
-  resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
-
-lodash._isiterateecall@^3.0.0:
-  version "3.0.9"
-  resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
-
-lodash._reescape@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a"
-
-lodash._reevaluate@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed"
-
-lodash._reinterpolate@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
-
-lodash._root@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
-
-lodash.assignwith@^4.0.7:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb"
-
-lodash.clone@^4.3.2:
-  version "4.5.0"
-  resolved "http://registry.npm.taobao.org/lodash.clone/download/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
-
-lodash.create@3.1.1:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7"
-  dependencies:
-    lodash._baseassign "^3.0.0"
-    lodash._basecreate "^3.0.0"
-    lodash._isiterateecall "^3.0.0"
-
-lodash.defaults@^4.0.1:
-  version "4.2.0"
-  resolved "http://registry.npm.taobao.org/lodash.defaults/download/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
-
-lodash.escape@^3.0.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698"
-  dependencies:
-    lodash._root "^3.0.0"
-
-lodash.find@^4.3.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1"
-
-lodash.flatten@^4.2.0:
-  version "4.4.0"
-  resolved "http://registry.npm.taobao.org/lodash.flatten/download/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
-
-lodash.isarguments@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
-
-lodash.isarray@^3.0.0:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
-
-lodash.isempty@^4.2.1:
-  version "4.4.0"
-  resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e"
-
-lodash.isplainobject@^4.0.4:
-  version "4.0.6"
-  resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
-
-lodash.isstring@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
-
-lodash.keys@^3.0.0:
-  version "3.1.2"
-  resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
-  dependencies:
-    lodash._getnative "^3.0.0"
-    lodash.isarguments "^3.0.0"
-    lodash.isarray "^3.0.0"
-
-lodash.mapvalues@^4.4.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c"
-
-lodash.merge@^4.4.0:
-  version "4.6.0"
-  resolved "http://registry.npm.taobao.org/lodash.merge/download/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5"
-
-lodash.partialright@^4.1.4:
-  version "4.2.1"
-  resolved "http://registry.npm.taobao.org/lodash.partialright/download/lodash.partialright-4.2.1.tgz#0130d80e83363264d40074f329b8a3e7a8a1cc4b"
-
-lodash.pick@^4.2.1:
-  version "4.4.0"
-  resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
-
-lodash.pickby@^4.6.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff"
-
-lodash.restparam@^3.0.0:
-  version "3.6.1"
-  resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
-
-lodash.template@^3.0.0:
-  version "3.6.2"
-  resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f"
-  dependencies:
-    lodash._basecopy "^3.0.0"
-    lodash._basetostring "^3.0.0"
-    lodash._basevalues "^3.0.0"
-    lodash._isiterateecall "^3.0.0"
-    lodash._reinterpolate "^3.0.0"
-    lodash.escape "^3.0.0"
-    lodash.keys "^3.0.0"
-    lodash.restparam "^3.0.0"
-    lodash.templatesettings "^3.0.0"
-
-lodash.templatesettings@^3.0.0:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5"
-  dependencies:
-    lodash._reinterpolate "^3.0.0"
-    lodash.escape "^3.0.0"
-
-lodash.unionwith@^4.2.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/lodash.unionwith/-/lodash.unionwith-4.6.0.tgz#74d140b5ca8146e6c643c3724f5152538d9ac1f0"
-
-lodash.uniq@^4.3.0:
-  version "4.5.0"
-  resolved "http://registry.npm.taobao.org/lodash.uniq/download/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
-
-lodash@^4.0.0, lodash@^4.2.0, lodash@^4.3.0:
-  version "4.17.4"
-  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
-
-lodash@~1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551"
-
-longest@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
-
-loose-envify@^1.0.0:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
-  dependencies:
-    js-tokens "^3.0.0"
-
-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@2:
-  version "2.7.3"
-  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
-
-lru-cache@^4.0.1:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e"
-  dependencies:
-    pseudomap "^1.0.1"
-    yallist "^2.0.0"
-
-map-cache@^0.2.0:
-  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"
-
-meow@^3.7.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"
-
-merge-stream@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1"
-  dependencies:
-    readable-stream "^2.0.1"
-
-micromatch@^2.1.5, micromatch@^2.3.7:
-  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"
-
-mime-db@~1.26.0:
-  version "1.26.0"
-  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.26.0.tgz#eaffcd0e4fc6935cf8134da246e2e6c35305adff"
-
-mime-types@^2.1.12, mime-types@~2.1.7:
-  version "2.1.14"
-  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee"
-  dependencies:
-    mime-db "~1.26.0"
-
-mime@1.3.4:
-  version "1.3.4"
-  resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53"
-
-mime@^1.2.11:
-  version "1.4.1"
-  resolved "http://registry.npm.taobao.org/mime/download/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
-
-"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774"
-  dependencies:
-    brace-expansion "^1.0.0"
-
-minimatch@^2.0.1:
-  version "2.0.10"
-  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7"
-  dependencies:
-    brace-expansion "^1.0.0"
-
-minimatch@~0.2.11:
-  version "0.2.14"
-  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a"
-  dependencies:
-    lru-cache "2"
-    sigmund "~1.0.0"
-
-minimist@0.0.8, minimist@~0.0.1:
-  version "0.0.8"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
-
-minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
-
-mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
-  dependencies:
-    minimist "0.0.8"
-
-mkpath@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/mkpath/-/mkpath-1.0.0.tgz#ebb3a977e7af1c683ae6fda12b545a6ba6c5853d"
-
-mocha@^3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.2.0.tgz#7dc4f45e5088075171a68896814e6ae9eb7a85e3"
-  dependencies:
-    browser-stdout "1.3.0"
-    commander "2.9.0"
-    debug "2.2.0"
-    diff "1.4.0"
-    escape-string-regexp "1.0.5"
-    glob "7.0.5"
-    growl "1.9.2"
-    json3 "3.3.2"
-    lodash.create "3.1.1"
-    mkdirp "0.5.1"
-    supports-color "3.1.2"
-
-ms@0.7.1:
-  version "0.7.1"
-  resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
-
-ms@0.7.2:
-  version "0.7.2"
-  resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
-
-multipipe@^0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b"
-  dependencies:
-    duplexer2 "0.0.2"
-
-mute-stream@0.0.5:
-  version "0.0.5"
-  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
-
-nan@^2.3.0:
-  version "2.5.1"
-  resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.1.tgz#d5b01691253326a97a2bbee9e61c55d8d60351e2"
-
-natives@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31"
-
-natural-compare@^1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
-
-node-pre-gyp@^0.6.29:
-  version "0.6.33"
-  resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.33.tgz#640ac55198f6a925972e0c16c4ac26a034d5ecc9"
-  dependencies:
-    mkdirp "~0.5.1"
-    nopt "~3.0.6"
-    npmlog "^4.0.1"
-    rc "~1.1.6"
-    request "^2.79.0"
-    rimraf "~2.5.4"
-    semver "~5.3.0"
-    tar "~2.2.1"
-    tar-pack "~3.3.0"
-
-nopt@3.x, nopt@~3.0.6:
-  version "3.0.6"
-  resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
-  dependencies:
-    abbrev "1"
-
-normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
-  version "2.3.6"
-  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.6.tgz#498fa420c96401f787402ba21e600def9f981fff"
-  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.0.1"
-  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a"
-
-npmlog@^4.0.1:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f"
-  dependencies:
-    are-we-there-yet "~1.1.2"
-    console-control-strings "~1.1.0"
-    gauge "~2.7.1"
-    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.8.1:
-  version "0.8.2"
-  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
-
-object-assign-sorted@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/object-assign-sorted/-/object-assign-sorted-1.0.0.tgz#e739f698164014ec1f050f38decabad1e9b228bf"
-  dependencies:
-    object-assign "^4.0.1"
-    sorted-object "^2.0.0"
-
-object-assign@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
-
-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.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"
-
-on-finished@~2.3.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
-  dependencies:
-    ee-first "1.1.1"
-
-once@1.x, once@^1.3.0, once@^1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
-  dependencies:
-    wrappy "1"
-
-once@~1.3.0, once@~1.3.3:
-  version "1.3.3"
-  resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20"
-  dependencies:
-    wrappy "1"
-
-onetime@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
-
-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"
-
-optionator@^0.8.1, optionator@^0.8.2:
-  version "0.8.2"
-  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
-  dependencies:
-    deep-is "~0.1.3"
-    fast-levenshtein "~2.0.4"
-    levn "~0.3.0"
-    prelude-ls "~1.1.2"
-    type-check "~0.3.2"
-    wordwrap "~1.0.0"
-
-orchestrator@^0.3.0:
-  version "0.3.8"
-  resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e"
-  dependencies:
-    end-of-stream "~0.1.5"
-    sequencify "~0.0.7"
-    stream-consume "~0.1.0"
-
-ordered-read-streams@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126"
-
-os-homedir@^1.0.0, os-homedir@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
-
-os-tmpdir@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
-
-output-file-sync@^1.1.0:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76"
-  dependencies:
-    graceful-fs "^4.1.4"
-    mkdirp "^0.5.1"
-    object-assign "^4.1.0"
-
-pad@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/pad/-/pad-1.1.0.tgz#7a7d185200ebac32f9f12ee756c3a1d087b3190b"
-
-parse-filepath@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73"
-  dependencies:
-    is-absolute "^0.2.3"
-    map-cache "^0.2.0"
-    path-root "^0.1.1"
-
-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-passwd@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
-
-parseurl@~1.3.1:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56"
-
-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, path-exists@^2.1.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-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
-
-path-is-inside@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
-
-path-parse@^1.0.5:
-  version "1.0.5"
-  resolved "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
-
-path-root-regex@^0.1.0:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
-
-path-root@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7"
-  dependencies:
-    path-root-regex "^0.1.0"
-
-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"
-
-performance-now@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
-
-pify@^2.0.0, pify@^2.3.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
-
-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"
-
-pluralize@^1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
-
-prelude-ls@~1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
-
-preserve@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
-
-pretty-hrtime@^1.0.0:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
-
-private@^0.1.6:
-  version "0.1.7"
-  resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1"
-
-process-nextick-args@~1.0.6:
-  version "1.0.7"
-  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
-
-progress@^1.1.8:
-  version "1.1.8"
-  resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
-
-promise@^7.1.1:
-  version "7.3.1"
-  resolved "http://registry.npm.taobao.org/promise/download/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
-  dependencies:
-    asap "~2.0.3"
-
-prr@~0.0.0:
-  version "0.0.0"
-  resolved "http://registry.npm.taobao.org/prr/download/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a"
-
-pseudomap@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
-
-punycode@^1.4.1:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
-
-qs@~6.4.0:
-  version "6.4.0"
-  resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
-
-randomatic@^1.1.3:
-  version "1.1.6"
-  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb"
-  dependencies:
-    is-number "^2.0.2"
-    kind-of "^3.0.2"
-
-range-parser@~1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
-
-rc@~1.1.6:
-  version "1.1.7"
-  resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.7.tgz#c5ea564bb07aff9fd3a5b32e906c1d3a65940fea"
-  dependencies:
-    deep-extend "~0.4.0"
-    ini "~1.3.0"
-    minimist "^1.2.0"
-    strip-json-comments "~2.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-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@^1.0.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"
-
-"readable-stream@>=1.0.33-1 <1.1.0-0":
-  version "1.0.34"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
-  dependencies:
-    core-util-is "~1.0.0"
-    inherits "~2.0.1"
-    isarray "0.0.1"
-    string_decoder "~0.10.x"
-
-readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2:
-  version "2.2.3"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.3.tgz#9cf49463985df016c8ae8813097a9293a9b33729"
-  dependencies:
-    buffer-shims "^1.0.0"
-    core-util-is "~1.0.0"
-    inherits "~2.0.1"
-    isarray "~1.0.0"
-    process-nextick-args "~1.0.6"
-    string_decoder "~0.10.x"
-    util-deprecate "~1.0.1"
-
-readable-stream@~1.1.9:
-  version "1.1.14"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
-  dependencies:
-    core-util-is "~1.0.0"
-    inherits "~2.0.1"
-    isarray "0.0.1"
-    string_decoder "~0.10.x"
-
-readable-stream@~2.1.4:
-  version "2.1.5"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0"
-  dependencies:
-    buffer-shims "^1.0.0"
-    core-util-is "~1.0.0"
-    inherits "~2.0.1"
-    isarray "~1.0.0"
-    process-nextick-args "~1.0.6"
-    string_decoder "~0.10.x"
-    util-deprecate "~1.0.1"
-
-readdirp@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
-  dependencies:
-    graceful-fs "^4.1.2"
-    minimatch "^3.0.2"
-    readable-stream "^2.0.2"
-    set-immediate-shim "^1.0.1"
-
-readline2@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
-  dependencies:
-    code-point-at "^1.0.0"
-    is-fullwidth-code-point "^1.0.0"
-    mute-stream "0.0.5"
-
-rechoir@^0.6.2:
-  version "0.6.2"
-  resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
-  dependencies:
-    resolve "^1.1.6"
-
-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"
-
-regenerate@^1.2.1:
-  version "1.3.2"
-  resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260"
-
-regenerator-runtime@^0.10.0:
-  version "0.10.3"
-  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e"
-
-regenerator-transform@0.9.8:
-  version "0.9.8"
-  resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c"
-  dependencies:
-    babel-runtime "^6.18.0"
-    babel-types "^6.19.0"
-    private "^0.1.6"
-
-regex-cache@^0.4.2:
-  version "0.4.3"
-  resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145"
-  dependencies:
-    is-equal-shallow "^0.1.3"
-    is-primitive "^2.0.0"
-
-regexpu-core@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
-  dependencies:
-    regenerate "^1.2.1"
-    regjsgen "^0.2.0"
-    regjsparser "^0.1.4"
-
-regjsgen@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
-
-regjsparser@^0.1.4:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
-  dependencies:
-    jsesc "~0.5.0"
-
-repeat-element@^1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
-
-repeat-string@^1.5.2, repeat-string@^1.5.4:
-  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"
-
-replace-ext@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
-
-request@2.81.0, request@^2.79.0:
-  version "2.81.0"
-  resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
-  dependencies:
-    aws-sign2 "~0.6.0"
-    aws4 "^1.2.1"
-    caseless "~0.12.0"
-    combined-stream "~1.0.5"
-    extend "~3.0.0"
-    forever-agent "~0.6.1"
-    form-data "~2.1.1"
-    har-validator "~4.2.1"
-    hawk "~3.1.3"
-    http-signature "~1.1.0"
-    is-typedarray "~1.0.0"
-    isstream "~0.1.2"
-    json-stringify-safe "~5.0.1"
-    mime-types "~2.1.7"
-    oauth-sign "~0.8.1"
-    performance-now "^0.2.0"
-    qs "~6.4.0"
-    safe-buffer "^5.0.1"
-    stringstream "~0.0.4"
-    tough-cookie "~2.3.0"
-    tunnel-agent "^0.6.0"
-    uuid "^3.0.0"
-
-require-uncached@^1.0.2:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
-  dependencies:
-    caller-path "^0.1.0"
-    resolve-from "^1.0.0"
-
-resolve-dir@^0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e"
-  dependencies:
-    expand-tilde "^1.2.2"
-    global-modules "^0.2.3"
-
-resolve-from@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
-
-resolve@1.1.x, resolve@^1.1.6, resolve@^1.1.7:
-  version "1.1.7"
-  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
-
-resolve@^1.3.3:
-  version "1.5.0"
-  resolved "http://registry.npm.taobao.org/resolve/download/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
-  dependencies:
-    path-parse "^1.0.5"
-
-restore-cursor@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
-  dependencies:
-    exit-hook "^1.0.0"
-    onetime "^1.0.0"
-
-right-align@^0.1.1:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
-  dependencies:
-    align-text "^0.1.1"
-
-rimraf@2, rimraf@^2.2.8, rimraf@^2.4.4:
-  version "2.6.1"
-  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d"
-  dependencies:
-    glob "^7.0.5"
-
-rimraf@~2.5.1, rimraf@~2.5.4:
-  version "2.5.4"
-  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04"
-  dependencies:
-    glob "^7.0.5"
-
-run-async@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
-  dependencies:
-    once "^1.3.0"
-
-rx-lite@^3.1.2:
-  version "3.1.2"
-  resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
-
-safe-buffer@^5.0.1:
-  version "5.0.1"
-  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7"
-
-"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@~5.3.0:
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
-
-semver@^4.1.0:
-  version "4.3.6"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
-
-semver@^5.3.0:
-  version "5.4.1"
-  resolved "http://registry.npm.taobao.org/semver/download/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
-
-send@0.15.1:
-  version "0.15.1"
-  resolved "https://registry.yarnpkg.com/send/-/send-0.15.1.tgz#8a02354c26e6f5cca700065f5f0cdeba90ec7b5f"
-  dependencies:
-    debug "2.6.1"
-    depd "~1.1.0"
-    destroy "~1.0.4"
-    encodeurl "~1.0.1"
-    escape-html "~1.0.3"
-    etag "~1.8.0"
-    fresh "0.5.0"
-    http-errors "~1.6.1"
-    mime "1.3.4"
-    ms "0.7.2"
-    on-finished "~2.3.0"
-    range-parser "~1.2.0"
-    statuses "~1.3.1"
-
-sequencify@~0.0.7:
-  version "0.0.7"
-  resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c"
-
-serve-static@^1.11.1:
-  version "1.12.1"
-  resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.1.tgz#7443a965e3ced647aceb5639fa06bf4d1bbe0039"
-  dependencies:
-    encodeurl "~1.0.1"
-    escape-html "~1.0.3"
-    parseurl "~1.3.1"
-    send "0.15.1"
-
-set-blocking@~2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
-
-set-immediate-shim@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
-
-setprototypeof@1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
-
-shelljs@^0.7.5:
-  version "0.7.7"
-  resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1"
-  dependencies:
-    glob "^7.0.0"
-    interpret "^1.0.0"
-    rechoir "^0.6.2"
-
-sigmund@~1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
-
-signal-exit@^2.1.2:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-2.1.2.tgz#375879b1f92ebc3b334480d038dc546a6d558564"
-
-signal-exit@^3.0.0:
-  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"
-
-slice-ansi@0.0.4:
-  version "0.0.4"
-  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
-
-sntp@1.x.x:
-  version "1.0.9"
-  resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
-  dependencies:
-    hoek "2.x.x"
-
-sorted-object@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc"
-
-source-map-support@^0.4.2:
-  version "0.4.11"
-  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.11.tgz#647f939978b38535909530885303daf23279f322"
-  dependencies:
-    source-map "^0.5.3"
-
-source-map@^0.4.4:
-  version "0.4.4"
-  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
-  dependencies:
-    amdefine ">=0.0.4"
-
-source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@~0.5.1:
-  version "0.5.6"
-  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
-
-source-map@~0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d"
-  dependencies:
-    amdefine ">=0.0.4"
-
-sparkles@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3"
-
-spdx-correct@~1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
-  dependencies:
-    spdx-license-ids "^1.0.2"
-
-spdx-expression-parse@~1.0.0:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c"
-
-spdx-license-ids@^1.0.2:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
-
-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.11.0"
-  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.11.0.tgz#2d8d5ebb4a6fab28ffba37fa62a90f4a3ea59d77"
-  dependencies:
-    asn1 "~0.2.3"
-    assert-plus "^1.0.0"
-    dashdash "^1.12.0"
-    getpass "^0.1.1"
-  optionalDependencies:
-    bcrypt-pbkdf "^1.0.0"
-    ecc-jsbn "~0.1.1"
-    jodid25519 "^1.0.0"
-    jsbn "~0.1.0"
-    tweetnacl "~0.14.0"
-
-"statuses@>= 1.3.1 < 2", statuses@~1.3.1:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
-
-stream-consume@~0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f"
-
-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@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e"
-  dependencies:
-    is-fullwidth-code-point "^2.0.0"
-    strip-ansi "^3.0.0"
-
-string_decoder@~0.10.x:
-  version "0.10.31"
-  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
-
-stringstream@~0.0.4:
-  version "0.0.5"
-  resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
-
-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-bom-stream@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz#f87db5ef2613f6968aa545abfe1ec728b6a829ca"
-  dependencies:
-    first-chunk-stream "^2.0.0"
-    strip-bom "^2.0.0"
-
-strip-bom@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794"
-  dependencies:
-    first-chunk-stream "^1.0.0"
-    is-utf8 "^0.2.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-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-json-comments@~2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
-
-supports-color@3.1.2, supports-color@^3.1.0:
-  version "3.1.2"
-  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5"
-  dependencies:
-    has-flag "^1.0.0"
-
-supports-color@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
-
-sync-exec@^0.6.2:
-  version "0.6.2"
-  resolved "https://registry.yarnpkg.com/sync-exec/-/sync-exec-0.6.2.tgz#717d22cc53f0ce1def5594362f3a89a2ebb91105"
-
-table@^3.7.8:
-  version "3.8.3"
-  resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f"
-  dependencies:
-    ajv "^4.7.0"
-    ajv-keywords "^1.0.0"
-    chalk "^1.1.1"
-    lodash "^4.0.0"
-    slice-ansi "0.0.4"
-    string-width "^2.0.0"
-
-tar-pack@~3.3.0:
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae"
-  dependencies:
-    debug "~2.2.0"
-    fstream "~1.0.10"
-    fstream-ignore "~1.0.5"
-    once "~1.3.3"
-    readable-stream "~2.1.4"
-    rimraf "~2.5.1"
-    tar "~2.2.1"
-    uid-number "~0.0.6"
-
-tar@~2.2.1:
-  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"
-
-ternary-stream@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-2.0.1.tgz#064e489b4b5bf60ba6a6b7bc7f2f5c274ecf8269"
-  dependencies:
-    duplexify "^3.5.0"
-    fork-stream "^0.0.4"
-    merge-stream "^1.0.0"
-    through2 "^2.0.1"
-
-text-table@~0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
-
-through2@^0.6.1:
-  version "0.6.5"
-  resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48"
-  dependencies:
-    readable-stream ">=1.0.33-1 <1.1.0-0"
-    xtend ">=4.0.0 <4.1.0-0"
-
-through2@^2, through2@^2.0.0, through2@^2.0.1, through2@^2.0.3:
-  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.3.6:
-  version "2.3.8"
-  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
-
-tildify@^1.0.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a"
-  dependencies:
-    os-homedir "^1.0.0"
-
-time-stamp@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.0.1.tgz#9f4bd23559c9365966f3302dbba2b07c6b99b151"
-
-to-fast-properties@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320"
-
-tough-cookie@~2.3.0:
-  version "2.3.2"
-  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a"
-  dependencies:
-    punycode "^1.4.1"
-
-trim-newlines@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
-
-trim-right@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
-
-tryit@^1.0.1:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb"
-
-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"
-
-type-check@~0.3.2:
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
-  dependencies:
-    prelude-ls "~1.1.2"
-
-typedarray@^0.0.6:
-  version "0.0.6"
-  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
-
-uglify-js@^2.6:
-  version "2.8.12"
-  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.12.tgz#8a50f5d482243650b7108f6080aa3a6afe2a6c55"
-  dependencies:
-    source-map "~0.5.1"
-    uglify-to-browserify "~1.0.0"
-    yargs "~3.10.0"
-
-uglify-js@^2.8.22:
-  version "2.8.29"
-  resolved "http://registry.npm.taobao.org/uglify-js/download/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
-  dependencies:
-    source-map "~0.5.1"
-    yargs "~3.10.0"
-  optionalDependencies:
-    uglify-to-browserify "~1.0.0"
-
-uglify-to-browserify@~1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
-
-uid-number@~0.0.6:
-  version "0.0.6"
-  resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
-
-unc-path-regex@^0.1.0:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
-
-unique-stream@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b"
-
-user-home@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
-
-user-home@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
-  dependencies:
-    os-homedir "^1.0.0"
-
-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.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
-
-v8flags@^2.0.10, v8flags@^2.0.2:
-  version "2.0.11"
-  resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881"
-  dependencies:
-    user-home "^1.1.1"
-
-validate-npm-package-license@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
-  dependencies:
-    spdx-correct "~1.0.0"
-    spdx-expression-parse "~1.0.0"
-
-verror@1.3.6:
-  version "1.3.6"
-  resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c"
-  dependencies:
-    extsprintf "1.0.2"
-
-vinyl-file@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/vinyl-file/-/vinyl-file-2.0.0.tgz#a7ebf5ffbefda1b7d18d140fcb07b223efb6751a"
-  dependencies:
-    graceful-fs "^4.1.2"
-    pify "^2.3.0"
-    pinkie-promise "^2.0.0"
-    strip-bom "^2.0.0"
-    strip-bom-stream "^2.0.0"
-    vinyl "^1.1.0"
-
-vinyl-fs@^0.3.0:
-  version "0.3.14"
-  resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6"
-  dependencies:
-    defaults "^1.0.0"
-    glob-stream "^3.1.5"
-    glob-watcher "^0.0.6"
-    graceful-fs "^3.0.0"
-    mkdirp "^0.5.0"
-    strip-bom "^1.0.0"
-    through2 "^0.6.1"
-    vinyl "^0.4.0"
-
-vinyl-sourcemaps-apply@^0.2.0:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705"
-  dependencies:
-    source-map "^0.5.1"
-
-vinyl@^0.4.0:
-  version "0.4.6"
-  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847"
-  dependencies:
-    clone "^0.2.0"
-    clone-stats "^0.0.1"
-
-vinyl@^0.5.0:
-  version "0.5.3"
-  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde"
-  dependencies:
-    clone "^1.0.0"
-    clone-stats "^0.0.1"
-    replace-ext "0.0.1"
-
-vinyl@^1.1.0, vinyl@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884"
-  dependencies:
-    clone "^1.0.0"
-    clone-stats "^0.0.1"
-    replace-ext "0.0.1"
-
-when@^3.7.8:
-  version "3.7.8"
-  resolved "http://registry.npm.taobao.org/when/download/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82"
-
-which@^1.1.1, which@^1.2.12, which@^1.2.9:
-  version "1.2.12"
-  resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192"
-  dependencies:
-    isexe "^1.1.1"
-
-wide-align@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad"
-  dependencies:
-    string-width "^1.0.1"
-
-window-size@0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
-
-wordwrap@0.0.2:
-  version "0.0.2"
-  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
-
-wordwrap@^1.0.0, wordwrap@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
-
-wordwrap@~0.0.2:
-  version "0.0.3"
-  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
-
-wrappy@1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
-
-write@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
-  dependencies:
-    mkdirp "^0.5.1"
-
-"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
-
-yallist@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.1.tgz#6c11279640abd6ed0a86dd32ed56b03caa9df4f1"
-
-yargs@~3.10.0:
-  version "3.10.0"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
-  dependencies:
-    camelcase "^1.0.2"
-    cliui "^2.1.0"
-    decamelize "^1.0.0"
-    window-size "0.1.0"
