diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..e97519e
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,23 @@
+
+
+## Checklist
+
+
+
+* [ ] `npm test` passes
+* [ ] tests are included
+* [ ] documentation is changed or added
+* [ ] commit message follows commit guidelines
+
+## Affected feature(s)
+
+
+## Description of change
+
+
diff --git a/build/webpack.base.config.js b/build/webpack.base.config.js
index 65496f3..d783d08 100644
--- a/build/webpack.base.config.js
+++ b/build/webpack.base.config.js
@@ -6,7 +6,7 @@ const { VueLoaderPlugin } = require('vue-loader');
function resolve(dir) {
return path.join(__dirname, '..', dir);
}
-let sourceMap = false; // css sourceMap
+const sourceMap = false; // css sourceMap
let jsSourceMap = true;
if (process.env.NODE_ENV === 'production') {
jsSourceMap = false;
@@ -63,10 +63,10 @@ module.exports = {
],
},
postLoaders: {
- html: 'babel-loader?sourceMap'
+ html: 'babel-loader?sourceMap',
},
sourceMap: jsSourceMap,
- }
+ },
},
{
test: /\.js$/,
@@ -91,7 +91,7 @@ module.exports = {
sourceMap,
},
},
- ]
+ ],
},
{
test: /\.less$/,
@@ -114,7 +114,7 @@ module.exports = {
sourceMap,
},
},
- ]
+ ],
},
{
test: /\.scss$/,
@@ -137,30 +137,34 @@ module.exports = {
sourceMap,
},
},
- ]
+ ],
},
{
test: /\.(gif|jpg|png|woff|svg|eot|ttf)\??.*$/,
- loader: 'url-loader?limit=8192'
+ loader: 'url-loader?limit=8192',
},
{
test: /\.(html|tpl)$/,
- loader: 'html-loader'
- }
- ]
+ loader: 'html-loader',
+ },
+ {
+ test: /\.tsx?$/,
+ use: 'ts-loader',
+ },
+ ],
},
resolve: {
extensions: ['.js', '.vue'],
alias: {
- 'vue': 'vue/dist/vue.esm.js',
- '@': resolve('src')
- }
+ vue: 'vue/dist/vue.esm.js',
+ '@': resolve('src'),
+ },
},
plugins: [
new webpack.optimize.ModuleConcatenationPlugin(),
new webpack.DefinePlugin({
- 'process.env.VERSION': `'${pkg.version}'`
+ 'process.env.VERSION': `'${pkg.version}'`,
}),
new VueLoaderPlugin(),
- ]
-};
\ No newline at end of file
+ ],
+};
diff --git a/build/webpack.test.config.js b/build/webpack.test.config.js
index 81e71d9..91c4125 100644
--- a/build/webpack.test.config.js
+++ b/build/webpack.test.config.js
@@ -1,9 +1,21 @@
+const path = require('path');
const merge = require('webpack-merge');
const webpackBaseConfig = require('./webpack.base.config.js');
+function resolve(dir) {
+ return path.join(__dirname, '..', dir);
+}
+
const conifg = merge(webpackBaseConfig, {
devtool: 'eval-source-map',
mode: 'development',
+ resolve: {
+ extensions: ['.js', '.vue', '.ts'],
+ alias: {
+ vue: 'vue/dist/vue.esm.js',
+ '@': resolve('test/unit'),
+ },
+ },
});
delete conifg.entry;
diff --git a/package-lock.json b/package-lock.json
index 4eff600..54e03a1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -819,6 +819,12 @@
"integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==",
"dev": true
},
+ "@types/chai": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz",
+ "integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==",
+ "dev": true
+ },
"@types/events": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
@@ -842,6 +848,12 @@
"integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
"dev": true
},
+ "@types/mocha": {
+ "version": "5.2.7",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz",
+ "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==",
+ "dev": true
+ },
"@types/node": {
"version": "12.0.2",
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.2.tgz",
@@ -1142,6 +1154,12 @@
"integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==",
"dev": true
},
+ "acorn-walk": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz",
+ "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==",
+ "dev": true
+ },
"after": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
@@ -1212,6 +1230,12 @@
"color-convert": "^1.9.0"
}
},
+ "ansi-wrap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
+ "dev": true
+ },
"anymatch": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
@@ -1867,6 +1891,23 @@
"integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
"dev": true
},
+ "browser-resolve": {
+ "version": "1.11.3",
+ "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
+ "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
+ "dev": true,
+ "requires": {
+ "resolve": "1.1.7"
+ },
+ "dependencies": {
+ "resolve": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
+ "dev": true
+ }
+ }
+ },
"browser-stdout": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
@@ -2356,6 +2397,26 @@
"integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==",
"dev": true
},
+ "combine-source-map": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
+ "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=",
+ "dev": true,
+ "requires": {
+ "convert-source-map": "~1.1.0",
+ "inline-source-map": "~0.6.0",
+ "lodash.memoize": "~3.0.3",
+ "source-map": "~0.5.3"
+ },
+ "dependencies": {
+ "convert-source-map": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
+ "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=",
+ "dev": true
+ }
+ }
+ },
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -2948,6 +3009,23 @@
"ip-regex": "^2.1.0"
}
},
+ "defaults": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+ "dev": true,
+ "requires": {
+ "clone": "^1.0.2"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "dev": true
+ }
+ }
+ },
"define-properties": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
@@ -3433,6 +3511,12 @@
"es6-symbol": "^3.1.1"
}
},
+ "es6-object-assign": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz",
+ "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=",
+ "dev": true
+ },
"es6-symbol": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
@@ -5898,6 +5982,15 @@
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"dev": true
},
+ "inline-source-map": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
+ "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=",
+ "dev": true,
+ "requires": {
+ "source-map": "~0.5.3"
+ }
+ },
"inquirer": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz",
@@ -5994,6 +6087,12 @@
"kind-of": "^3.0.2"
}
},
+ "is-arguments": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
+ "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
+ "dev": true
+ },
"is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -6082,6 +6181,12 @@
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true
},
+ "is-generator-function": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz",
+ "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==",
+ "dev": true
+ },
"is-glob": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
@@ -6091,6 +6196,15 @@
"is-extglob": "^2.1.1"
}
},
+ "is-nan": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.2.1.tgz",
+ "integrity": "sha1-n69ltvttskt/XAYoR16nH5iEAeI=",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.1"
+ }
+ },
"is-number": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
@@ -6391,8 +6505,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
- "dev": true,
- "optional": true
+ "dev": true
},
"json3": {
"version": "3.3.2",
@@ -6551,6 +6664,149 @@
"colors": "^1.1.2"
}
},
+ "karma-typescript": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/karma-typescript/-/karma-typescript-4.1.0.tgz",
+ "integrity": "sha512-FhoZlPWVlkWN110KrUYcAOxTPeyvw9kg3uolxP2s/DsmUthdc5MWgl84yOr4j3xFGHStd9wLqek1nGRkFcJ35A==",
+ "dev": true,
+ "requires": {
+ "acorn": "^6.0.5",
+ "acorn-walk": "^6.1.1",
+ "assert": "^2.0.0",
+ "async": "^3.0.1",
+ "browser-resolve": "^1.11.3",
+ "browserify-zlib": "^0.2.0",
+ "buffer": "^5.2.1",
+ "combine-source-map": "^0.8.0",
+ "console-browserify": "^1.1.0",
+ "constants-browserify": "^1.0.0",
+ "convert-source-map": "^1.6.0",
+ "crypto-browserify": "^3.12.0",
+ "diff": "^4.0.1",
+ "domain-browser": "^1.2.0",
+ "events": "^3.0.0",
+ "glob": "^7.1.3",
+ "https-browserify": "^1.0.0",
+ "istanbul": "0.4.5",
+ "json-stringify-safe": "^5.0.1",
+ "karma-coverage": "^1.1.1",
+ "lodash": "^4.17.11",
+ "log4js": "^4.0.1",
+ "minimatch": "^3.0.4",
+ "os-browserify": "^0.3.0",
+ "pad": "^3.2.0",
+ "path-browserify": "^1.0.0",
+ "process": "^0.11.10",
+ "punycode": "^2.1.1",
+ "querystring-es3": "^0.2.1",
+ "readable-stream": "^3.1.1",
+ "remap-istanbul": "^0.13.0",
+ "source-map": "^0.7.3",
+ "stream-browserify": "^2.0.2",
+ "stream-http": "^3.0.0",
+ "string_decoder": "^1.2.0",
+ "timers-browserify": "^2.0.10",
+ "tmp": "^0.1.0",
+ "tty-browserify": "^0.0.1",
+ "url": "^0.11.0",
+ "util": "^0.12.0",
+ "vm-browserify": "1.1.0"
+ },
+ "dependencies": {
+ "assert": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz",
+ "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==",
+ "dev": true,
+ "requires": {
+ "es6-object-assign": "^1.1.0",
+ "is-nan": "^1.2.1",
+ "object-is": "^1.0.1",
+ "util": "^0.12.0"
+ }
+ },
+ "async": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.0.1.tgz",
+ "integrity": "sha512-ZswD8vwPtmBZzbn9xyi8XBQWXH3AvOQ43Za1KWYq7JeycrZuUYzx01KvHcVbXltjqH4y0MWrQ33008uLTqXuDw==",
+ "dev": true
+ },
+ "buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
+ "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
+ "dev": true,
+ "requires": {
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4"
+ }
+ },
+ "diff": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz",
+ "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==",
+ "dev": true
+ },
+ "path-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.0.tgz",
+ "integrity": "sha512-Hkavx/nY4/plImrZPHRk2CL9vpOymZLgEbMNX1U0bjcBL7QN9wODxyx0yaMZURSQaUtSEvDrfAvxa9oPb0at9g==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true
+ },
+ "stream-http": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.0.0.tgz",
+ "integrity": "sha512-JELJfd+btL9GHtxU3+XXhg9NLYrKFnhybfvRuDghtyVkOFydz3PKNT1df07AMr88qW03WHF+FSV0PySpXignCA==",
+ "dev": true,
+ "requires": {
+ "builtin-status-codes": "^3.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^3.0.6",
+ "xtend": "^4.0.0"
+ }
+ },
+ "tmp": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz",
+ "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==",
+ "dev": true,
+ "requires": {
+ "rimraf": "^2.6.3"
+ }
+ },
+ "tty-browserify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
+ "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
+ "dev": true
+ },
+ "util": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.0.tgz",
+ "integrity": "sha512-pPSOFl7VLhZ7LO/SFABPraZEEurkJUWSMn3MuA/r3WQZc+Z1fqou2JqLSOZbCLl73EUIxuUVX8X4jkX2vfJeAA==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "object.entries": "^1.1.0",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "vm-browserify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz",
+ "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==",
+ "dev": true
+ }
+ }
+ },
"karma-webpack": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-3.0.5.tgz",
@@ -6761,6 +7017,12 @@
"integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
"dev": true
},
+ "lodash.memoize": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
+ "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=",
+ "dev": true
+ },
"lodash.tail": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz",
@@ -7774,6 +8036,12 @@
"kind-of": "^3.0.3"
}
},
+ "object-is": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz",
+ "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=",
+ "dev": true
+ },
"object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
@@ -8016,6 +8284,15 @@
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
+ "pad": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/pad/-/pad-3.2.0.tgz",
+ "integrity": "sha512-2u0TrjcGbOjBTJpyewEl4hBO3OeX5wWue7eIFPzQTg6wFSvoaHcBTTUY5m+n0hd04gmTCPuY0kCpVIVuw5etwg==",
+ "dev": true,
+ "requires": {
+ "wcwidth": "^1.0.1"
+ }
+ },
"pako": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz",
@@ -8239,6 +8516,12 @@
"dev": true,
"optional": true
},
+ "picomatch": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz",
+ "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==",
+ "dev": true
+ },
"pify": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
@@ -8269,6 +8552,48 @@
"find-up": "^3.0.0"
}
},
+ "plugin-error": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
+ "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "^1.0.1",
+ "arr-diff": "^4.0.0",
+ "arr-union": "^3.1.0",
+ "extend-shallow": "^3.0.2"
+ },
+ "dependencies": {
+ "ansi-colors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+ "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
"portfinder": {
"version": "1.0.20",
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz",
@@ -8761,12 +9086,6 @@
"integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==",
"dev": true
},
- "ramda": {
- "version": "0.26.1",
- "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz",
- "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==",
- "dev": true
- },
"randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@@ -9025,6 +9344,37 @@
"integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
"dev": true
},
+ "remap-istanbul": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.13.0.tgz",
+ "integrity": "sha512-rS5ZpVAx3fGtKZkiBe1esXg5mKYbgW9iz8kkADFt3p6lo3NsBBUX1q6SwdhwUtYCGnr7nK6gRlbYK3i8R0jbRA==",
+ "dev": true,
+ "requires": {
+ "istanbul": "0.4.5",
+ "minimatch": "^3.0.4",
+ "plugin-error": "^1.0.1",
+ "source-map": "0.6.1",
+ "through2": "3.0.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "through2": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.0.tgz",
+ "integrity": "sha512-8B+sevlqP4OiCjonI1Zw03Sf8PuV1eRsYQgLad5eonILOdyeRsY27A/2Ze8IlvlMvq31OH+3fz/styI7Ya62yQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2 || 3",
+ "xtend": "~4.0.1"
+ }
+ }
+ }
+ },
"remove-trailing-separator": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
@@ -10599,6 +10949,96 @@
"integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
"dev": true
},
+ "ts-loader": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.0.2.tgz",
+ "integrity": "sha512-kkF3sGf3oBUehlvXI9fkbItbFTnNgGkYAz91vtWnsKAU4m+LAmQjuby7uTZNo3As+/zHLuyB052SkQDY6vLXtg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.3.0",
+ "enhanced-resolve": "^4.0.0",
+ "loader-utils": "^1.0.2",
+ "micromatch": "^4.0.0",
+ "semver": "^6.0.0"
+ },
+ "dependencies": {
+ "big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "dev": true
+ },
+ "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"
+ }
+ },
+ "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
+ },
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+ "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^2.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "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"
+ }
+ },
+ "semver": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz",
+ "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ }
+ }
+ },
"tslib": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
@@ -10659,6 +11099,12 @@
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
"dev": true
},
+ "typescript": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz",
+ "integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw==",
+ "dev": true
+ },
"uglify-js": {
"version": "3.4.10",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz",
@@ -11237,6 +11683,15 @@
"minimalistic-assert": "^1.0.0"
}
},
+ "wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+ "dev": true,
+ "requires": {
+ "defaults": "^1.0.3"
+ }
+ },
"webpack": {
"version": "4.31.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.31.0.tgz",
diff --git a/package.json b/package.json
index 54f16cd..f70b861 100644
--- a/package.json
+++ b/package.json
@@ -44,6 +44,8 @@
"@babel/preset-env": "^7.4.4",
"@babel/preset-stage-3": "^7.0.0",
"@babel/runtime": "^7.4.4",
+ "@types/chai": "^4.1.7",
+ "@types/mocha": "^5.2.7",
"@vue/test-utils": "^1.0.0-beta.29",
"autoprefixer-loader": "^3.2.0",
"babel-eslint": "^10.0.1",
@@ -78,6 +80,8 @@
"sinon": "^7.3.2",
"sinon-chai": "^3.3.0",
"style-loader": "^0.23.1",
+ "ts-loader": "^6.0.2",
+ "typescript": "^3.5.1",
"uglifyjs-webpack-plugin": "^2.1.2",
"url-loader": "^1.1.2",
"vue": "^2.6.10",
diff --git a/test/index.d.ts b/test/index.d.ts
new file mode 100644
index 0000000..8bec03f
--- /dev/null
+++ b/test/index.d.ts
@@ -0,0 +1,20 @@
+
+interface FlexTableColumnOption {
+ [index: string]: string | number;
+ name: string;
+ age: number;
+ address: string;
+ date: string;
+}
+
+interface FlexTableRow {
+ row: FlexTableColumnOption;
+ column: {
+ title: string;
+ };
+}
+
+interface SortOption {
+ key: string;
+ order: string;
+}
diff --git a/test/tsconfig.json b/test/tsconfig.json
new file mode 100644
index 0000000..234182f
--- /dev/null
+++ b/test/tsconfig.json
@@ -0,0 +1,35 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "module": "esnext",
+ "strict": true,
+ "jsx": "preserve",
+ "importHelpers": true,
+ "moduleResolution": "node",
+ "experimentalDecorators": true,
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "noImplicitAny": false,
+ "sourceMap": true,
+ "baseUrl": ".",
+ "types": [
+ "mocha",
+ "vue"
+ ],
+ "paths": {
+ "@/*": [
+ "unit/*"
+ ]
+ },
+ "lib": [
+ "esnext",
+ "dom",
+ ]
+ },
+ "include": [
+ "**/*.ts",
+ ],
+ "exclude": [
+ "node_modules"
+ ]
+}
diff --git a/test/tslint.json b/test/tslint.json
new file mode 100644
index 0000000..e9bc3d4
--- /dev/null
+++ b/test/tslint.json
@@ -0,0 +1,21 @@
+{
+ "defaultSeverity": "warning",
+ "extends": [
+ "tslint:recommended"
+ ],
+ "linterOptions": {
+ "exclude": [
+ "node_modules/**"
+ ]
+ },
+ "rules": {
+ "quotemark": [true, "single"],
+ "indent": [true, "spaces", 4],
+ "interface-name": false,
+ "ordered-imports": false,
+ "object-literal-sort-keys": false,
+ "no-consecutive-blank-lines": false,
+ "no-namespace": false,
+ "only-arrow-functions": false
+ }
+}
\ No newline at end of file
diff --git a/test/unit/index.js b/test/unit/index.js
index 20c99cb..0f4e38a 100644
--- a/test/unit/index.js
+++ b/test/unit/index.js
@@ -1,5 +1,5 @@
const testsContext = require.context('./specs', true, /\.spec$/);
testsContext.keys().forEach(testsContext);
-const srcContext = require.context('../../src', true, /^\.\/(?!.*(\.less)?$)/);
+const srcContext = require.context('../../src', true, /^\.\/(?!.*(\.less)?$)/);
srcContext.keys().forEach(srcContext);
diff --git a/test/unit/karma.conf.js b/test/unit/karma.conf.js
index 6bb6b3c..5dfee63 100644
--- a/test/unit/karma.conf.js
+++ b/test/unit/karma.conf.js
@@ -5,7 +5,9 @@ module.exports = function(config) {
browsers: ['ChromeHeadless'],
frameworks: ['mocha', 'sinon-chai'],
reporters: ['spec', 'coverage'],
- files: ['index.js'],
+ files: [
+ 'index.js',
+ ],
preprocessors: {
'index.js': ['webpack', 'sourcemap'],
},
diff --git a/test/unit/specs/expand.spec.js b/test/unit/specs/expand.spec.ts
similarity index 77%
rename from test/unit/specs/expand.spec.js
rename to test/unit/specs/expand.spec.ts
index a4ac2ba..e84a9cd 100644
--- a/test/unit/specs/expand.spec.js
+++ b/test/unit/specs/expand.spec.ts
@@ -1,12 +1,12 @@
-/* eslint-disable no-undef */
import {
createVue,
// destroyVM,
triggerEvent,
waitImmediate,
-} from '../util';
+} from '@/util';
+import { expect } from 'chai';
-const aTestList = [];
+const aTestList: FlexTableColumnOption[] = [];
for (let i = 0; i < 1; i += 1) {
const oTestData = {
name: 'John Brown',
@@ -25,8 +25,8 @@ describe('Flex-Table', () => {
template: `
John Brown
'); + let elemNextHtml = ''; + if (elemExpandBtn) { + triggerEvent(elemExpandBtn, 'click'); + await waitImmediate(); + if ( elemExpandBtn.parentElement ) { + const elemNext = elemExpandBtn.parentElement.nextElementSibling; + if ( elemNext && elemNext.innerHTML) { + elemNextHtml = elemNext.innerHTML; + } + } + } + + expect(elemNextHtml).to.eql('John Brown
'); }); it('check unexpanded', async () => { triggerEvent(elemExpandBtn, 'click'); await waitImmediate(); - const elemNext = elemExpandBtn.parentElement.nextElementSibling; + let elemNext; + if (elemExpandBtn && elemExpandBtn.parentElement){ + elemNext = elemExpandBtn.parentElement.nextElementSibling; + } + expect(elemNext).to.eql(null); }); @@ -153,14 +166,20 @@ describe('Flex-Table', () => { it('check expand', async () => { triggerEvent(elemExpandBtn, 'click'); await waitImmediate(); - const elemNext = elemExpandBtn.parentElement.nextElementSibling; + let elemNext; + if (elemExpandBtn && elemExpandBtn.parentElement) { + elemNext = elemExpandBtn.parentElement.nextElementSibling; + } expect(elemNext.innerHTML).to.eql('John Brown