This is an automated email from the ASF dual-hosted git repository.

sushuang pushed a commit to branch typescript
in repository https://gitbox.apache.org/repos/asf/incubator-echarts.git

commit ba1639f01f5e12b7e5a3fc00543b8b92f9718035
Author: 100pah <sushuang0...@gmail.com>
AuthorDate: Sat Feb 15 11:23:08 2020 +0800

    make build tool support ts.
    And update dependencies.
---
 .gitignore                                         |    4 +-
 build/build.js                                     |  275 ++++-
 build/config.js                                    |  118 +-
 ...-plugin-ec-lang.js => ec-lang-rollup-plugin.js} |    0
 build/pre-publish.js                               |  342 +++++-
 ...ec-remove-dev.js => remove-dev-babel-plugin.js} |   44 +-
 ...c-remove-dev.js => remove-dev-rollup-plugin.js} |   14 +-
 ...ollup-plugin-ec-remove-dev.js => remove-dev.js} |   51 +-
 package-lock.json                                  | 1222 +++++++++++++++++++-
 package.json                                       |   20 +-
 tsconfig.json                                      |   24 +
 11 files changed, 1889 insertions(+), 225 deletions(-)

diff --git a/.gitignore b/.gitignore
index edf6813..4097609 100644
--- a/.gitignore
+++ b/.gitignore
@@ -173,7 +173,9 @@ map/tool
 map/raw
 theme/thumb
 /lib
+/esm
+pre-publish-tmp
 todo
 **/*.log
 *.sublime-workspace
-*.sublime-project
+*.sublime-project
\ No newline at end of file
diff --git a/build/build.js b/build/build.js
index bd252a2..1be3afd 100755
--- a/build/build.js
+++ b/build/build.js
@@ -21,15 +21,18 @@
 
 const fsExtra = require('fs-extra');
 const fs = require('fs');
-const {resolve} = require('path');
+const nodePath = require('path');
 const config = require('./config.js');
 const commander = require('commander');
-const {build, watch, color} = require('zrender/build/helper');
-const ecLangPlugin = require('./rollup-plugin-ec-lang');
+const chalk = require('chalk');
+const rollup = require('rollup');
+const ecLangPlugin = require('./ec-lang-rollup-plugin');
 const prePublish = require('./pre-publish');
-const recheckDEV = 
require('zrender/build/babel-plugin-transform-remove-dev').recheckDEV;
+const recheckDEV = require('./remove-dev').recheckDEV;
+const assert = require('assert');
 
-function run() {
+
+async function run() {
 
     /**
      * Tips for `commander`:
@@ -148,7 +151,7 @@ function run() {
         watch(config.createECharts(opt));
     }
     else if (isPrePublish) {
-        prePublish();
+        await prePublish();
     }
     else if (isRelease) {
         let configs = [];
@@ -180,21 +183,19 @@ function run() {
             config.createDataTool(true)
         );
 
-        build(configs)
-            .then(function () {
-                checkCode(configForCheck);
-                prePublish();
-            }).catch(handleBuildError);
+        await build(configs);
+
+        checkBundleCode(configForCheck);
+
+        await prePublish();
     }
     else {
         let cfg = config.createECharts(opt);
-        build([cfg])
-            .then(function () {
-                if (opt.removeDev) {
-                    checkCode(cfg);
-                }
-            })
-            .catch(handleBuildError);
+        await build([cfg]);
+
+        if (opt.removeDev) {
+            checkBundleCode(cfg);
+        }
     }
 }
 
@@ -207,18 +208,14 @@ function normalizeParams(opt) {
     }
 }
 
-function handleBuildError(err) {
-    console.log(err);
-}
-
-function checkCode(singleConfig) {
+function checkBundleCode(singleConfig) {
     // Make sure __DEV__ is eliminated.
     let code = fs.readFileSync(singleConfig.output.file, {encoding: 'utf-8'});
     if (!code) {
         throw new Error(`${singleConfig.output.file} is empty`);
     }
     recheckDEV(code);
-    console.log(color('fgGreen', 'dim')('Check code: correct.'));
+    console.log(chalk.green.dim('Check code: correct.'));
 }
 
 function validateIO(input, output) {
@@ -249,7 +246,233 @@ function validateLang(lang, output) {
  * @return {string} Absolute path.
  */
 function getPath(relativePath) {
-    return resolve(__dirname, '../', relativePath);
+    return nodePath.resolve(__dirname, '../', relativePath);
+}
+
+/**
+ * @param {Array.<Object>} configs A list of rollup configs:
+ *  See: <https://rollupjs.org/#big-list-of-options>
+ *  For example:
+ *  [
+ *      {
+ *          ...inputOptions,
+ *          output: [outputOptions],
+ *          watch: {chokidar, include, exclude}
+ *      },
+ *      ...
+ *  ]
+ */
+async function build(configs) {
+
+    ensureZRenderCode.prepare();
+
+    for (let singleConfig of configs) {
+        console.log(
+            chalk.cyan.dim('\nBundles '),
+            chalk.cyan(singleConfig.input),
+            chalk.cyan.dim('=>'),
+            chalk.cyan(singleConfig.output.file),
+            chalk.cyan.dim(' ...')
+        );
+
+        console.time('rollup build');
+        const bundle = await rollup.rollup(singleConfig);
+        console.timeEnd('rollup build');
+
+        await bundle.write(singleConfig.output);
+
+        console.log(
+            chalk.green.dim('Created '),
+            chalk.green(singleConfig.output.file),
+            chalk.green.dim(' successfully.')
+        );
+    }
+
+    ensureZRenderCode.clear();
+}
+
+/**
+ * @param {Object} singleConfig A single rollup config:
+ *  See: <https://rollupjs.org/#big-list-of-options>
+ *  For example:
+ *  {
+ *      ...inputOptions,
+ *      output: [outputOptions],
+ *      watch: {chokidar, include, exclude}
+ *  }
+ */
+function watch(singleConfig) {
+
+    // FIXME:TS call `ensureZRenderCode`
+    let watcher = rollup.watch(singleConfig);
+
+    watcher.on('event', function (event) {
+        // event.code can be one of:
+        //   START        — the watcher is (re)starting
+        //   BUNDLE_START — building an individual bundle
+        //   BUNDLE_END   — finished building a bundle
+        //   END          — finished building all bundles
+        //   ERROR        — encountered an error while bundling
+        //   FATAL        — encountered an unrecoverable error
+        if (event.code !== 'START' && event.code !== 'END') {
+            console.log(
+                chalk.blue('[' + getTimeString() + ']'),
+                chalk.blue.dim('build'),
+                event.code.replace(/_/g, ' ').toLowerCase()
+            );
+        }
+        if (event.code === 'ERROR' || event.code === 'FATAL') {
+            printCodeError(event.error);
+        }
+        if (event.code === 'BUNDLE_END') {
+            printWatchResult(event);
+        }
+        if (event.code === 'START') {
+            ensureZRenderCode.prepare();
+        }
+        if (event.code === 'END' || event.code === 'ERROR' || event.code === 
'FATAL') {
+            ensureZRenderCode.clear();
+        }
+    });
+}
+
+function printWatchResult(event) {
+    console.log(
+        chalk.green.dim('Created'),
+        chalk.green(event.output.join(', ')),
+        chalk.green.dim('in'),
+        chalk.green(event.duration),
+        chalk.green.dim('ms.')
+    );
+}
+
+function printCodeError(error) {
+    console.log('\n' + error.code);
+    if (error.code === 'PARSE_ERROR') {
+        console.log(
+            'line',
+            chalk.cyan(error.loc.line),
+            'column',
+            chalk.cyan(error.loc.column),
+            'in',
+            chalk.cyan(error.loc.file)
+        );
+    }
+    if (error.frame) {
+        console.log('\n' + chalk.red(error.frame));
+    }
+    console.log(chalk.red.dim('\n' + error.stack));
+}
+
+function getTimeString() {
+    return (new Date()).toLocaleString();
+}
+
+
+// Symbol link do not work currently. So have to copy code manually.
+// See: https://github.com/ezolenko/rollup-plugin-typescript2/issues/188
+var ensureZRenderCode = (function () {
+
+    const nodeModulesZr = getPath('./node_modules/zrender');
+    // const nodeModulesZrDirTmp = getPath('./node_modules/zrender-dir-tmp');
+    const nodeModulesZrSymlinkTmp = 
getPath('./node_modules/zrender-symlink-tmp');
+    const nodeModulesZrSrcDir = getPath('./node_modules/zrender/src');
+    const zrSrcDir = getPath('../zrender/src')
+
+    let stats = 'cleared';
+
+    function doClear() {
+        if (!fs.existsSync(nodeModulesZrSymlinkTmp)
+            || !fs.lstatSync(nodeModulesZrSymlinkTmp).isSymbolicLink()
+        ) {
+            return;
+        }
+
+        if (fs.existsSync(nodeModulesZr)
+            && fs.lstatSync(nodeModulesZr).isDirectory()
+        ) {
+            console.log(chalk.blue(`rm -rf dir: ${nodeModulesZr}`));
+            // ensure save.
+            assert(nodeModulesZr.includes('node_modules') && 
nodeModulesZr.includes('zrender'));
+            fsExtra.removeSync(nodeModulesZr);
+        }
+
+        // recover the symbollink so that vs code can continue to visit the 
zrender source code.
+        console.log(chalk.blue(`mv symbol link: ${nodeModulesZrSymlinkTmp} => 
${nodeModulesZr}`));
+        fs.renameSync(nodeModulesZrSymlinkTmp, nodeModulesZr);
+    }
+
+    return {
+        prepare: function () {
+            // Calling guard
+            assert(stats === 'cleared');
+            stats = 'prepared';
+
+            console.time('ensure zr code cost');
+            // In case that the last build terminated manually.
+            doClear();
+
+            if (!fs.existsSync(nodeModulesZr)
+                || !fs.lstatSync(nodeModulesZr).isSymbolicLink()
+            ) {
+                return;
+            }
+
+            if (!fs.existsSync(zrSrcDir)
+                || !fs.lstatSync(zrSrcDir).isDirectory()
+            ) {
+                throw new Error(`${zrSrcDir} does not exist.`);
+            }
+
+            console.log(chalk.blue(`mv symbol link: ${nodeModulesZr} => 
${nodeModulesZrSymlinkTmp}`));
+            fs.renameSync(nodeModulesZr, nodeModulesZrSymlinkTmp);
+
+            fsExtra.ensureDirSync(nodeModulesZr);
+            fsExtra.copySync(zrSrcDir, nodeModulesZrSrcDir);
+            console.log(chalk.blue(`copied: ${nodeModulesZrSrcDir} => 
${zrSrcDir}`));
+
+            console.timeEnd('ensure zr code cost');
+        },
+
+        clear: function () {
+            // Calling guard
+            assert(stats === 'prepared');
+            stats = 'cleared';
+
+            doClear();
+        }
+    }
+})();
+
+
+async function main() {
+    try {
+        await run();
+    }
+    catch (err) {
+
+        ensureZRenderCode.clear();
+
+        console.log(chalk.red('BUILD ERROR!'));
+
+        // rollup parse error.
+        if (err) {
+            if (err.loc) {
+                console.warn(chalk.red(`${err.loc.file} 
(${err.loc.line}:${err.loc.column})`));
+                console.warn(chalk.red(err.message));
+            }
+            if (err.frame) {
+                console.warn(chalk.red(err.frame));
+            }
+            console.log(chalk.red(err ? err.stack : err));
+
+            err.id != null && console.warn(chalk.red(`id: ${err.id}`));
+            err.hook != null && console.warn(chalk.red(`hook: ${err.hook}`));
+            err.code != null && console.warn(chalk.red(`code: ${err.code}`));
+            err.plugin != null && console.warn(chalk.red(`plugin: 
${err.plugin}`));
+        }
+        // console.log(err);
+    }
 }
 
-run();
+main();
diff --git a/build/config.js b/build/config.js
index 04f6b3f..8cd69bd 100644
--- a/build/config.js
+++ b/build/config.js
@@ -17,19 +17,37 @@
 * under the License.
 */
 
-const nodeResolvePlugin = require('rollup-plugin-node-resolve');
+const assert = require('assert');
+// const nodeResolvePlugin = require('rollup-plugin-node-resolve');
 const uglifyPlugin = require('rollup-plugin-uglify');
-const ecRemoveDevPlugin = require('./rollup-plugin-ec-remove-dev');
-const ecLangPlugin = require('./rollup-plugin-ec-lang');
-const {resolve} = require('path');
+const ecRemoveDevPlugin = require('./remove-dev-rollup-plugin');
+const ecLangPlugin = require('./ec-lang-rollup-plugin');
+const nodePath = require('path');
 const preamble = require('./preamble');
+const ecDir = nodePath.resolve(__dirname, '..');
+const typescriptPlugin = require('rollup-plugin-typescript2');
 
-function getPathBasedOnECharts(path) {
-    return resolve(__dirname, '../', path);
-}
-
-function getPlugins({min, lang, sourcemap, removeDev, addBundleVersion}) {
-    let plugins = [];
+function preparePlugins({min, lang, sourcemap, removeDev, addBundleVersion}, 
{include, exclude}) {
+    assert(include);
+    let plugins = [
+        // nodeResolvePlugin(),
+        typescriptPlugin({
+            tsconfig: nodePath.resolve(ecDir, 'tsconfig.json'),
+            tsconfigOverride: {
+                // See: 
https://www.typescriptlang.org/docs/handbook/compiler-options.html
+                compilerOptions: {
+                    // By default: target === "ES3" or "ES5" ? "CommonJS" : 
"ES6".
+                    // But rollup don't use CommonJS.
+                    module: 'ES2015',
+                    sourceMap: !!sourcemap,
+                    // Use the esm d.ts
+                    declaration: false
+                },
+                include: include,
+                exclude: exclude || []
+            }
+        })
+    ];
 
     removeDev && plugins.push(
         ecRemoveDevPlugin({sourcemap})
@@ -39,9 +57,9 @@ function getPlugins({min, lang, sourcemap, removeDev, 
addBundleVersion}) {
         ecLangPlugin({lang})
     );
 
-    plugins.push(
-        nodeResolvePlugin()
-    );
+    // plugins.push(
+    //     nodeResolvePlugin()
+    // );
 
     addBundleVersion && plugins.push({
         outro: function () {
@@ -93,30 +111,57 @@ exports.createECharts = function (opt = {}) {
 
     if (input != null || output != null) {
         // Based on process.cwd();
-        input = resolve(input);
-        output = resolve(output);
+        input = nodePath.resolve(input);
+        output = nodePath.resolve(output);
     }
     else {
-        input = getPathBasedOnECharts(`./echarts${srcType}.js`);
-        output = 
getPathBasedOnECharts(`dist/echarts${postfixLang}${postfixType}${postfixMin}.js`);
+        input = nodePath.resolve(ecDir, `echarts${srcType}.ts`);
+        output = nodePath.resolve(ecDir, 
`dist/echarts${postfixLang}${postfixType}${postfixMin}.js`);
     }
 
     return {
-        plugins: getPlugins(opt),
+        plugins: preparePlugins(opt, {
+            include: [
+                nodePath.resolve(ecDir, 'src/**/*.ts'),
+                nodePath.resolve(ecDir, 'echarts*.ts'),
+                // nodePath.resolve(ecDir, 
'/Users/s/sushuangwork/met/act/tigall/echarts/zrender/src/**/*.ts')
+                // nodePath.resolve(ecDir, '../zrender/src/**/*.ts')
+            ]
+        }),
+
+        // external: ['zrender'],
+        // external: id => ['zrender'].includes(id),
+
         input: input,
-        legacy: true, // Support IE8-
+        // FIXME ??? ie8 support removed since rollup 0.60
+        // legacy: true, // Support IE8-
+
+        // onwarn ({loc, frame, message}) {
+        //     if (loc) {
+        //         console.warn(`${loc.file} (${loc.line}:${loc.column}) 
${message}`);
+        //         if (frame) {
+        //             console.warn(frame);
+        //         }
+        //     }
+        //     else {
+        //         console.warn(message);
+        //     }
+        // },
+
         output: {
             name: 'echarts',
             format: format,
             sourcemap: sourcemap,
-            legacy: true, // Must be declared both in inputOptions and 
outputOptions.
+            // legacy: true, // Must be declared both in inputOptions and 
outputOptions.
             file: output
         },
         watch: {
             include: [
-                getPathBasedOnECharts('./src/**'),
-                getPathBasedOnECharts('./echarts*.js'),
-                getPathBasedOnECharts('../zrender/src/**')
+                nodePath.resolve(ecDir, 'src/**'),
+                nodePath.resolve(ecDir, 'echarts*.ts'),
+                // FIXME
+                // zrender code watch is broken until "ensure zr code" can be 
removed.
+                // nodePath.resolve(ecDir, '../zrender/src/**/*.ts')
             ]
         }
     };
@@ -127,10 +172,15 @@ exports.createECharts = function (opt = {}) {
  */
 exports.createBMap = function (min) {
     let postfix = min ? '.min' : '';
+    let input = nodePath.resolve(ecDir, `extension-src/bmap/bmap.ts`);
 
     return {
-        plugins: getPlugins({min}),
-        input: getPathBasedOnECharts(`./extension-src/bmap/bmap.js`),
+        plugins: preparePlugins({min}, {
+            include: [
+                nodePath.resolve(ecDir, 'extension-src/bmap/**/*.ts')
+            ]
+        }),
+        input: input,
         legacy: true, // Support IE8-
         external: ['echarts'],
         output: {
@@ -142,10 +192,10 @@ exports.createBMap = function (min) {
                 // For UMD `global.echarts`
                 echarts: 'echarts'
             },
-            file: getPathBasedOnECharts(`dist/extension/bmap${postfix}.js`)
+            file: nodePath.resolve(ecDir, `dist/extension/bmap${postfix}.js`)
         },
         watch: {
-            include: [getPathBasedOnECharts('./extension-src/bmap/**')]
+            include: [nodePath.resolve(ecDir, 'extension-src/bmap/**')]
         }
     };
 };
@@ -155,9 +205,15 @@ exports.createBMap = function (min) {
  */
 exports.createDataTool = function (min) {
     let postfix = min ? '.min' : '';
+    let input = nodePath.resolve(ecDir, `extension-src/dataTool/index.ts`);
+
     return {
-        plugins: getPlugins({min}),
-        input: getPathBasedOnECharts(`./extension-src/dataTool/index.js`),
+        plugins: preparePlugins({min}, {
+            include: [
+                nodePath.resolve(ecDir, 'extension-src/dataTool/**/*.ts')
+            ]
+        }),
+        input: input,
         legacy: true, // Support IE8-
         external: ['echarts'],
         output: {
@@ -169,10 +225,10 @@ exports.createDataTool = function (min) {
                 // For UMD `global.echarts`
                 echarts: 'echarts'
             },
-            file: getPathBasedOnECharts(`dist/extension/dataTool${postfix}.js`)
+            file: nodePath.resolve(ecDir, 
`dist/extension/dataTool${postfix}.js`)
         },
         watch: {
-            include: [getPathBasedOnECharts('./extension-src/dataTool/**')]
+            include: [nodePath.resolve(ecDir, 'extension-src/dataTool/**')]
         }
     };
 };
diff --git a/build/rollup-plugin-ec-lang.js b/build/ec-lang-rollup-plugin.js
similarity index 100%
rename from build/rollup-plugin-ec-lang.js
rename to build/ec-lang-rollup-plugin.js
diff --git a/build/pre-publish.js b/build/pre-publish.js
index 3b87cdb..1d58395 100644
--- a/build/pre-publish.js
+++ b/build/pre-publish.js
@@ -18,80 +18,312 @@
 */
 
 /**
+ * [Create CommonJS files]:
  * Compatible with prevoius folder structure: `echarts/lib` exists in 
`node_modules`
  * (1) Build all files to CommonJS to `echarts/lib`.
  * (2) Remove __DEV__.
  * (3) Mount `echarts/src/export.js` to `echarts/lib/echarts.js`.
+ *
+ * [Create ESModule files]:
+ * Build all files to CommonJS to `echarts/esm`.
  */
 
-const path = require('path');
+const nodePath = require('path');
+const assert = require('assert');
+const fs = require('fs');
 const fsExtra = require('fs-extra');
-const {color, travelSrcDir, prePulishSrc} = require('zrender/build/helper');
-
-const ecDir = path.resolve(__dirname, '..');
-const srcDir = path.resolve(__dirname, '../src');
-const extensionSrcDir = path.resolve(__dirname, '../extension-src');
-const extensionDir = path.resolve(__dirname, '../extension');
-const libDir = path.resolve(__dirname, '../lib');
+const chalk = require('chalk');
+const ts = require('typescript');
+const globby = require('globby');
+const removeDEVUtil = require('./remove-dev');
 const preamble = require('./preamble');
+const {promisify} = require('util');
+const readFileAsync = promisify(fs.readFile);
+const writeFileAsync = promisify(fs.writeFile);
 
+const ecDir = nodePath.resolve(__dirname, '..');
+const tmpDir = nodePath.resolve(ecDir, 'pre-publish-tmp');
 
-module.exports = function () {
+const tsConfig = readTSConfig();
 
-    fsExtra.removeSync(libDir);
-    fsExtra.ensureDirSync(libDir);
+const autoGeneratedFileAlert = `
 
-    travelSrcDir(srcDir, ({fileName, relativePath, absolutePath}) => {
-        prePulishSrc({
-            inputPath: absolutePath,
-            outputPath: path.resolve(libDir, relativePath, fileName),
-            transform: transform,
-            preamble: preamble.js
-        });
-    });
+/**
+ * AUTO-GENERATED FILE. DO NOT MODIFY.
+ */
 
-    travelSrcDir(extensionSrcDir, ({fileName, relativePath, absolutePath}) => {
-        prePulishSrc({
-            inputPath: absolutePath,
-            outputPath: path.resolve(extensionDir, relativePath, fileName),
-            transform: transform,
-            preamble: preamble.js
-        });
-    });
+`;
 
-    prePulishSrc({
-        inputPath: path.resolve(ecDir, 'echarts.all.js'),
-        outputPath: path.resolve(ecDir, 'index.js'),
-        preamble: preamble.js
-    });
-    prePulishSrc({
-        inputPath: path.resolve(ecDir, 'echarts.common.js'),
-        outputPath: path.resolve(ecDir, 'index.common.js'),
-        preamble: preamble.js
-    });
-    prePulishSrc({
-        inputPath: path.resolve(ecDir, 'echarts.simple.js'),
-        outputPath: path.resolve(ecDir, 'index.simple.js'),
-        preamble: preamble.js
+const mainSrcGlobby = {
+    patterns: [
+        'src/**/*.ts',
+        'echarts.all.ts',
+        'echarts.blank.ts',
+        'echarts.common.ts',
+        'echarts.simple.ts'
+    ],
+    cwd: ecDir
+};
+const extensionSrcGlobby = {
+    patterns: [
+        'extension-src/**/*.ts'
+    ],
+    cwd: ecDir
+};
+const extensionSrcDir = nodePath.resolve(ecDir, 'extension-src');
+const extensionCJSDir = nodePath.resolve(ecDir, 'extension');
+const extensionESMDir = nodePath.resolve(ecDir, 'extension-esm');
+
+const compileWorkList = [
+    {
+        logLabel: 'main ts -> js-cjs',
+        compilerOptionsOverride: {
+            module: 'CommonJS',
+            // `rootDir` Only use to control the output
+            // directory structure with --outDir.
+            rootDir: ecDir,
+            outDir: tmpDir
+        },
+        srcGlobby: mainSrcGlobby,
+        transformOptions: {
+            filesGlobby: {patterns: ['**/*.js'], cwd: tmpDir},
+            preamble: preamble.js,
+            removeDEV: true,
+            cjsEntryCompat: cjsEntryCompat
+        },
+        before: async function () {
+            fsExtra.removeSync(tmpDir);
+            fsExtra.removeSync(nodePath.resolve(ecDir, 'lib'));
+            fsExtra.removeSync(nodePath.resolve(ecDir, 'index.js'));
+            fsExtra.removeSync(nodePath.resolve(ecDir, 'index.blank.js'));
+            fsExtra.removeSync(nodePath.resolve(ecDir, 'index.common.js'));
+            fsExtra.removeSync(nodePath.resolve(ecDir, 'index.simple.js'));
+        },
+        after: async function () {
+            fs.renameSync(nodePath.resolve(tmpDir, 'echarts.all.js'), 
nodePath.resolve(ecDir, 'index.js'));
+            fs.renameSync(nodePath.resolve(tmpDir, 'echarts.blank.js'), 
nodePath.resolve(ecDir, 'index.blank.js'));
+            fs.renameSync(nodePath.resolve(tmpDir, 'echarts.common.js'), 
nodePath.resolve(ecDir, 'index.common.js'));
+            fs.renameSync(nodePath.resolve(tmpDir, 'echarts.simple.js'), 
nodePath.resolve(ecDir, 'index.simple.js'));
+            fs.renameSync(nodePath.resolve(tmpDir, 'src'), 
nodePath.resolve(ecDir, 'lib'));
+            fsExtra.removeSync(tmpDir);
+        }
+    },
+    {
+        logLabel: 'main ts -> js-esm',
+        compilerOptionsOverride: {
+            module: 'ES2015',
+            rootDir: ecDir,
+            outDir: tmpDir
+        },
+        srcGlobby: mainSrcGlobby,
+        transformOptions: {
+            filesGlobby: {patterns: ['**/*.js'], cwd: tmpDir},
+            preamble: preamble.js,
+            // esm do not remove DEV. Keep it them same with
+            // the previous state before migrate to ts.
+            removeDEV: false
+        },
+        before: async function () {
+            fsExtra.removeSync(tmpDir);
+            fsExtra.removeSync(nodePath.resolve(ecDir, 'esm'));
+            fsExtra.removeSync(nodePath.resolve(ecDir, 'echarts.all.js'));
+            fsExtra.removeSync(nodePath.resolve(ecDir, 'echarts.blank.js'));
+            fsExtra.removeSync(nodePath.resolve(ecDir, 'echarts.common.js'));
+            fsExtra.removeSync(nodePath.resolve(ecDir, 'echarts.simple.js'));
+        },
+        after: async function () {
+            fs.renameSync(nodePath.resolve(tmpDir, 'echarts.all.js'), 
nodePath.resolve(ecDir, 'echarts.all.js'));
+            fs.renameSync(nodePath.resolve(tmpDir, 'echarts.blank.js'), 
nodePath.resolve(ecDir, 'echarts.blank.js'));
+            fs.renameSync(nodePath.resolve(tmpDir, 'echarts.common.js'), 
nodePath.resolve(ecDir, 'echarts.common.js'));
+            fs.renameSync(nodePath.resolve(tmpDir, 'echarts.simple.js'), 
nodePath.resolve(ecDir, 'echarts.simple.js'));
+            fs.renameSync(nodePath.resolve(tmpDir, 'src'), 
nodePath.resolve(ecDir, 'esm'));
+            fsExtra.removeSync(tmpDir);
+        }
+    },
+    {
+        logLabel: 'extension ts -> js-cjs',
+        compilerOptions: {
+            module: 'CommonJS',
+            rootDir: extensionSrcDir,
+            outDir: extensionCJSDir
+        },
+        srcGlobby: extensionSrcGlobby,
+        transformOptions: {
+            filesGlobby: {patterns: ['**/*.js'], cwd: extensionCJSDir},
+            preamble: preamble.js,
+            removeDEV: true,
+            cjsEntryCompat: cjsEntryCompat
+        },
+        before: async function () {
+            fsExtra.removeSync(extensionCJSDir);
+        }
+    },
+    {
+        logLabel: 'extension ts -> js-esm',
+        compilerOptions: {
+            module: 'ES2015',
+            rootDir: extensionSrcDir,
+            outDir: extensionESMDir
+        },
+        srcGlobby: extensionSrcGlobby,
+        transformOptions: {
+            filesGlobby: {patterns: ['**/*.js'], cwd: extensionESMDir},
+            preamble: preamble.js,
+            removeDEV: false
+        },
+        before: async function () {
+            fsExtra.removeSync(extensionESMDir);
+        }
+    }
+];
+
+
+
+/**
+ * @public
+ */
+module.exports = async function () {
+
+    for (let {
+        logLabel, compilerOptionsOverride, srcGlobby,
+        transformOptions, before, after
+    } of compileWorkList) {
+
+        process.stdout.write(chalk.green.dim(`[${logLabel}]: compiling ...`));
+
+        before && await before();
+
+        let srcPathList = await readFilePaths(srcGlobby);
+
+        await tsCompile(compilerOptionsOverride, srcPathList);
+
+        process.stdout.write(chalk.green.dim(` done \n`));
+
+        process.stdout.write(chalk.green.dim(`[${logLabel}]: transforming 
...`));
+
+        await transformCode(transformOptions);
+
+        after && await after();
+
+        process.stdout.write(chalk.green.dim(` done \n`));
+    }
+
+    console.log(chalk.green.bright('All done.'));
+};
+
+async function tsCompile(compilerOptionsOverride, srcPathList) {
+    assert(
+        compilerOptionsOverride
+        && compilerOptionsOverride.module
+        && compilerOptionsOverride.rootDir
+        && compilerOptionsOverride.outDir
+    );
+
+    let compilerOptions = {
+        ...tsConfig.compilerOptions,
+        ...compilerOptionsOverride,
+        sourceMap: false,
+        // Use the esm d.ts
+        declaration: false
+    };
+
+    // Must do it. becuase the value in tsconfig.json might be different from 
the inner representation.
+    // For example: moduleResolution: "NODE" => moduleResolution: 2
+    const {options, errors} = 
ts.convertCompilerOptionsFromJson(compilerOptions, ecDir);
+    if (errors.length) {
+        let errMsg = 'tsconfig parse failed: '
+            + errors.map(error => error.messageText).join('. ')
+            + '\n compilerOptions: \n' + JSON.stringify(compilerOptions, null, 
4);
+        assert(false, errMsg);
+    }
+
+    // See: https://github.com/microsoft/TypeScript/wiki/Using-the-Compiler-API
+    let program = ts.createProgram(srcPathList, options);
+    let emitResult = program.emit();
+
+    let allDiagnostics = ts
+        .getPreEmitDiagnostics(program)
+        .concat(emitResult.diagnostics);
+
+    allDiagnostics.forEach(diagnostic => {
+        if (diagnostic.file) {
+            let {line, character} = 
diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);
+            let message = 
ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n');
+            console.log(chalk.red(`${diagnostic.file.fileName} (${line + 
1},${character + 1}): ${message}`));
+        }
+        else {
+            
console.log(chalk.red(ts.flattenDiagnosticMessageText(diagnostic.messageText, 
'\n')));
+        }
     });
+    assert(!emitResult.emitSkipped, 'ts compile failed.');
+}
+
+/**
+ * @param {Object} transformOptions
+ * @param {Object} transformOptions.filesGlobby {patterns: string[], cwd: 
string}
+ * @param {string} [transformOptions.preamble] See './preamble.js'
+ * @param {Function} [transformOptions.cjsEntryCompat]
+ * @param {boolean} [transformOptions.removeDEV]
+ */
+async function transformCode({filesGlobby, preamble, cjsEntryCompat, 
removeDEV}) {
+
+    let filePaths = readFilePaths(filesGlobby);
 
-    function transform({code, inputPath, outputPath}) {
-        if (inputPath === path.resolve(ecDir, 'src/echarts.js')) {
-            // Using `echarts/echarts.blank.js` to overwrite 
`echarts/lib/echarts.js`
-            // for including exports API.
-            code += `
+    await Promise.all(filePaths.map(async filePath => {
+        let code = await readFileAsync(filePath, {encoding: 'utf8'});
+
+        if (removeDEV) {
+            let result = removeDEVUtil.transform(code, false);
+            code = result.code;
+            removeDEVPlugin.recheckDEV(code);
+        }
+
+        if (cjsEntryCompat) {
+            code = cjsEntryCompat({code, filePath});
+        }
+
+        code = autoGeneratedFileAlert + code;
+
+        if (preamble) {
+            code = preamble + code;
+        }
+
+        await writeFileAsync(filePath, code, {encoding: 'utf8'});
+    }));
+}
+
+function cjsEntryCompat({code, filePath}) {
+    if (filePath === nodePath.resolve(ecDir, 'src/echarts.js')) {
+        // For backward compat.
+        // Using `echarts/echarts.blank.js` to overwrite 
`echarts/lib/echarts.js`
+        // for including exports API.
+        code += `
 var ___ec_export = require("./export");
 (function () {
-    for (var key in ___ec_export) {
-        if (___ec_export.hasOwnProperty(key)) {
-            exports[key] = ___ec_export[key];
-        }
+for (var key in ___ec_export) {
+    if (___ec_export.hasOwnProperty(key)) {
+        exports[key] = ___ec_export[key];
     }
+}
 })();`;
-        }
-
-        return code;
     }
 
-    console.log(color('fgGreen', 'bright')('All done.'));
-};
+    return code;
+}
+
+async function readFilePaths({patterns, cwd}) {
+    assert(patterns && cwd);
+    return (
+        await globby(patterns, {cwd})
+    ).map(
+        srcPath => nodePath.resolve(cwd, srcPath)
+    );
+}
+
+function readTSConfig() {
+    // tsconfig.json may have comment string, which is invalid if
+    // using `require('tsconfig.json'). So we use a loose parser.
+    let filePath = nodePath.resolve(ecDir, 'tsconfig.json');
+    const tsConfigText = fs.readFileSync(filePath, {encoding: 'utf8'});
+    return (new Function(`return ( ${tsConfigText} )`))();
+}
diff --git a/build/rollup-plugin-ec-remove-dev.js 
b/build/remove-dev-babel-plugin.js
similarity index 53%
copy from build/rollup-plugin-ec-remove-dev.js
copy to build/remove-dev-babel-plugin.js
index a38ebbb..884e630 100644
--- a/build/rollup-plugin-ec-remove-dev.js
+++ b/build/remove-dev-babel-plugin.js
@@ -17,38 +17,20 @@
 * under the License.
 */
 
-/**
- * Remove the code of `if (__DEV__) { ... }`.
- *
- * Usage:
- *
- * import ecRemoveDevPlugin from 'echats/build/rollup-plugin-ec-remove-dev';
- * let rollupConfig = {
- *     plugins: [
- *         ecRemoveDevPlugin(),
- *         ...
- *     ]
- * };
- */
-
-const babel = require('@babel/core');
-const removeDEVPlugin = 
require('zrender/build/babel-plugin-transform-remove-dev');
-
-/**
- * @param {Object} [opt]
- * @param {Object} [opt.sourcemap]
- */
-module.exports = function ({sourcemap} = {}) {
-
+module.exports = function ({types, template}, options) {
     return {
-        transform: function (sourceCode) {
-
-            let {code, map} = babel.transform(sourceCode, {
-                plugins: [removeDEVPlugin],
-                sourceMaps: sourcemap
-            });
-
-            return {code, map};
+        visitor: {
+            IfStatement: {
+                exit(path) {
+                    removeDEV(path);
+                }
+            }
         }
     };
 };
+
+function removeDEV(path) {
+    if (path.node.test.name === '__DEV__') {
+        path.remove();
+    }
+}
diff --git a/build/rollup-plugin-ec-remove-dev.js 
b/build/remove-dev-rollup-plugin.js
similarity index 77%
copy from build/rollup-plugin-ec-remove-dev.js
copy to build/remove-dev-rollup-plugin.js
index a38ebbb..f07ff23 100644
--- a/build/rollup-plugin-ec-remove-dev.js
+++ b/build/remove-dev-rollup-plugin.js
@@ -31,24 +31,18 @@
  * };
  */
 
-const babel = require('@babel/core');
-const removeDEVPlugin = 
require('zrender/build/babel-plugin-transform-remove-dev');
+const removeDEV = require('./remove-dev');
 
 /**
  * @param {Object} [opt]
- * @param {Object} [opt.sourcemap]
+ * @param {boolean} [opt.sourcemap]
  */
 module.exports = function ({sourcemap} = {}) {
 
     return {
         transform: function (sourceCode) {
-
-            let {code, map} = babel.transform(sourceCode, {
-                plugins: [removeDEVPlugin],
-                sourceMaps: sourcemap
-            });
-
-            return {code, map};
+            return removeDEV.transform(sourceCode, sourcemap);
         }
     };
 };
+
diff --git a/build/rollup-plugin-ec-remove-dev.js b/build/remove-dev.js
similarity index 53%
rename from build/rollup-plugin-ec-remove-dev.js
rename to build/remove-dev.js
index a38ebbb..18a1937 100644
--- a/build/rollup-plugin-ec-remove-dev.js
+++ b/build/remove-dev.js
@@ -17,38 +17,33 @@
 * under the License.
 */
 
-/**
- * Remove the code of `if (__DEV__) { ... }`.
- *
- * Usage:
- *
- * import ecRemoveDevPlugin from 'echats/build/rollup-plugin-ec-remove-dev';
- * let rollupConfig = {
- *     plugins: [
- *         ecRemoveDevPlugin(),
- *         ...
- *     ]
- * };
- */
-
 const babel = require('@babel/core');
-const removeDEVPlugin = 
require('zrender/build/babel-plugin-transform-remove-dev');
+const removeDEVBabelPlugin = require('./remove-dev-babel-plugin');
 
 /**
- * @param {Object} [opt]
- * @param {Object} [opt.sourcemap]
+ * @param {string} sourceCode
+ * @param {boolean} sourcemap
+ * @return {Object} {code: string, map: string}
  */
-module.exports = function ({sourcemap} = {}) {
-
-    return {
-        transform: function (sourceCode) {
+module.exports.transform = function (sourceCode, sourcemap) {
+    let {code, map} = babel.transformSync(sourceCode, {
+        plugins: [removeDEVBabelPlugin],
+        sourceMaps: sourcemap
+    });
 
-            let {code, map} = babel.transform(sourceCode, {
-                plugins: [removeDEVPlugin],
-                sourceMaps: sourcemap
-            });
+    return {code, map};
+};
 
-            return {code, map};
-        }
-    };
+/**
+ * @param {string} code
+ * @throws {Error} If check failed.
+ */
+module.exports.recheckDEV = function (code) {
+    let result = code.match(/.if\s*\([^()]*__DEV__/);
+    if (result
+        && result[0].indexOf('`if') < 0
+        && result[0].indexOf('if (typeof __DEV__') < 0
+    ) {
+        throw new Error('__DEV__ is not removed.');
+    }
 };
diff --git a/package-lock.json b/package-lock.json
index f18660a..57c236e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -274,6 +274,28 @@
         "chalk": "^2.0.0",
         "esutils": "^2.0.2",
         "js-tokens": "^4.0.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
       }
     },
     "@babel/parser": {
@@ -314,11 +336,31 @@
             "js-tokens": "^3.0.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": "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": "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"
+          }
         }
       }
     },
@@ -388,6 +430,28 @@
         "@jest/source-map": "^24.9.0",
         "chalk": "^2.0.1",
         "slash": "^2.0.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
       }
     },
     "@jest/core": {
@@ -424,6 +488,28 @@
         "rimraf": "^2.5.4",
         "slash": "^2.0.0",
         "strip-ansi": "^5.0.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
       }
     },
     "@jest/environment": {
@@ -478,6 +564,17 @@
         "string-length": "^2.0.0"
       },
       "dependencies": {
+        "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"
+          }
+        },
         "glob": {
           "version": "7.1.6",
           "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz";,
@@ -497,6 +594,15 @@
           "resolved": 
"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz";,
           "integrity": 
"sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "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"
+          }
         }
       }
     },
@@ -566,11 +672,31 @@
         "write-file-atomic": "2.4.1"
       },
       "dependencies": {
+        "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"
+          }
+        },
         "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
+        },
+        "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"
+          }
         }
       }
     },
@@ -585,6 +711,142 @@
         "@types/yargs": "^13.0.0"
       }
     },
+    "@microsoft/api-extractor": {
+      "version": "7.7.2",
+      "resolved": 
"https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.7.2.tgz";,
+      "integrity": 
"sha512-W75kcjWlONyB9kQKYAfSMiG3v2JMGlgUihny8PucZqdRatcYADeQiEcX5qE5sWdNRHD/J+5INiwlooZDd82sDQ==",
+      "dev": true,
+      "requires": {
+        "@microsoft/api-extractor-model": "7.7.2",
+        "@microsoft/node-core-library": "3.18.2",
+        "@microsoft/ts-command-line": "4.3.7",
+        "@microsoft/tsdoc": "0.12.14",
+        "colors": "~1.2.1",
+        "lodash": "~4.17.15",
+        "resolve": "1.8.1",
+        "source-map": "~0.6.1",
+        "typescript": "~3.7.2"
+      },
+      "dependencies": {
+        "resolve": {
+          "version": "1.8.1",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz";,
+          "integrity": 
"sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
+          "dev": true,
+          "requires": {
+            "path-parse": "^1.0.5"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "@microsoft/api-extractor-model": {
+      "version": "7.7.2",
+      "resolved": 
"https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.7.2.tgz";,
+      "integrity": 
"sha512-USwWUPV3YLS8ZOS11vFh3nzEWXC2d8OZJ6CGp0nRnCXtbqmKqAq4Jg9J5gs1PCemo7JQEbzbHGGwycC0DbRJqw==",
+      "dev": true,
+      "requires": {
+        "@microsoft/node-core-library": "3.18.2",
+        "@microsoft/tsdoc": "0.12.14"
+      }
+    },
+    "@microsoft/node-core-library": {
+      "version": "3.18.2",
+      "resolved": 
"https://registry.npmjs.org/@microsoft/node-core-library/-/node-core-library-3.18.2.tgz";,
+      "integrity": 
"sha512-IRoRmLwNvrR0rTNavYlfNObz9pr4Epo8Hd//0SNptt7adOySd735ur7YBO7SzafeijHsD3/dC4PXLLwhIsMU7Q==",
+      "dev": true,
+      "requires": {
+        "@types/node": "8.10.54",
+        "colors": "~1.2.1",
+        "fs-extra": "~7.0.1",
+        "jju": "~1.4.0",
+        "semver": "~5.3.0",
+        "timsort": "~0.3.0",
+        "z-schema": "~3.18.3"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "semver": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz";,
+          "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+          "dev": true
+        }
+      }
+    },
+    "@microsoft/ts-command-line": {
+      "version": "4.3.7",
+      "resolved": 
"https://registry.npmjs.org/@microsoft/ts-command-line/-/ts-command-line-4.3.7.tgz";,
+      "integrity": 
"sha512-dl7j5E4Ly4vin0dFRNyDEmslpqLTeFkSvWi1Ux2OhTXbORpaRm2qivTQzUgbPSh8Mtc1LSZGekqEMNl0e0OMNw==",
+      "dev": true,
+      "requires": {
+        "@types/argparse": "1.0.33",
+        "argparse": "~1.0.9",
+        "colors": "~1.2.1"
+      }
+    },
+    "@microsoft/tsdoc": {
+      "version": "0.12.14",
+      "resolved": 
"https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.12.14.tgz";,
+      "integrity": 
"sha512-518yewjSga1jLdiLrcmpMFlaba5P+50b0TWNFUpC+SL9Yzf0kMi57qw+bMl+rQ08cGqH1vLx4eg9YFUbZXgZ0Q==",
+      "dev": true
+    },
+    "@nodelib/fs.scandir": {
+      "version": "2.1.3",
+      "resolved": 
"https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz";,
+      "integrity": 
"sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "2.0.3",
+        "run-parallel": "^1.1.9"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "2.0.3",
+      "resolved": 
"https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz";,
+      "integrity": 
"sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
+      "dev": true
+    },
+    "@nodelib/fs.walk": {
+      "version": "1.2.4",
+      "resolved": 
"https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz";,
+      "integrity": 
"sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.scandir": "2.1.3",
+        "fastq": "^1.6.0"
+      }
+    },
+    "@types/argparse": {
+      "version": "1.0.33",
+      "resolved": 
"https://registry.npmjs.org/@types/argparse/-/argparse-1.0.33.tgz";,
+      "integrity": 
"sha512-VQgHxyPMTj3hIlq9SY1mctqx+Jj8kpQfoLvDlVSDNOyuYs8JYfkuY3OW/4+dO657yPmNhHpePRx0/Tje5ImNVQ==",
+      "dev": true
+    },
     "@types/babel__core": {
       "version": "7.1.3",
       "resolved": 
"https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz";,
@@ -678,6 +940,24 @@
         }
       }
     },
+    "@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/eslint-visitor-keys": {
+      "version": "1.0.0",
+      "resolved": 
"https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz";,
+      "integrity": 
"sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==",
+      "dev": true
+    },
+    "@types/estree": {
+      "version": "0.0.42",
+      "resolved": 
"https://registry.npmjs.org/@types/estree/-/estree-0.0.42.tgz";,
+      "integrity": 
"sha512-K1DPVvnBCPxzD+G51/cxVIoc2X8uUVl1zpJeE6iKcgHMj4+tbat5Xu4TjV7v2QSDbIeAfLi2hIk+u2+s0MlpUQ==",
+      "dev": true
+    },
     "@types/istanbul-lib-coverage": {
       "version": "2.0.1",
       "resolved": 
"https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz";,
@@ -703,6 +983,18 @@
         "@types/istanbul-lib-report": "*"
       }
     },
+    "@types/json-schema": {
+      "version": "7.0.4",
+      "resolved": 
"https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz";,
+      "integrity": 
"sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==",
+      "dev": true
+    },
+    "@types/node": {
+      "version": "8.10.54",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.54.tgz";,
+      "integrity": 
"sha512-kaYyLYf6ICn6/isAyD4K1MyWWd5Q3JgH6bnMN089LUx88+s4W8GvK9Q6JMBVu5vsFFp7pMdSxdKmlBXwH/VFRg==",
+      "dev": true
+    },
     "@types/stack-utils": {
       "version": "1.0.1",
       "resolved": 
"https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz";,
@@ -724,6 +1016,130 @@
       "integrity": 
"sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==",
       "dev": true
     },
+    "@typescript-eslint/eslint-plugin": {
+      "version": "2.15.0",
+      "resolved": 
"https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.15.0.tgz";,
+      "integrity": 
"sha512-XRJFznI5v4K1WvIrWmjFjBAdQWaUTz4xJEdqR7+wAFsv6Q9dP3mOlE6BMNT3pdlp9eF1+bC5m5LZTmLMqffCVw==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/experimental-utils": "2.15.0",
+        "eslint-utils": "^1.4.3",
+        "functional-red-black-tree": "^1.0.1",
+        "regexpp": "^3.0.0",
+        "tsutils": "^3.17.1"
+      },
+      "dependencies": {
+        "@typescript-eslint/experimental-utils": {
+          "version": "2.15.0",
+          "resolved": 
"https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.15.0.tgz";,
+          "integrity": 
"sha512-Qkxu5zndY5hqlcQkmA88gfLvqQulMpX/TN91XC7OuXsRf4XG5xLGie0sbpX97o/oeccjeZYRMipIsjKk/tjDHA==",
+          "dev": true,
+          "requires": {
+            "@types/json-schema": "^7.0.3",
+            "@typescript-eslint/typescript-estree": "2.15.0",
+            "eslint-scope": "^5.0.0"
+          }
+        },
+        "@typescript-eslint/typescript-estree": {
+          "version": "2.15.0",
+          "resolved": 
"https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.15.0.tgz";,
+          "integrity": 
"sha512-L6Pog+w3VZzXkAdyqA0VlwybF8WcwZX+mufso86CMxSdWmcizJ38lgBdpqTbc9bo92iyi0rOvmATKiwl+amjxg==",
+          "dev": true,
+          "requires": {
+            "debug": "^4.1.1",
+            "eslint-visitor-keys": "^1.1.0",
+            "glob": "^7.1.6",
+            "is-glob": "^4.0.1",
+            "lodash.unescape": "4.0.1",
+            "semver": "^6.3.0",
+            "tsutils": "^3.17.1"
+          }
+        },
+        "eslint-utils": {
+          "version": "1.4.3",
+          "resolved": 
"https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz";,
+          "integrity": 
"sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
+          "dev": true,
+          "requires": {
+            "eslint-visitor-keys": "^1.1.0"
+          }
+        },
+        "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"
+          }
+        },
+        "regexpp": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz";,
+          "integrity": 
"sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==",
+          "dev": true
+        }
+      }
+    },
+    "@typescript-eslint/experimental-utils": {
+      "version": "2.18.0",
+      "resolved": 
"https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.18.0.tgz";,
+      "integrity": 
"sha512-J6MopKPHuJYmQUkANLip7g9I82ZLe1naCbxZZW3O2sIxTiq/9YYoOELEKY7oPg0hJ0V/AQ225h2z0Yp+RRMXhw==",
+      "dev": true,
+      "requires": {
+        "@types/json-schema": "^7.0.3",
+        "@typescript-eslint/typescript-estree": "2.18.0",
+        "eslint-scope": "^5.0.0"
+      }
+    },
+    "@typescript-eslint/parser": {
+      "version": "2.18.0",
+      "resolved": 
"https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.18.0.tgz";,
+      "integrity": 
"sha512-SJJPxFMEYEWkM6pGfcnjLU+NJIPo+Ko1QrCBL+i0+zV30ggLD90huEmMMhKLHBpESWy9lVEeWlQibweNQzyc+A==",
+      "dev": true,
+      "requires": {
+        "@types/eslint-visitor-keys": "^1.0.0",
+        "@typescript-eslint/experimental-utils": "2.18.0",
+        "@typescript-eslint/typescript-estree": "2.18.0",
+        "eslint-visitor-keys": "^1.1.0"
+      }
+    },
+    "@typescript-eslint/typescript-estree": {
+      "version": "2.18.0",
+      "resolved": 
"https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.18.0.tgz";,
+      "integrity": 
"sha512-gVHylf7FDb8VSi2ypFuEL3hOtoC4HkZZ5dOjXvVjoyKdRrvXAOPSzpNRnKMfaUUEiSLP8UF9j9X9EDLxC0lfZg==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.1",
+        "eslint-visitor-keys": "^1.1.0",
+        "glob": "^7.1.6",
+        "is-glob": "^4.0.1",
+        "lodash": "^4.17.15",
+        "semver": "^6.3.0",
+        "tsutils": "^3.17.1"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
+      }
+    },
     "abab": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.2.tgz";,
@@ -942,6 +1358,12 @@
       "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
       "dev": true
     },
+    "array-union": {
+      "version": "2.1.0",
+      "resolved": 
"https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz";,
+      "integrity": 
"sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+      "dev": true
+    },
     "array-unique": {
       "version": "0.3.2",
       "resolved": 
"https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz";,
@@ -963,15 +1385,6 @@
         "safer-buffer": "~2.1.0"
       }
     },
-    "assert": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz";,
-      "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
-      "dev": true,
-      "requires": {
-        "util": "0.10.3"
-      }
-    },
     "assert-plus": {
       "version": "1.0.0",
       "resolved": 
"https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz";,
@@ -1033,6 +1446,28 @@
         "babel-preset-jest": "^24.9.0",
         "chalk": "^2.4.2",
         "slash": "^2.0.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
       }
     },
     "babel-plugin-istanbul": {
@@ -1326,14 +1761,40 @@
       "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==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz";,
+      "integrity": 
"sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
       "dev": true,
       "requires": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.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"
+          }
+        },
+        "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
+        }
       }
     },
     "chardet": {
@@ -1479,6 +1940,12 @@
       "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
       "dev": true
     },
+    "colors": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz";,
+      "integrity": 
"sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==",
+      "dev": true
+    },
     "combined-stream": {
       "version": "1.0.8",
       "resolved": 
"https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz";,
@@ -1494,6 +1961,12 @@
       "integrity": 
"sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
       "dev": true
     },
+    "commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz";,
+      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+      "dev": true
+    },
     "component-bind": {
       "version": "1.0.0",
       "resolved": 
"https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz";,
@@ -1770,6 +2243,23 @@
       "integrity": 
"sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==",
       "dev": true
     },
+    "dir-glob": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz";,
+      "integrity": 
"sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+      "dev": true,
+      "requires": {
+        "path-type": "^4.0.0"
+      },
+      "dependencies": {
+        "path-type": {
+          "version": "4.0.0",
+          "resolved": 
"https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz";,
+          "integrity": 
"sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+          "dev": true
+        }
+      }
+    },
     "doctrine": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz";,
@@ -2068,11 +2558,31 @@
         "v8-compile-cache": "^2.0.3"
       },
       "dependencies": {
+        "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-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": "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"
+          }
         }
       }
     },
@@ -2368,6 +2878,73 @@
       "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
       "dev": true
     },
+    "fast-glob": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.1.tgz";,
+      "integrity": 
"sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.0",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.2"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "glob-parent": {
+          "version": "5.1.0",
+          "resolved": 
"https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz";,
+          "integrity": 
"sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "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
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": 
"https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz";,
+          "integrity": 
"sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
     "fast-json-stable-stringify": {
       "version": "2.0.0",
       "resolved": 
"https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz";,
@@ -2389,6 +2966,15 @@
         "punycode": "^1.3.2"
       }
     },
+    "fastq": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz";,
+      "integrity": 
"sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==",
+      "dev": true,
+      "requires": {
+        "reusify": "^1.0.0"
+      }
+    },
     "fb-watchman": {
       "version": "2.0.0",
       "resolved": 
"https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz";,
@@ -2439,6 +3025,71 @@
         }
       }
     },
+    "find-cache-dir": {
+      "version": "3.2.0",
+      "resolved": 
"https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz";,
+      "integrity": 
"sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==",
+      "dev": true,
+      "requires": {
+        "commondir": "^1.0.1",
+        "make-dir": "^3.0.0",
+        "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.0",
+          "resolved": 
"https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz";,
+          "integrity": 
"sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==",
+          "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"
+          }
+        }
+      }
+    },
     "find-up": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz";,
@@ -3221,6 +3872,34 @@
       "integrity": 
"sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
       "dev": true
     },
+    "globby": {
+      "version": "11.0.0",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz";,
+      "integrity": 
"sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==",
+      "dev": true,
+      "requires": {
+        "array-union": "^2.1.0",
+        "dir-glob": "^3.0.1",
+        "fast-glob": "^3.1.1",
+        "ignore": "^5.1.4",
+        "merge2": "^1.3.0",
+        "slash": "^3.0.0"
+      },
+      "dependencies": {
+        "ignore": {
+          "version": "5.1.4",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz";,
+          "integrity": 
"sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==",
+          "dev": true
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz";,
+          "integrity": 
"sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        }
+      }
+    },
     "graceful-fs": {
       "version": "4.2.2",
       "resolved": 
"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz";,
@@ -3479,6 +4158,28 @@
         "string-width": "^2.1.0",
         "strip-ansi": "^5.1.0",
         "through": "^2.3.6"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
       }
     },
     "invariant": {
@@ -3862,6 +4563,28 @@
             "prompts": "^2.0.1",
             "realpath-native": "^1.1.0",
             "yargs": "^13.3.0"
+          },
+          "dependencies": {
+            "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"
           }
         }
       }
@@ -3912,6 +4635,17 @@
         "realpath-native": "^1.1.0"
       },
       "dependencies": {
+        "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"
+          }
+        },
         "glob": {
           "version": "7.1.6",
           "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz";,
@@ -3925,6 +4659,15 @@
             "once": "^1.3.0",
             "path-is-absolute": "^1.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"
+          }
         }
       }
     },
@@ -3938,6 +4681,28 @@
         "diff-sequences": "^24.9.0",
         "jest-get-type": "^24.9.0",
         "pretty-format": "^24.9.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
       }
     },
     "jest-docblock": {
@@ -3960,6 +4725,28 @@
         "jest-get-type": "^24.9.0",
         "jest-util": "^24.9.0",
         "pretty-format": "^24.9.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
       }
     },
     "jest-environment-jsdom": {
@@ -4162,6 +4949,28 @@
         "jest-util": "^24.9.0",
         "pretty-format": "^24.9.0",
         "throat": "^4.0.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
       }
     },
     "jest-leak-detector": {
@@ -4184,6 +4993,28 @@
         "jest-diff": "^24.9.0",
         "jest-get-type": "^24.9.0",
         "pretty-format": "^24.9.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
       }
     },
     "jest-message-util": {
@@ -4200,6 +5031,28 @@
         "micromatch": "^3.1.10",
         "slash": "^2.0.0",
         "stack-utils": "^1.0.1"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
       }
     },
     "jest-mock": {
@@ -4234,6 +5087,28 @@
         "chalk": "^2.0.1",
         "jest-pnp-resolver": "^1.2.1",
         "realpath-native": "^1.1.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
       }
     },
     "jest-resolve-dependencies": {
@@ -4272,6 +5147,28 @@
         "jest-worker": "^24.6.0",
         "source-map-support": "^0.5.6",
         "throat": "^4.0.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
       }
     },
     "jest-runtime": {
@@ -4305,6 +5202,17 @@
         "yargs": "^13.3.0"
       },
       "dependencies": {
+        "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"
+          }
+        },
         "glob": {
           "version": "7.1.6",
           "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz";,
@@ -4318,6 +5226,15 @@
             "once": "^1.3.0",
             "path-is-absolute": "^1.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"
+          }
         }
       }
     },
@@ -4358,6 +5275,26 @@
             "lodash": "^4.17.13",
             "to-fast-properties": "^2.0.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"
+          }
         }
       }
     },
@@ -4381,11 +5318,31 @@
         "source-map": "^0.6.0"
       },
       "dependencies": {
+        "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"
+          }
+        },
         "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
+        },
+        "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"
+          }
         }
       }
     },
@@ -4401,6 +5358,28 @@
         "jest-get-type": "^24.9.0",
         "leven": "^3.1.0",
         "pretty-format": "^24.9.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
       }
     },
     "jest-watcher": {
@@ -4416,6 +5395,28 @@
         "chalk": "^2.0.1",
         "jest-util": "^24.9.0",
         "string-length": "^2.0.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
       }
     },
     "jest-worker": {
@@ -4439,6 +5440,12 @@
         }
       }
     },
+    "jju": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz";,
+      "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=",
+      "dev": true
+    },
     "js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz";,
@@ -4705,12 +5712,30 @@
       "integrity": 
"sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
       "dev": true
     },
+    "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
+    },
+    "lodash.isequal": {
+      "version": "4.5.0",
+      "resolved": 
"https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz";,
+      "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=",
+      "dev": true
+    },
     "lodash.sortby": {
       "version": "4.7.0",
       "resolved": 
"https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz";,
       "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
       "dev": true
     },
+    "lodash.unescape": {
+      "version": "4.0.1",
+      "resolved": 
"https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz";,
+      "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=",
+      "dev": true
+    },
     "loose-envify": {
       "version": "1.4.0",
       "resolved": 
"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz";,
@@ -4783,6 +5808,12 @@
       "integrity": 
"sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
       "dev": true
     },
+    "merge2": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz";,
+      "integrity": 
"sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==",
+      "dev": true
+    },
     "micromatch": {
       "version": "3.1.10",
       "resolved": 
"https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz";,
@@ -5471,6 +6502,12 @@
       "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
       "dev": true
     },
+    "picomatch": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz";,
+      "integrity": 
"sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==",
+      "dev": true
+    },
     "pify": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz";,
@@ -5873,6 +6910,12 @@
       "integrity": 
"sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
       "dev": true
     },
+    "reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz";,
+      "integrity": 
"sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true
+    },
     "rimraf": {
       "version": "2.7.1",
       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz";,
@@ -5899,10 +6942,23 @@
       }
     },
     "rollup": {
-      "version": "0.50.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.50.0.tgz";,
-      "integrity": 
"sha512-7RqCBQ9iwsOBPkjYgoIaeUij606mSkDMExP0NT7QDI3bqkHYQHrQ83uoNIXwPcQm/vP2VbsUz3kiyZZ1qPlLTQ==",
-      "dev": true
+      "version": "1.28.0",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.28.0.tgz";,
+      "integrity": 
"sha512-v2J/DmQi9+Nf6frGqzwZRvbiuTTrqH0yzoUF4Eybf8sONT4UpLZzJYnYzW96Zm9X1+4SJmijfnFBWCzHDAXYnQ==",
+      "dev": true,
+      "requires": {
+        "@types/estree": "*",
+        "@types/node": "*",
+        "acorn": "^7.1.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz";,
+          "integrity": 
"sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==",
+          "dev": true
+        }
+      }
     },
     "rollup-plugin-commonjs": {
       "version": "8.4.1",
@@ -5929,13 +6985,51 @@
         "resolve": "^1.1.6"
       }
     },
+    "rollup-plugin-typescript2": {
+      "version": "0.25.3",
+      "resolved": 
"https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.25.3.tgz";,
+      "integrity": 
"sha512-ADkSaidKBovJmf5VBnZBZe+WzaZwofuvYdzGAKTN/J4hN7QJCFYAq7IrH9caxlru6T5qhX41PNFS1S4HqhsGQg==",
+      "dev": true,
+      "requires": {
+        "find-cache-dir": "^3.0.0",
+        "fs-extra": "8.1.0",
+        "resolve": "1.12.0",
+        "rollup-pluginutils": "2.8.1",
+        "tslib": "1.10.0"
+      },
+      "dependencies": {
+        "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==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.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"
+          }
+        }
+      }
+    },
     "rollup-plugin-uglify": {
-      "version": "2.0.1",
-      "resolved": 
"https://registry.npmjs.org/rollup-plugin-uglify/-/rollup-plugin-uglify-2.0.1.tgz";,
-      "integrity": "sha1-Z7N60e/a+9g69MNrQMGJ7khmyWk=",
+      "version": "6.0.4",
+      "resolved": 
"https://registry.npmjs.org/rollup-plugin-uglify/-/rollup-plugin-uglify-6.0.4.tgz";,
+      "integrity": 
"sha512-ddgqkH02klveu34TF0JqygPwZnsbhHVI6t8+hGTcYHngPkQb5MIHI0XiztXIN/d6V9j+efwHAqEL7LspSxQXGw==",
       "dev": true,
       "requires": {
-        "uglify-js": "^3.0.9"
+        "@babel/code-frame": "^7.0.0",
+        "jest-worker": "^24.0.0",
+        "serialize-javascript": "^2.1.2",
+        "uglify-js": "^3.4.9"
       }
     },
     "rollup-pluginutils": {
@@ -5970,6 +7064,12 @@
         "is-promise": "^2.1.0"
       }
     },
+    "run-parallel": {
+      "version": "1.1.9",
+      "resolved": 
"https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz";,
+      "integrity": 
"sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
+      "dev": true
+    },
     "rxjs": {
       "version": "6.5.3",
       "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz";,
@@ -6044,6 +7144,12 @@
       "integrity": 
"sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
       "dev": true
     },
+    "serialize-javascript": {
+      "version": "2.1.2",
+      "resolved": 
"https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz";,
+      "integrity": 
"sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==",
+      "dev": true
+    },
     "serve-handler": {
       "version": "6.1.1",
       "resolved": 
"https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.1.tgz";,
@@ -6621,12 +7727,20 @@
       "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==",
+      "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": "^3.0.0"
+        "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
+        }
       }
     },
     "symbol-tree": {
@@ -6721,6 +7835,12 @@
       "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
       "dev": true
     },
+    "timsort": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz";,
+      "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
+      "dev": true
+    },
     "tmp": {
       "version": "0.0.33",
       "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz";,
@@ -6838,6 +7958,15 @@
       "integrity": 
"sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
       "dev": true
     },
+    "tsutils": {
+      "version": "3.17.1",
+      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz";,
+      "integrity": 
"sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.8.1"
+      }
+    },
     "tunnel-agent": {
       "version": "0.6.0",
       "resolved": 
"https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz";,
@@ -6862,6 +7991,12 @@
         "prelude-ls": "~1.1.2"
       }
     },
+    "typescript": {
+      "version": "3.7.4",
+      "resolved": 
"https://registry.npmjs.org/typescript/-/typescript-3.7.4.tgz";,
+      "integrity": 
"sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw==",
+      "dev": true
+    },
     "uglify-js": {
       "version": "3.6.0",
       "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz";,
@@ -6898,6 +8033,12 @@
         "set-value": "^2.0.1"
       }
     },
+    "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
+    },
     "unset-value": {
       "version": "1.0.0",
       "resolved": 
"https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz";,
@@ -6973,15 +8114,6 @@
       "integrity": 
"sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
       "dev": true
     },
-    "util": {
-      "version": "0.10.3",
-      "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz";,
-      "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
-      "dev": true,
-      "requires": {
-        "inherits": "2.0.1"
-      }
-    },
     "util-deprecate": {
       "version": "1.0.2",
       "resolved": 
"https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz";,
@@ -7020,6 +8152,12 @@
         "spdx-expression-parse": "^3.0.0"
       }
     },
+    "validator": {
+      "version": "8.2.0",
+      "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz";,
+      "integrity": 
"sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA==",
+      "dev": true
+    },
     "verror": {
       "version": "1.10.0",
       "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz";,
@@ -7264,6 +8402,18 @@
       "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
       "dev": true
     },
+    "z-schema": {
+      "version": "3.18.4",
+      "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.18.4.tgz";,
+      "integrity": 
"sha512-DUOKC/IhbkdLKKiV89gw9DUauTV8U/8yJl1sjf6MtDmzevLKOF2duNJ495S3MFVjqZarr+qNGCPbkg4mu4PpLw==",
+      "dev": true,
+      "requires": {
+        "commander": "^2.7.1",
+        "lodash.get": "^4.0.0",
+        "lodash.isequal": "^4.0.0",
+        "validator": "^8.0.0"
+      }
+    },
     "zrender": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/zrender/-/zrender-4.2.0.tgz";,
diff --git a/package.json b/package.json
index 6350fa8..10ccec3 100644
--- a/package.json
+++ b/package.json
@@ -13,11 +13,11 @@
     "url": "https://github.com/apache/incubator-echarts.git";
   },
   "scripts": {
-    "release": "node build/build.js --release",
+    "prepublish": "node build/build.js --prepublish",
     "build": "node build/build.js",
-    "watch": "node build/build.js -w",
+    "watch": "node build/build.js --watch",
+    "release": "node build/build.js --release",
     "help": "node build/build.js --help",
-    "prepublish": "node build/build.js --prepublish",
     "test:visual": "node test/runTest/server.js",
     "test:visual:report": "node test/runTest/genReport.js",
     "test": "node build/build.js --prepublish && jest --config 
test/ut/jest.config.js",
@@ -35,8 +35,11 @@
     "@babel/helper-simple-access": "7.0.0-beta.31",
     "@babel/template": "7.0.0-beta.31",
     "@babel/types": "7.0.0-beta.31",
-    "assert": "1.4.1",
+    "@microsoft/api-extractor": "7.7.2",
+    "@typescript-eslint/eslint-plugin": "^2.15.0",
+    "@typescript-eslint/parser": "^2.18.0",
     "canvas": "^2.6.0",
+    "chalk": "^3.0.0",
     "commander": "2.11.0",
     "coordtransform": "2.0.2",
     "escodegen": "1.8.0",
@@ -45,6 +48,7 @@
     "estraverse": "4.1.1",
     "fs-extra": "0.26.7",
     "glob": "7.0.0",
+    "globby": "11.0.0",
     "jest": "^24.9.0",
     "jest-canvas-mock": "^2.2.0",
     "jsdom": "^15.2.1",
@@ -52,14 +56,16 @@
     "open": "6.4.0",
     "pixelmatch": "5.0.2",
     "pngjs": "3.4.0",
-    "rollup": "0.50.0",
+    "rollup": "1.28.0",
     "rollup-plugin-commonjs": "8.4.1",
     "rollup-plugin-node-resolve": "3.0.0",
-    "rollup-plugin-uglify": "2.0.1",
+    "rollup-plugin-typescript2": "0.25.3",
+    "rollup-plugin-uglify": "6.0.4",
     "seedrandom": "3.0.3",
     "semver": "6.3.0",
     "serve-handler": "6.1.1",
     "slugify": "1.3.4",
-    "socket.io": "2.2.0"
+    "socket.io": "2.2.0",
+    "typescript": "3.7.4"
   }
 }
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..0140bdb
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,24 @@
+{
+    "compilerOptions": {
+        "target": "ES3",
+
+        "noImplicitAny": true,
+        "noImplicitThis": true,
+        "strictBindCallApply": true,
+        "removeComments": true,
+        "sourceMap": true,
+
+        // 
https://github.com/ezolenko/rollup-plugin-typescript2/issues/12#issuecomment-536173372
+        "moduleResolution": "Node",
+
+        "declaration": true,
+        "declarationMap": false,
+
+        "importHelpers": true
+    },
+    "include": [
+        "src/**/*.ts",
+        "echarts.*.ts",
+        "extension-src/**/*.ts"
+    ]
+}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@echarts.apache.org
For additional commands, e-mail: commits-h...@echarts.apache.org

Reply via email to