From 685e46c77fe8f9c00406d8e088af179849ace74a Mon Sep 17 00:00:00 2001 From: Forrest Hopkins Date: Fri, 8 Feb 2019 03:01:41 -0700 Subject: [PATCH 1/5] TYPESCRIPT! Huge transition. Part one. --- .idea/compiler.xml | 7 + src/frontend/.eslintrc.js | 7 +- src/frontend/build/vue-loader.conf.js | 1 + src/frontend/build/webpack.base.conf.js | 16 +- src/frontend/build/webpack.dev.conf.js | 2 +- src/frontend/package-lock.json | 953 ++++++++++++------ src/frontend/package.json | 34 +- src/frontend/src/App.vue | 15 +- src/frontend/src/components/AddBtn.vue | 8 +- src/frontend/src/components/AddDialog.vue | 16 +- src/frontend/src/components/DataTable.vue | 32 +- src/frontend/src/components/ExpandDetails.vue | 8 +- src/frontend/src/components/IncludedList.vue | 10 +- src/frontend/src/components/ModTable.vue | 87 +- src/frontend/src/components/PackTable.vue | 84 +- .../src/components/PackVersionDialog.vue | 123 ++- src/frontend/src/components/RootCard.vue | 14 +- src/frontend/src/components/Snackbar.vue | 8 +- src/frontend/src/main.js | 98 -- src/frontend/src/main.ts | 27 + .../src/router/{index.js => index.ts} | 4 +- src/frontend/src/shims-tsx.d.ts | 13 + src/frontend/src/shims-vue.d.ts | 9 + src/frontend/src/util.ts | 75 ++ src/frontend/test/e2e/specs/test.js | 2 +- src/frontend/test/unit/jest.conf.js | 6 +- src/frontend/tsconfig.json | 16 + 27 files changed, 1079 insertions(+), 596 deletions(-) create mode 100644 .idea/compiler.xml delete mode 100644 src/frontend/src/main.js create mode 100644 src/frontend/src/main.ts rename src/frontend/src/router/{index.js => index.ts} (73%) create mode 100644 src/frontend/src/shims-tsx.d.ts create mode 100644 src/frontend/src/shims-vue.d.ts create mode 100644 src/frontend/src/util.ts create mode 100644 src/frontend/tsconfig.json diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..7595a0d --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/src/frontend/.eslintrc.js b/src/frontend/.eslintrc.js index 5cb29d6..f916eea 100644 --- a/src/frontend/.eslintrc.js +++ b/src/frontend/.eslintrc.js @@ -3,7 +3,7 @@ module.exports = { root: true, parserOptions: { - parser: 'babel-eslint' + parser: "@typescript-eslint/parser" }, env: { browser: true, @@ -12,7 +12,10 @@ module.exports = { // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention 'plugin:vue/recommended', // https://github.com/standard/standard/blob/master/docs/RULES-en.md - 'standard' + 'standard', + "@vue/prettier", + "@vue/typescript", + "plugin:prettier/recommended" ], // required to lint *.vue files plugins: [ diff --git a/src/frontend/build/vue-loader.conf.js b/src/frontend/build/vue-loader.conf.js index 33ed58b..18b7295 100644 --- a/src/frontend/build/vue-loader.conf.js +++ b/src/frontend/build/vue-loader.conf.js @@ -11,6 +11,7 @@ module.exports = { sourceMap: sourceMapEnabled, extract: isProduction }), + esModule: true, cssSourceMap: sourceMapEnabled, cacheBusting: config.dev.cacheBusting, transformToRequire: { diff --git a/src/frontend/build/webpack.base.conf.js b/src/frontend/build/webpack.base.conf.js index 1f4f47e..c149f68 100644 --- a/src/frontend/build/webpack.base.conf.js +++ b/src/frontend/build/webpack.base.conf.js @@ -9,7 +9,7 @@ function resolve (dir) { } const createLintingRule = () => ({ - test: /\.(js|vue)$/, + test: /\.(ts|js|vue)$/, loader: 'eslint-loader', enforce: 'pre', include: [resolve('src'), resolve('test')], @@ -22,7 +22,7 @@ const createLintingRule = () => ({ module.exports = { context: path.resolve(__dirname, '../'), entry: { - app: './src/main.js' + app: './src/main.ts' }, output: { path: config.build.assetsRoot, @@ -32,7 +32,7 @@ module.exports = { : config.dev.assetsPublicPath }, resolve: { - extensions: ['.js', '.vue', '.json'], + extensions: ['.ts', '.js', '.vue', '.json'], alias: { 'vue$': 'vue/dist/vue.esm.js', '@': resolve('src'), @@ -40,12 +40,20 @@ module.exports = { }, module: { rules: [ - ...(config.dev.useEslint ? [createLintingRule()] : []), + // ...(config.dev.useEslint ? [createLintingRule()] : []), { test: /\.vue$/, loader: 'vue-loader', options: vueLoaderConfig }, + { + test: /\.tsx?$/, + loader: 'ts-loader', + exclude: /node_modules/, + options: { + appendTsSuffixTo: [/\.vue$/] + } + }, { test: /\.js$/, loader: 'babel-loader', diff --git a/src/frontend/build/webpack.dev.conf.js b/src/frontend/build/webpack.dev.conf.js index 070ae22..6a9f764 100755 --- a/src/frontend/build/webpack.dev.conf.js +++ b/src/frontend/build/webpack.dev.conf.js @@ -20,7 +20,7 @@ const devWebpackConfig = merge(baseWebpackConfig, { // cheap-module-eval-source-map is faster for development devtool: config.dev.devtool, - // these devServer options should be customized in /config/index.js + // these devServer options should be customized in /config/index.ts devServer: { clientLogLevel: 'warning', historyApiFallback: { diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 7414875..c195dda 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -172,6 +172,102 @@ "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", "dev": true }, + "@typescript-eslint/eslint-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.3.0.tgz", + "integrity": "sha512-s+vjO9+PvYS2A6FnQC/imyEDOkrEKIzSpPf2OEGnkKqa5+1d0cuXgCi/oROtuBht2/u/iK22nrYcO/Ei4R8F/g==", + "dev": true, + "requires": { + "@typescript-eslint/parser": "1.3.0", + "requireindex": "^1.2.0", + "tsutils": "^3.7.0" + } + }, + "@typescript-eslint/parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.3.0.tgz", + "integrity": "sha512-Q5cz9nyEQyRrtItRElvQXdNs0Xja1xvOdphDQR7N6MqUdi4juWVNxHKypdHQCx9OcEBev6pWHOda8lwg/2W9/g==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "1.3.0", + "eslint-scope": "^4.0.0", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "@typescript-eslint/typescript-estree": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.3.0.tgz", + "integrity": "sha512-h6UxHSmBUopFcxHg/eryrA+GwHMbh7PxotMbkq9p2f3nX60CKm5Zc0VN8krBD3IS5KqsK0iOz24VpEWrP+JZ2Q==", + "dev": true, + "requires": { + "lodash.unescape": "4.0.1", + "semver": "5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + } + } + }, + "@vue/eslint-config-prettier": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-4.0.1.tgz", + "integrity": "sha512-rJEDXPb61Hfgg8GllO3XXFP98bcIxdNNHSrNcxP/vBSukOolgOwQyZJ5f5z/c7ViPyh5/IDlC4qBnhx/0n+I4g==", + "dev": true, + "requires": { + "eslint-config-prettier": "^3.3.0", + "eslint-plugin-prettier": "^3.0.0", + "prettier": "^1.15.2" + }, + "dependencies": { + "eslint-config-prettier": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-3.6.0.tgz", + "integrity": "sha512-ixJ4U3uTLXwJts4rmSVW/lMXjlGwCijhBJHk8iVqKKSifeI0qgFEfWl8L63isfc8Od7EiBALF6BX3jKLluf/jQ==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, + "prettier": { + "version": "1.16.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", + "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==", + "dev": true + } + } + }, + "@vue/eslint-config-typescript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-4.0.0.tgz", + "integrity": "sha512-uSMAMgw4xDgVdZQhpbtJRo8nMV4oOy3Ht8olfOo7xvYFYLMF2JZ1tDRKd9/NSusxA72O2Vma+HzmyzDHg9evcQ==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "^1.1.0", + "@typescript-eslint/parser": "^1.1.0" + } + }, "abab": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", @@ -195,9 +291,9 @@ } }, "acorn": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", - "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.0.tgz", + "integrity": "sha512-vvZ8PwswGTM15ZXyk3I+SvpTm8UbF8iRnGiU/f9TPU6By7K1XTvfvusFtoQt0WYycudFSYW2lrJDivhBlGovvQ==", "dev": true }, "acorn-dynamic-import": { @@ -224,25 +320,22 @@ "dev": true, "requires": { "acorn": "^5.0.0" - } - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" }, "dependencies": { "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true } } }, + "acorn-jsx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "dev": true + }, "agent-base": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", @@ -273,12 +366,6 @@ "json-schema-traverse": "^0.3.0" } }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, "align-text": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", @@ -2005,19 +2092,10 @@ "unset-value": "^1.0.0" } }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", + "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", "dev": true }, "camel-case": { @@ -2137,9 +2215,9 @@ } }, "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, "check-types": { @@ -3930,88 +4008,194 @@ } }, "eslint": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.13.0.tgz", + "integrity": "sha512-nqD5WQMisciZC5EHZowejLKQjWGuFS5c70fxqSKlnDME+oz9zmE8KTlX+lHSg+/5wsC/kf9Q9eMkC8qS3oM2fg==", "dev": true, "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", + "@babel/code-frame": "^7.0.0", + "ajv": "^6.5.3", "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", + "espree": "^5.0.0", + "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^2.0.0", "functional-red-black-tree": "^1.0.1", "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", + "inquirer": "^6.1.0", + "js-yaml": "^3.12.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", "optionator": "^0.8.2", "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", "progress": "^2.0.0", - "regexpp": "^1.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "4.0.2", - "text-table": "~0.2.0" + "strip-json-comments": "^2.0.1", + "table": "^5.0.2", + "text-table": "^0.2.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "acorn": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.7.tgz", + "integrity": "sha512-HNJNgE60C9eOTgn974Tlp3dpLZdUr+SoxxDwPaY9J/kDNOLQTkaDgwBUXAF4SSsrAwD9RpdxuHK/EbuF+W9Ahw==", + "dev": true + }, + "acorn-jsx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "dev": true + }, + "ajv": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.8.1.tgz", + "integrity": "sha512-eqxCp82P+JfqL683wwsL73XmFs1eG6qjw+RD3YHx+Jll1r0jNd4dh8QG9NYAeNGA/hnZjeEDgtTskgJULbxpWQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "esprima": { + "eslint-scope": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "espree": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz", + "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==", + "dev": true, + "requires": { + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, "globals": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", - "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", + "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -4023,55 +4207,63 @@ } } }, + "eslint-config-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-4.0.0.tgz", + "integrity": "sha512-kWuiJxzV5NwOwZcpyozTzDT5KJhBw292bbYro9Is7BWnbNMg15Gmpluc1CTetiCatF8DRkNvgPAOaSyg+bYr3g==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + }, + "dependencies": { + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + } + } + }, "eslint-config-standard": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz", - "integrity": "sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", + "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", "dev": true }, "eslint-friendly-formatter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-friendly-formatter/-/eslint-friendly-formatter-3.0.0.tgz", - "integrity": "sha1-J4h0Q1psRuwdlPoLH/SU4w7wQpA=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-friendly-formatter/-/eslint-friendly-formatter-4.0.1.tgz", + "integrity": "sha1-J9UE3IN/fK3b8gGy6EpO5zC6Pvo=", "dev": true, "requires": { - "chalk": "^1.0.0", + "chalk": "^2.0.1", "coalescy": "1.0.0", "extend": "^3.0.0", "minimist": "^1.2.0", + "strip-ansi": "^4.0.0", "text-table": "^0.2.0" }, "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } } } }, @@ -4086,9 +4278,9 @@ } }, "eslint-loader": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz", - "integrity": "sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.2.tgz", + "integrity": "sha512-rA9XiXEOilLYPOIInvVH5S/hYfyTPyxag6DZhoQOduM+3TkghAEQ3VcFO8VnX4J4qg/UIBzp72aOf/xvYmpmsg==", "dev": true, "requires": { "loader-fs-cache": "^1.0.0", @@ -4108,6 +4300,16 @@ "pkg-dir": "^2.0.0" } }, + "eslint-plugin-es": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz", + "integrity": "sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw==", + "dev": true, + "requires": { + "eslint-utils": "^1.3.0", + "regexpp": "^2.0.1" + } + }, "eslint-plugin-import": { "version": "2.16.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz", @@ -4208,44 +4410,55 @@ } }, "eslint-plugin-node": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", - "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-8.0.1.tgz", + "integrity": "sha512-ZjOjbjEi6jd82rIpFSgagv4CHWzG9xsQAVp1ZPlhRnnYxcTgENUVBvhYmkQ7GvT1QFijUSo69RaiOJKhMu6i8w==", "dev": true, "requires": { - "ignore": "^3.3.6", + "eslint-plugin-es": "^1.3.1", + "eslint-utils": "^1.3.1", + "ignore": "^5.0.2", "minimatch": "^3.0.4", - "resolve": "^1.3.3", - "semver": "5.3.0" + "resolve": "^1.8.1", + "semver": "^5.5.0" }, "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "ignore": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.0.5.tgz", + "integrity": "sha512-kOC8IUb8HSDMVcYrDVezCxpJkzSQWTAzf3olpKM6o9rM5zpojx23O0Fl8Wr4+qJ6ZbPEHqf1fdwev/DS7v7pmA==", "dev": true } } }, + "eslint-plugin-prettier": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.0.1.tgz", + "integrity": "sha512-/PMttrarPAY78PLvV3xfWibMOdMDl57hmlQ2XqFeA37wd+CJ7WSxV7txqjVPHi/AAFKd2lX0ZqfsOc/i5yFCSQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, "eslint-plugin-promise": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz", - "integrity": "sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", + "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", "dev": true }, "eslint-plugin-standard": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz", - "integrity": "sha512-fVcdyuKRr0EZ4fjWl3c+gp1BANFJD1+RaWa2UPYfMZ6jCtp5RG00kSaXnK/dE5sYzt4kaWJ9qdxqUfc0d9kX0w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz", + "integrity": "sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA==", "dev": true }, "eslint-plugin-vue": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-4.7.1.tgz", - "integrity": "sha512-esETKhVMI7Vdli70Wt4bvAwnZBJeM0pxVX9Yb0wWKxdCJc2EADalVYK/q2FzMw8oKN0wPMdqVCKS8kmR89recA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-5.1.0.tgz", + "integrity": "sha512-C7avvbGLb9J1PyGiFolPcGR4ljUc+dKm5ZJdrUKXwXFxHHx4SqOmRI29AsFyW7PbCGcnOvIlaq7NJS6HDIak+g==", "dev": true, "requires": { - "vue-eslint-parser": "^2.0.3" + "vue-eslint-parser": "^4.0.2" } }, "eslint-scope": { @@ -4258,6 +4471,12 @@ "estraverse": "^4.1.1" } }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", + "dev": true + }, "eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -4265,13 +4484,22 @@ "dev": true }, "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", + "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", "dev": true, "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.7.tgz", + "integrity": "sha512-HNJNgE60C9eOTgn974Tlp3dpLZdUr+SoxxDwPaY9J/kDNOLQTkaDgwBUXAF4SSsrAwD9RpdxuHK/EbuF+W9Ahw==", + "dev": true + } } }, "esprima": { @@ -4573,14 +4801,25 @@ } }, "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", "dev": true, "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } } }, "extglob": { @@ -4684,6 +4923,12 @@ "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", "dev": true }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -4905,46 +5150,15 @@ } }, "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", "dev": true, "requires": { "circular-json": "^0.3.1", - "del": "^2.0.2", "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", "write": "^0.2.1" - }, - "dependencies": { - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - } - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - } } }, "flatten": { @@ -5126,7 +5340,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -5147,12 +5362,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5167,17 +5384,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -5294,7 +5514,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -5306,6 +5527,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5320,6 +5542,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5327,12 +5550,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -5351,6 +5576,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -5431,7 +5657,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -5443,6 +5670,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -5528,7 +5756,8 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -5564,6 +5793,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5583,6 +5813,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5626,12 +5857,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -6434,6 +6667,16 @@ "import-from": "^2.1.0" } }, + "import-fresh": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", + "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, "import-from": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", @@ -6511,40 +6754,51 @@ "dev": true }, "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", + "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "external-editor": "^2.0.4", + "external-editor": "^3.0.3", "figures": "^2.0.0", - "lodash": "^4.3.0", + "lodash": "^4.17.11", "mute-stream": "0.0.7", "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", + "rxjs": "^6.4.0", "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", + "strip-ansi": "^5.0.0", "through": "^2.3.6" }, "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.0.0" } } } @@ -6878,12 +7132,6 @@ "has": "^1.0.1" } }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -7967,6 +8215,14 @@ "whatwg-url": "^6.4.1", "ws": "^4.0.0", "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + } } }, "jsesc": { @@ -8399,6 +8655,12 @@ "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 + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -8930,6 +9192,12 @@ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, "nightwatch": { "version": "0.9.21", "resolved": "https://registry.npmjs.org/nightwatch/-/nightwatch-0.9.21.tgz", @@ -9175,9 +9443,9 @@ } }, "object-hash": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.0.tgz", - "integrity": "sha512-05KzQ70lSeGSrZJQXE5wNDiTkBJDlUT/myi6RX9dVIvz7a7Qh4oH93BQdiPMn27nldYvVQCKMUaM83AfizZlsQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", "dev": true }, "object-keys": { @@ -9470,6 +9738,15 @@ "no-case": "^2.2.0" } }, + "parent-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.0.tgz", + "integrity": "sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-asn1": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", @@ -9653,12 +9930,6 @@ "find-up": "^2.1.0" } }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, "pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", @@ -11767,11 +12038,20 @@ "dev": true }, "prettier": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.14.2.tgz", - "integrity": "sha512-McHPg0n1pIke+A/4VcaS2en+pTNjy4xF+Uuq86u/5dyDO59/TtFZtQ708QIRkEZ3qwKz3GVkVa6mpxK/CpB8Rg==", + "version": "1.16.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", + "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==", "dev": true }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "pretty": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", @@ -11841,9 +12121,9 @@ "dev": true }, "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "promise-inflight": { @@ -12231,9 +12511,9 @@ } }, "regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, "regexpu-core": { @@ -12390,15 +12670,11 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } + "requireindex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", + "dev": true }, "requires-port": { "version": "1.0.0", @@ -12433,9 +12709,9 @@ } }, "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "resolve-url": { @@ -12528,19 +12804,13 @@ "aproba": "^1.1.1" } }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "dev": true, "requires": { - "rx-lite": "*" + "tslib": "^1.9.0" } }, "safe-buffer": { @@ -12807,11 +13077,13 @@ "dev": true }, "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" } }, @@ -13386,17 +13658,47 @@ "dev": true }, "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/table/-/table-5.2.2.tgz", + "integrity": "sha512-f8mJmuu9beQEDkKHLzOv4VxVYlU68NpdzjbGPl69i4Hx0sTopJuNxuzJd17iV2h24dAfa93u794OnDA5jqXvfQ==", "dev": true, "requires": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", + "ajv": "^6.6.1", + "lodash": "^4.17.11", + "slice-ansi": "^2.0.0", "string-width": "^2.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.8.1.tgz", + "integrity": "sha512-eqxCp82P+JfqL683wwsL73XmFs1eG6qjw+RD3YHx+Jll1r0jNd4dh8QG9NYAeNGA/hnZjeEDgtTskgJULbxpWQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } } }, "tapable": { @@ -13619,6 +13921,19 @@ "integrity": "sha1-Antp+oIyJeVRys4+8DsR9qs3wdc=", "dev": true }, + "ts-loader": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-3.5.0.tgz", + "integrity": "sha512-JTia3kObhTk36wPFgy0RnkZReiusYx7Le9IhcUWRrCTcFcr6Dy1zGsFd3x8DG4gevlbN65knI8W50FfoykXcng==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^3.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^3.1.4", + "semver": "^5.0.1" + } + }, "tsconfig": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", @@ -13639,6 +13954,21 @@ } } }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "tsutils": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.8.0.tgz", + "integrity": "sha512-XQdPhgcoTbCD8baXC38PQ0vpTZ8T3YrE+vR66YIj/xvDt1//8iAhafpIT/4DmvzzC1QFapEImERu48Pa01dIUA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", @@ -13697,6 +14027,12 @@ "resolved": "https://registry.npmjs.org/typeface-roboto/-/typeface-roboto-0.0.54.tgz", "integrity": "sha512-sOFA1FXgP0gOgBYlS6irwq6hHYA370KE3dPlgYEJHL3PJd5X8gQE0RmL79ONif6fL5JZuGDj+rtOrFeOqz5IZQ==" }, + "typescript": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.1.tgz", + "integrity": "sha512-cTmIDFW7O0IHbn1DPYjkiebHxwtCMU+eTy30ZtJNBPF9j2O1ITu5XH2YnBeVRKWHqF+3JQwWJv0Q0aUgX8W7IA==", + "dev": true + }, "uglify-js": { "version": "3.3.28", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.28.tgz", @@ -14075,39 +14411,66 @@ } }, "vue": { - "version": "2.5.22", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.5.22.tgz", - "integrity": "sha512-pxY3ZHlXNJMFQbkjEgGVMaMMkSV1ONpz+4qB55kZuJzyJOhn6MSy/YZdzhdnumegNzVTL/Dn3Pp4UrVBYt1j/g==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.3.tgz", + "integrity": "sha512-yftjtahz4UTAtOlXXuw7UaYD86fWrMDAAzqTdqJJx2FIBqcPmBN6kPBHiBJFGaQELVblb5ijbFMXsx0i0F7q3g==" + }, + "vue-class-component": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/vue-class-component/-/vue-class-component-6.3.2.tgz", + "integrity": "sha512-cH208IoM+jgZyEf/g7mnFyofwPDJTM/QvBNhYMjqGB8fCsRyTf68rH2ISw/G20tJv+5mIThQ3upKwoL4jLTr1A==" }, "vue-eslint-parser": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz", - "integrity": "sha512-ZezcU71Owm84xVF6gfurBQUGg8WQ+WZGxgDEQu1IHFBZNx7BFZg3L1yHxrCBNNwbwFtE1GuvfJKMtb6Xuwc/Bw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-4.0.3.tgz", + "integrity": "sha512-AUeQsYdO6+7QXCems+WvGlrXd37PHv/zcRQSQdY1xdOMwdFAPEnMBsv7zPvk0TPGulXkK/5p/ITgrjiYB7k3ag==", "dev": true, "requires": { - "debug": "^3.1.0", - "eslint-scope": "^3.7.1", + "debug": "^4.1.0", + "eslint-scope": "^4.0.0", "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.2", - "esquery": "^1.0.0", - "lodash": "^4.17.4" + "espree": "^4.1.0", + "esquery": "^1.0.1", + "lodash": "^4.17.11" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" + } + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true } } }, "vue-hot-reload-api": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz", - "integrity": "sha512-2j/t+wIbyVMP5NvctQoSUvLkYKoWAAk2QlQiilrM2a6/ulzFgdcLUJfTvs4XQ/3eZhHiBmmEojbjmM4AzZj8JA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.1.tgz", + "integrity": "sha512-AA86yKZ5uOKz87/q1UpngEXhbRkaYg1b7HMMVRobNV1IVKqZe8oLIzo6iMocVwZXnYitlGwf2k4ZRLOZlS8oPQ==", "dev": true }, "vue-jest": { @@ -14157,6 +14520,14 @@ "vue-template-es2015-compiler": "^1.6.0" } }, + "vue-property-decorator": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-7.3.0.tgz", + "integrity": "sha512-HarXfTQ/Nxm4s/APpAaGIGHq5ZzslApImQy8ZrtkfGamw8rUFAVgMS5C50/AQ80+wfw3Wpnf4bNzbmj75m/k2Q==", + "requires": { + "vue-class-component": "^6.2.0" + } + }, "vue-router": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.2.tgz", @@ -14173,9 +14544,9 @@ } }, "vue-template-compiler": { - "version": "2.5.22", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.5.22.tgz", - "integrity": "sha512-1VTw/NPTUeHNiwhkq6NkFzO7gYLjFCueBN0FX8NEiQIemd5EUMQ5hxrF7O0zCPo5tae+U9S/scETPea+hIz8Eg==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.3.tgz", + "integrity": "sha512-SQ3lJk7fwquz8fGac7MwvP9cEBZntokTWITaDrLC0zmyBKjcOfJtWZkMsv+2uSUBDD8kwz8Bsad9xmBWaNULhg==", "dev": true, "requires": { "de-indent": "^1.0.2", @@ -14189,14 +14560,14 @@ "dev": true }, "vuetify": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-1.4.4.tgz", - "integrity": "sha512-i0fNciTrzP+U6NinB2kmNMC5vWXtrTy5QcVFLOxv4dhhqTiMTyHj7rV1B2lwBTZYoDhimmSAYRfqHeKdCMx+Gg==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-1.5.0.tgz", + "integrity": "sha512-I2bITwvtkfbUf2hfrKo3Uta4egpv5KzEcKR1czgdyjZdA1nlo96XV2EDu0XetLl6p+AjhOqwlZWbLSezy9ZZmQ==" }, "vuetify-upload-button": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/vuetify-upload-button/-/vuetify-upload-button-0.1.2.tgz", - "integrity": "sha1-fVcLdO4Og05OAsWsE+tSQ+kkNAE=" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/vuetify-upload-button/-/vuetify-upload-button-1.2.2.tgz", + "integrity": "sha512-WQmAevQl4F2musSLpPzyT3fCBCksFiL7V6Jh8qD1fxGxHjAvjGywJKWjPLMzXDHkJfo6q2OPJtynPU0QXN5hGA==" }, "w3c-hr-time": { "version": "1.0.1", @@ -14290,6 +14661,12 @@ "yargs": "^8.0.2" }, "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, "ajv": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.1.tgz", @@ -14530,6 +14907,14 @@ "mkdirp": "^0.5.1", "opener": "^1.4.3", "ws": "^4.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + } } }, "webpack-dev-middleware": { diff --git a/src/frontend/package.json b/src/frontend/package.json index e06a0f5..54a222b 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -17,12 +17,17 @@ "axios": "^0.18.0", "material-design-icons-iconfont": "^3.0.3", "typeface-roboto": "0.0.54", - "vue": "^2.5.22", + "vue": "^2.6.3", + "vue-class-component": "^6.3.2", + "vue-property-decorator": "^7.3.0", "vue-router": "^3.0.2", - "vuetify": "^1.4.4", - "vuetify-upload-button": "^0.1.2" + "vuetify": "^1.5.0", + "vuetify-upload-button": "^1.2.2" }, "devDependencies": { + "@vue/eslint-config-prettier": "^4.0.1", + "@vue/eslint-config-typescript": "^4.0.0", + "acorn": "^6.0.0", "autoprefixer": "^7.1.2", "babel-core": "^6.22.1", "babel-eslint": "^8.2.6", @@ -42,15 +47,17 @@ "copy-webpack-plugin": "^4.6.0", "cross-spawn": "^5.0.1", "css-loader": "^0.28.0", - "eslint": "^4.15.0", - "eslint-config-standard": "^10.2.1", - "eslint-friendly-formatter": "^3.0.0", - "eslint-loader": "^1.7.1", + "eslint": "^5.13.0", + "eslint-config-prettier": "^4.0.0", + "eslint-config-standard": "^12.0.0", + "eslint-friendly-formatter": "^4.0.1", + "eslint-loader": "^2.1.2", "eslint-plugin-import": "^2.16.0", - "eslint-plugin-node": "^5.2.0", - "eslint-plugin-promise": "^3.4.0", - "eslint-plugin-standard": "^3.0.1", - "eslint-plugin-vue": "^4.7.1", + "eslint-plugin-node": "^8.0.1", + "eslint-plugin-prettier": "^3.0.1", + "eslint-plugin-promise": "^4.0.1", + "eslint-plugin-standard": "^4.0.0", + "eslint-plugin-vue": "^5.1.0", "extract-text-webpack-plugin": "^3.0.0", "file-loader": "^1.1.4", "friendly-errors-webpack-plugin": "^1.6.1", @@ -65,16 +72,19 @@ "postcss-import": "^11.0.0", "postcss-loader": "^2.1.6", "postcss-url": "^7.2.1", + "prettier": "^1.16.4", "rimraf": "^2.6.3", "selenium-server": "^3.141.59", "semver": "^5.6.0", "shelljs": "^0.7.6", + "ts-loader": "^3.5.0", + "typescript": "^3.3.1", "uglifyjs-webpack-plugin": "^1.3.0", "url-loader": "^0.5.8", "vue-jest": "^1.0.2", "vue-loader": "^13.7.3", "vue-style-loader": "^3.0.1", - "vue-template-compiler": "^2.5.22", + "vue-template-compiler": "^2.6.3", "webpack": "^3.6.0", "webpack-bundle-analyzer": "^2.9.0", "webpack-dev-server": "^2.11.3", diff --git a/src/frontend/src/App.vue b/src/frontend/src/App.vue index 3348032..38db153 100644 --- a/src/frontend/src/App.vue +++ b/src/frontend/src/App.vue @@ -51,22 +51,21 @@ - diff --git a/src/frontend/src/components/AddBtn.vue b/src/frontend/src/components/AddBtn.vue index 97f6a49..d2f37b9 100644 --- a/src/frontend/src/components/AddBtn.vue +++ b/src/frontend/src/components/AddBtn.vue @@ -11,8 +11,12 @@ - diff --git a/src/frontend/src/components/AddDialog.vue b/src/frontend/src/components/AddDialog.vue index 0fc97aa..de3597b 100644 --- a/src/frontend/src/components/AddDialog.vue +++ b/src/frontend/src/components/AddDialog.vue @@ -55,8 +55,10 @@ - diff --git a/src/frontend/src/components/DataTable.vue b/src/frontend/src/components/DataTable.vue index 1ec2347..c0c7489 100644 --- a/src/frontend/src/components/DataTable.vue +++ b/src/frontend/src/components/DataTable.vue @@ -29,8 +29,10 @@ - diff --git a/src/frontend/src/components/ExpandDetails.vue b/src/frontend/src/components/ExpandDetails.vue index ec953de..ccc3054 100644 --- a/src/frontend/src/components/ExpandDetails.vue +++ b/src/frontend/src/components/ExpandDetails.vue @@ -84,8 +84,10 @@ - diff --git a/src/frontend/src/components/IncludedList.vue b/src/frontend/src/components/IncludedList.vue index 90560cd..cfad7b8 100644 --- a/src/frontend/src/components/IncludedList.vue +++ b/src/frontend/src/components/IncludedList.vue @@ -28,8 +28,10 @@ - diff --git a/src/frontend/src/components/ModTable.vue b/src/frontend/src/components/ModTable.vue index 7857aa6..b7bd495 100644 --- a/src/frontend/src/components/ModTable.vue +++ b/src/frontend/src/components/ModTable.vue @@ -35,34 +35,43 @@ - diff --git a/src/frontend/src/components/PackTable.vue b/src/frontend/src/components/PackTable.vue index 8f0d2ff..0f243d2 100644 --- a/src/frontend/src/components/PackTable.vue +++ b/src/frontend/src/components/PackTable.vue @@ -47,58 +47,59 @@ - diff --git a/src/frontend/src/components/PackVersionDialog.vue b/src/frontend/src/components/PackVersionDialog.vue index 903af1c..0e81015 100644 --- a/src/frontend/src/components/PackVersionDialog.vue +++ b/src/frontend/src/components/PackVersionDialog.vue @@ -146,10 +146,12 @@ - diff --git a/src/frontend/src/components/RootCard.vue b/src/frontend/src/components/RootCard.vue index 9d7f622..1408aac 100644 --- a/src/frontend/src/components/RootCard.vue +++ b/src/frontend/src/components/RootCard.vue @@ -14,8 +14,10 @@ - diff --git a/src/frontend/src/components/Snackbar.vue b/src/frontend/src/components/Snackbar.vue index 7840b36..ffc4a7d 100644 --- a/src/frontend/src/components/Snackbar.vue +++ b/src/frontend/src/components/Snackbar.vue @@ -15,8 +15,10 @@ - diff --git a/src/frontend/src/main.js b/src/frontend/src/main.js deleted file mode 100644 index 9566643..0000000 --- a/src/frontend/src/main.js +++ /dev/null @@ -1,98 +0,0 @@ -// The Vue build version to load with the `import` command -// (runtime-only or standalone) has been set in webpack.base.conf with an alias. -import 'material-design-icons-iconfont/dist/material-design-icons.css' -import 'typeface-roboto' -import 'vuetify/dist/vuetify.min.css' -import Vue from 'vue' -import Vuetify from 'vuetify' -import App from './App' -import router from './router' -import colors from 'vuetify/es5/util/colors' -import axios from 'axios' - -const url = location.protocol + '//' + location.hostname + ':8081' -const root = url + '/braze/api/' -const constants = root + 'constants' -const mods = root + 'mods' -const packs = root + 'packs' - -if (url !== location.origin) { // for dev environment - axios.defaults.headers.common['Authorization'] = 'Basic dXNlcjpjaGFuZ2VtZQ==' -} - -const latency = 1600 // artifical latency - -Vue.config.productionTip = false - -Vue.use(Vuetify, { - theme: { - 'primary': colors.orange.darken2, - 'accent': colors.blue.base - } -}) - -Vue.mixin({ - methods: { - getConstants (success, error) { - get(constants, success, error) - }, - getMods (success, error) { - get(mods, success, error) - }, - getMod (slug, success, error) { - get(`${mods}/${slug}`, success, error) - }, - getPack (slug, success, error) { - get(`${packs}/${slug}`, success, error) - }, - getPacks (success, error) { - get(packs, success, error) - }, - postMod (data, success, error) { - post(mods, data, success, error) - }, - postModVersion (slug, data, success, error) { - post(`${mods}/${slug}`, data, success, error) - }, - postPack (data, success, error) { - post(packs, data, success, error) - }, - postPackVersion (slug, data, success, error) { - post(`${packs}/${slug}`, data, success, error) - }, - slugify (str) { - return str.toLowerCase() - .replace(/[^\w\s-]/g, '') // remove non-word [a-z0-9_], non-whitespace, non-hyphen characters - .replace(/[\s_-]+/g, '-') // swap any length of whitespace, underscore, hyphen characters with a single - - .replace(/^-+|-+$/g, '') // remove leading, trailing - - // function written by kganser https://gist.github.com/mathewbyrne/1280286#gistcomment-1716050 - } - } -}) - -/* eslint-disable no-new */ -new Vue({ - el: '#app', - router, - components: { App }, - template: '' -}) - -function get (url, success, error) { - loadAndThen(() => - axios.get(url).then(success).catch(error) - ) -} - -function post (url, data, success, error) { - loadAndThen(() => - axios.post(url, data).then(success).catch(e => { - console.error(e.response.data) - error(e) - }) - ) -} - -function loadAndThen (cb) { - setTimeout(cb, latency) -} diff --git a/src/frontend/src/main.ts b/src/frontend/src/main.ts new file mode 100644 index 0000000..148025c --- /dev/null +++ b/src/frontend/src/main.ts @@ -0,0 +1,27 @@ +// The Vue build version to load with the `import` command +// (runtime-only or standalone) has been set in webpack.base.conf with an alias. +import 'material-design-icons-iconfont/dist/material-design-icons.css' +import 'typeface-roboto' +import 'vuetify/dist/vuetify.min.css' +import Vue from 'vue' +import Vuetify from 'vuetify' +import App from './App.vue' +import router from './router' +import colors from 'vuetify/es5/util/colors' + +Vue.config.productionTip = false + +Vue.use(Vuetify, { + theme: { + 'primary': colors.orange.darken2, + 'accent': colors.blue.base + } +}) + +/* eslint-disable no-new */ +new Vue({ + el: '#app', + router, + components: { App }, + template: '' +}) diff --git a/src/frontend/src/router/index.js b/src/frontend/src/router/index.ts similarity index 73% rename from src/frontend/src/router/index.js rename to src/frontend/src/router/index.ts index 4500cba..b492311 100644 --- a/src/frontend/src/router/index.js +++ b/src/frontend/src/router/index.ts @@ -1,7 +1,7 @@ import Vue from 'vue' import Router from 'vue-router' -import ModTable from '@/components/ModTable' -import PackTable from '@/components/PackTable' +import ModTable from '@/components/ModTable.vue' +import PackTable from '@/components/PackTable.vue' Vue.use(Router) diff --git a/src/frontend/src/shims-tsx.d.ts b/src/frontend/src/shims-tsx.d.ts new file mode 100644 index 0000000..f92b1fd --- /dev/null +++ b/src/frontend/src/shims-tsx.d.ts @@ -0,0 +1,13 @@ +import Vue, { VNode } from 'vue'; + +declare global { + namespace JSX { + // tslint:disable no-empty-interface + interface Element extends VNode {} + // tslint:disable no-empty-interface + interface ElementClass extends Vue {} + interface IntrinsicElements { + [elem: string]: any; + } + } +} diff --git a/src/frontend/src/shims-vue.d.ts b/src/frontend/src/shims-vue.d.ts new file mode 100644 index 0000000..2abdb13 --- /dev/null +++ b/src/frontend/src/shims-vue.d.ts @@ -0,0 +1,9 @@ +declare module '*.vue' { + import Vue from 'vue'; + export default Vue; +} + +declare module 'vuetify-upload-button' { + let UploadButton: any; + export default UploadButton; +} diff --git a/src/frontend/src/util.ts b/src/frontend/src/util.ts new file mode 100644 index 0000000..7e4191a --- /dev/null +++ b/src/frontend/src/util.ts @@ -0,0 +1,75 @@ +import axios from "axios"; + +const url = location.protocol + '//' + location.hostname + ':8081' +const root = url + '/braze/api/' +const constants = root + 'constants' +const mods = root + 'mods' +const packs = root + 'packs' +const latency = 1600 // artifical latency + +if (url !== location.origin) { // for dev environment + axios.defaults.headers.common['Authorization'] = 'Basic dXNlcjpjaGFuZ2VtZQ==' +} + +function get (url: string, success: any, error: any) { + loadAndThen(() => + axios.get(url).then(success).catch(error) + ) +} + +function post (url: string, data: any, success: any, error: any) { + loadAndThen(() => + axios.post(url, data).then(success).catch(e => { + console.error(e.response.data) + error(e) + }) + ) +} + +function loadAndThen (cb: any) { + setTimeout(cb, latency) +} + +export function getConstants (success: any, error: any) { + get(constants, success, error) +} + +export function getMods (success: any, error: any) { + get(mods, success, error) +} + +export function getMod (slug: any, success: any, error: any) { + get(`${mods}/${slug}`, success, error) +} + +export function getPack (slug: any, success: any, error: any) { + get(`${packs}/${slug}`, success, error) +} + +export function getPacks (success: any, error: any) { + get(packs, success, error) +} + +export function postMod (data: any, success: any, error: any) { + post(mods, data, success, error) +} + +export function postModVersion (slug: any, data: any, success: any, error: any) { + post(`${mods}/${slug}`, data, success, error) +} + +export function postPack (data: any, success: any, error: any) { + post(packs, data, success, error) +} + +export function postPackVersion (slug: any, data: any, success: any, error: any) { + post(`${packs}/${slug}`, data, success, error) +} + +function slugify (str: string) { + return str.toLowerCase() + .replace(/[^\w\s-]/g, '') // remove non-word [a-z0-9_], non-whitespace, non-hyphen characters + .replace(/[\s_-]+/g, '-') // swap any length of whitespace, underscore, hyphen characters with a single - + .replace(/^-+|-+$/g, '') // remove leading, trailing - + // function written by kganser https://gist.github.com/mathewbyrne/1280286#gistcomment-1716050 +} diff --git a/src/frontend/test/e2e/specs/test.js b/src/frontend/test/e2e/specs/test.js index a7b1bd9..2e5bf3a 100644 --- a/src/frontend/test/e2e/specs/test.js +++ b/src/frontend/test/e2e/specs/test.js @@ -3,7 +3,7 @@ module.exports = { 'default e2e tests': function (browser) { - // automatically uses dev Server port from /config.index.js + // automatically uses dev Server port from /config.index.ts // default: http://localhost:8080 // see nightwatch.conf.js const devServer = browser.globals.devServerURL diff --git a/src/frontend/test/unit/jest.conf.js b/src/frontend/test/unit/jest.conf.js index 4f7da15..2f0b7f7 100644 --- a/src/frontend/test/unit/jest.conf.js +++ b/src/frontend/test/unit/jest.conf.js @@ -22,9 +22,9 @@ module.exports = { mapCoverage: true, coverageDirectory: '/test/unit/coverage', collectCoverageFrom: [ - 'src/**/*.{js,vue}', - '!src/main.js', - '!src/router/index.js', + 'src/**/*.{ts,js,vue}', + '!src/main.ts', + '!src/router/index.ts', '!**/node_modules/**' ] } diff --git a/src/frontend/tsconfig.json b/src/frontend/tsconfig.json new file mode 100644 index 0000000..8cf6d36 --- /dev/null +++ b/src/frontend/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "lib": ["dom", "es5", "es2015"], + "module": "es2015", + "target": "es5", +// "strict": true, + "sourceMap": true, + "outDir": "./built/", + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "experimentalDecorators": true + }, + "exclude": [ + "node_modules" + ] +} From 6822ab4eaeb53c30e2a416247bb3afa91f9d0e07 Mon Sep 17 00:00:00 2001 From: Forrest Hopkins Date: Sun, 10 Feb 2019 04:49:19 -0700 Subject: [PATCH 2/5] PRETTIER + ESLINT: Typescript part 2 Spent QUITE a while ironing out the best way to get Typescript, ESLint, Prettier, Airbnb-Style, Webpack, IntelliJ, and Vue to all play nice. --- src/frontend/.eslintrc.js | 41 +- src/frontend/.prettierrc.js | 4 + src/frontend/build/webpack.base.conf.js | 2 +- src/frontend/package-lock.json | 159 +- src/frontend/package.json | 8 +- src/frontend/src/components/.eslintrc.js | 4 + src/frontend/src/components/AddBtn.vue | 16 +- src/frontend/src/components/AddDialog.vue | 64 +- src/frontend/src/{ => components}/App.vue | 41 +- src/frontend/src/components/DataTable.vue | 78 +- src/frontend/src/components/ExpandDetails.vue | 71 +- src/frontend/src/components/IncludedList.vue | 14 +- src/frontend/src/components/ModTable.vue | 181 +- src/frontend/src/components/PackTable.vue | 307 ++- .../src/components/PackVersionDialog.vue | 336 ++- src/frontend/src/components/RootCard.vue | 16 +- src/frontend/src/components/Snackbar.vue | 35 +- src/frontend/src/ide-fix.js | 35 - src/frontend/src/main.ts | 30 +- src/frontend/src/router/index.ts | 20 +- src/frontend/src/shims-tsx.d.ts | 19 +- src/frontend/src/shims-vue.d.ts | 5 +- src/frontend/src/shims-vuetify.ts | 2174 +++++++++++++++++ src/frontend/src/util.ts | 103 +- 24 files changed, 3001 insertions(+), 762 deletions(-) create mode 100644 src/frontend/.prettierrc.js create mode 100644 src/frontend/src/components/.eslintrc.js rename src/frontend/src/{ => components}/App.vue (57%) delete mode 100644 src/frontend/src/ide-fix.js create mode 100644 src/frontend/src/shims-vuetify.ts diff --git a/src/frontend/.eslintrc.js b/src/frontend/.eslintrc.js index f916eea..fa4b0fb 100644 --- a/src/frontend/.eslintrc.js +++ b/src/frontend/.eslintrc.js @@ -1,31 +1,30 @@ -// https://eslint.org/docs/user-guide/configuring - module.exports = { root: true, - parserOptions: { - parser: "@typescript-eslint/parser" - }, env: { browser: true, }, + parserOptions: { + project: './tsconfig.json', + }, extends: [ - // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention - 'plugin:vue/recommended', - // https://github.com/standard/standard/blob/master/docs/RULES-en.md - 'standard', - "@vue/prettier", - "@vue/typescript", - "plugin:prettier/recommended" + 'airbnb-base', + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + 'prettier', + 'prettier/@typescript-eslint', ], - // required to lint *.vue files - plugins: [ - 'vue' - ], - // add your custom rules here + plugins: ['@typescript-eslint', 'prettier'], rules: { // allow async-await 'generator-star-spacing': 'off', - // allow debugger during development - 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' - } -} + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', + 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', + }, + settings: { + 'import/resolver': { + webpack: { + config: 'build/webpack.base.conf.js', + }, + }, + }, +}; diff --git a/src/frontend/.prettierrc.js b/src/frontend/.prettierrc.js new file mode 100644 index 0000000..eb35f04 --- /dev/null +++ b/src/frontend/.prettierrc.js @@ -0,0 +1,4 @@ +module.exports = { + singleQuote: true, + trailingComma: "es5" +} diff --git a/src/frontend/build/webpack.base.conf.js b/src/frontend/build/webpack.base.conf.js index c149f68..46d72b4 100644 --- a/src/frontend/build/webpack.base.conf.js +++ b/src/frontend/build/webpack.base.conf.js @@ -40,7 +40,7 @@ module.exports = { }, module: { rules: [ - // ...(config.dev.useEslint ? [createLintingRule()] : []), + ...(config.dev.useEslint ? [createLintingRule()] : []), { test: /\.vue$/, loader: 'vue-loader', diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index c195dda..a303b2a 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -224,40 +224,6 @@ } } }, - "@vue/eslint-config-prettier": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-4.0.1.tgz", - "integrity": "sha512-rJEDXPb61Hfgg8GllO3XXFP98bcIxdNNHSrNcxP/vBSukOolgOwQyZJ5f5z/c7ViPyh5/IDlC4qBnhx/0n+I4g==", - "dev": true, - "requires": { - "eslint-config-prettier": "^3.3.0", - "eslint-plugin-prettier": "^3.0.0", - "prettier": "^1.15.2" - }, - "dependencies": { - "eslint-config-prettier": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-3.6.0.tgz", - "integrity": "sha512-ixJ4U3uTLXwJts4rmSVW/lMXjlGwCijhBJHk8iVqKKSifeI0qgFEfWl8L63isfc8Od7EiBALF6BX3jKLluf/jQ==", - "dev": true, - "requires": { - "get-stdin": "^6.0.0" - } - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - }, - "prettier": { - "version": "1.16.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", - "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==", - "dev": true - } - } - }, "@vue/eslint-config-typescript": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-4.0.0.tgz", @@ -485,6 +451,12 @@ "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, + "array-find": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz", + "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=", + "dev": true + }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -4207,6 +4179,17 @@ } } }, + "eslint-config-airbnb-base": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.1.0.tgz", + "integrity": "sha512-XWwQtf3U3zIoKO1BbHh6aUhJZQweOwSt4c2JrPDg9FP3Ltv3+YfEv7jIDB8275tVnO/qOHbfuYg3kzw6Je7uWw==", + "dev": true, + "requires": { + "eslint-restricted-globals": "^0.1.1", + "object.assign": "^4.1.0", + "object.entries": "^1.0.4" + } + }, "eslint-config-prettier": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-4.0.0.tgz", @@ -4224,12 +4207,6 @@ } } }, - "eslint-config-standard": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", - "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", - "dev": true - }, "eslint-friendly-formatter": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/eslint-friendly-formatter/-/eslint-friendly-formatter-4.0.1.tgz", @@ -4277,6 +4254,49 @@ "resolve": "^1.5.0" } }, + "eslint-import-resolver-webpack": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.11.0.tgz", + "integrity": "sha512-vX8rYSPdKtTLkK2FoU1ZRyEsl6wP1FB40ytjrEgMhzUkEkBLuZAkv1KNR+2Ml7lzMOObXI3yaEDiaQ/Yvoczhw==", + "dev": true, + "requires": { + "array-find": "^1.0.0", + "debug": "^2.6.8", + "enhanced-resolve": "~0.9.0", + "find-root": "^1.1.0", + "has": "^1.0.1", + "interpret": "^1.0.0", + "lodash": "^4.17.4", + "node-libs-browser": "^1.0.0 || ^2.0.0", + "resolve": "^1.4.0", + "semver": "^5.3.0" + }, + "dependencies": { + "enhanced-resolve": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + } + }, + "memory-fs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", + "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=", + "dev": true + }, + "tapable": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=", + "dev": true + } + } + }, "eslint-loader": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.2.tgz", @@ -4446,12 +4466,6 @@ "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", "dev": true }, - "eslint-plugin-standard": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz", - "integrity": "sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA==", - "dev": true - }, "eslint-plugin-vue": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-5.1.0.tgz", @@ -4461,6 +4475,12 @@ "vue-eslint-parser": "^4.0.2" } }, + "eslint-restricted-globals": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", + "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", + "dev": true + }, "eslint-scope": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", @@ -5140,6 +5160,12 @@ "pkg-dir": "^2.0.0" } }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -6200,6 +6226,12 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -9463,6 +9495,41 @@ "isobject": "^3.0.0" } }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "dependencies": { + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + } + } + }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", diff --git a/src/frontend/package.json b/src/frontend/package.json index 54a222b..488dd4c 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -10,7 +10,8 @@ "unit": "jest --config test/unit/jest.conf.js --coverage", "e2e": "node test/e2e/runner.js", "test": "npm run unit && npm run e2e", - "lint": "eslint --ext .js,.vue src test/unit test/e2e/specs", + "lint": "eslint --ext .js,.vue,.ts src", + "fix": "eslint --ext .js,.vue,.ts --fix src", "build": "node build/build.js" }, "dependencies": { @@ -25,7 +26,6 @@ "vuetify-upload-button": "^1.2.2" }, "devDependencies": { - "@vue/eslint-config-prettier": "^4.0.1", "@vue/eslint-config-typescript": "^4.0.0", "acorn": "^6.0.0", "autoprefixer": "^7.1.2", @@ -48,15 +48,15 @@ "cross-spawn": "^5.0.1", "css-loader": "^0.28.0", "eslint": "^5.13.0", + "eslint-config-airbnb-base": "^13.1.0", "eslint-config-prettier": "^4.0.0", - "eslint-config-standard": "^12.0.0", "eslint-friendly-formatter": "^4.0.1", + "eslint-import-resolver-webpack": "^0.11.0", "eslint-loader": "^2.1.2", "eslint-plugin-import": "^2.16.0", "eslint-plugin-node": "^8.0.1", "eslint-plugin-prettier": "^3.0.1", "eslint-plugin-promise": "^4.0.1", - "eslint-plugin-standard": "^4.0.0", "eslint-plugin-vue": "^5.1.0", "extract-text-webpack-plugin": "^3.0.0", "file-loader": "^1.1.4", diff --git a/src/frontend/src/components/.eslintrc.js b/src/frontend/src/components/.eslintrc.js new file mode 100644 index 0000000..87f2337 --- /dev/null +++ b/src/frontend/src/components/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + extends: ['plugin:vue/recommended', '@vue/typescript', 'prettier/vue'], + plugins: ['vue', 'prettier'], +}; diff --git a/src/frontend/src/components/AddBtn.vue b/src/frontend/src/components/AddBtn.vue index d2f37b9..12510da 100644 --- a/src/frontend/src/components/AddBtn.vue +++ b/src/frontend/src/components/AddBtn.vue @@ -1,22 +1,14 @@ diff --git a/src/frontend/src/components/AddDialog.vue b/src/frontend/src/components/AddDialog.vue index de3597b..bdfd04c 100644 --- a/src/frontend/src/components/AddDialog.vue +++ b/src/frontend/src/components/AddDialog.vue @@ -1,39 +1,25 @@ diff --git a/src/frontend/src/App.vue b/src/frontend/src/components/App.vue similarity index 57% rename from src/frontend/src/App.vue rename to src/frontend/src/components/App.vue index 38db153..c52d60d 100644 --- a/src/frontend/src/App.vue +++ b/src/frontend/src/components/App.vue @@ -1,10 +1,6 @@ diff --git a/src/frontend/src/components/DataTable.vue b/src/frontend/src/components/DataTable.vue index c0c7489..4e8d8df 100644 --- a/src/frontend/src/components/DataTable.vue +++ b/src/frontend/src/components/DataTable.vue @@ -7,10 +7,7 @@ :items="truncatedItems" item-key="slug" > - diff --git a/src/frontend/src/components/ModTable.vue b/src/frontend/src/components/ModTable.vue index b7bd495..d67666b 100644 --- a/src/frontend/src/components/ModTable.vue +++ b/src/frontend/src/components/ModTable.vue @@ -1,6 +1,5 @@ diff --git a/src/frontend/src/components/PackTable.vue b/src/frontend/src/components/PackTable.vue index 0f243d2..b91d0ef 100644 --- a/src/frontend/src/components/PackTable.vue +++ b/src/frontend/src/components/PackTable.vue @@ -1,6 +1,5 @@ diff --git a/src/frontend/src/components/PackVersionDialog.vue b/src/frontend/src/components/PackVersionDialog.vue index 0e81015..bed3e3f 100644 --- a/src/frontend/src/components/PackVersionDialog.vue +++ b/src/frontend/src/components/PackVersionDialog.vue @@ -9,34 +9,27 @@ Add version for {{ pack }} - + - + - + - + add_circle_outline - + - - + + Cancel - - + + Save - + error @@ -147,9 +116,9 @@ diff --git a/src/frontend/src/components/RootCard.vue b/src/frontend/src/components/RootCard.vue index 1408aac..f870b58 100644 --- a/src/frontend/src/components/RootCard.vue +++ b/src/frontend/src/components/RootCard.vue @@ -2,12 +2,8 @@ {{ cardTitle }} - - + + @@ -15,18 +11,18 @@ diff --git a/src/frontend/src/components/Snackbar.vue b/src/frontend/src/components/Snackbar.vue index ffc4a7d..47465c3 100644 --- a/src/frontend/src/components/Snackbar.vue +++ b/src/frontend/src/components/Snackbar.vue @@ -1,43 +1,34 @@ diff --git a/src/frontend/src/ide-fix.js b/src/frontend/src/ide-fix.js deleted file mode 100644 index 57eebfe..0000000 --- a/src/frontend/src/ide-fix.js +++ /dev/null @@ -1,35 +0,0 @@ -import Vue from 'vue' - -Vue.component('v-app', {}) -Vue.component('v-autocomplete', {}) -Vue.component('v-badge', {}) -Vue.component('v-btn', {}) -Vue.component('v-card', {}) -Vue.component('v-card-actions', {}) -Vue.component('v-card-title', {}) -Vue.component('v-container', {}) -Vue.component('v-content', {}) -Vue.component('v-data-table', {}) -Vue.component('v-dialog', {}) -Vue.component('v-flex', {}) -Vue.component('v-footer', {}) -Vue.component('v-form', {}) -Vue.component('v-icon', {}) -Vue.component('v-layout', {}) -Vue.component('v-list', {}) -Vue.component('v-list-tile', {}) -Vue.component('v-list-tile-action', {}) -Vue.component('v-list-tile-content', {}) -Vue.component('v-list-tile-title', {}) -Vue.component('v-navigation-drawer', {}) -Vue.component('v-progress-linear', {}) -Vue.component('v-select', {}) -Vue.component('v-slider', {}) -Vue.component('v-snackbar', {}) -Vue.component('v-spacer', {}) -Vue.component('v-subheader', {}) -Vue.component('v-switch', {}) -Vue.component('v-text-field', {}) -Vue.component('v-toolbar', {}) -Vue.component('v-toolbar-side-icon', {}) -Vue.component('v-toolbar-title', {}) diff --git a/src/frontend/src/main.ts b/src/frontend/src/main.ts index 148025c..aee57e3 100644 --- a/src/frontend/src/main.ts +++ b/src/frontend/src/main.ts @@ -1,27 +1,27 @@ // The Vue build version to load with the `import` command // (runtime-only or standalone) has been set in webpack.base.conf with an alias. -import 'material-design-icons-iconfont/dist/material-design-icons.css' -import 'typeface-roboto' -import 'vuetify/dist/vuetify.min.css' -import Vue from 'vue' -import Vuetify from 'vuetify' -import App from './App.vue' -import router from './router' -import colors from 'vuetify/es5/util/colors' +import 'material-design-icons-iconfont/dist/material-design-icons.css'; +import 'typeface-roboto'; +import 'vuetify/dist/vuetify.min.css'; +import Vue from 'vue'; +import Vuetify from 'vuetify'; +import colors from 'vuetify/es5/util/colors'; +import App from './components/App.vue'; +import router from './router'; -Vue.config.productionTip = false +Vue.config.productionTip = false; Vue.use(Vuetify, { theme: { - 'primary': colors.orange.darken2, - 'accent': colors.blue.base - } -}) + primary: colors.orange.darken2, + accent: colors.blue.base, + }, +}); /* eslint-disable no-new */ new Vue({ el: '#app', router, components: { App }, - template: '' -}) + template: '', +}); diff --git a/src/frontend/src/router/index.ts b/src/frontend/src/router/index.ts index b492311..093c7b5 100644 --- a/src/frontend/src/router/index.ts +++ b/src/frontend/src/router/index.ts @@ -1,21 +1,21 @@ -import Vue from 'vue' -import Router from 'vue-router' -import ModTable from '@/components/ModTable.vue' -import PackTable from '@/components/PackTable.vue' +import Vue from 'vue'; +import Router from 'vue-router'; +import ModTable from '@/components/ModTable.vue'; +import PackTable from '@/components/PackTable.vue'; -Vue.use(Router) +Vue.use(Router); export default new Router({ routes: [ { path: '/mods', name: 'Mods', - component: ModTable + component: ModTable, }, { path: '/packs', name: 'Packs', - component: PackTable - } - ] -}) + component: PackTable, + }, + ], +}); diff --git a/src/frontend/src/shims-tsx.d.ts b/src/frontend/src/shims-tsx.d.ts index f92b1fd..70111e9 100644 --- a/src/frontend/src/shims-tsx.d.ts +++ b/src/frontend/src/shims-tsx.d.ts @@ -1,13 +1,14 @@ +/* eslint-disable */ import Vue, { VNode } from 'vue'; declare global { - namespace JSX { - // tslint:disable no-empty-interface - interface Element extends VNode {} - // tslint:disable no-empty-interface - interface ElementClass extends Vue {} - interface IntrinsicElements { - [elem: string]: any; - } - } + namespace JSX { + // tslint:disable no-empty-interface + interface Element extends VNode {} + // tslint:disable no-empty-interface + interface ElementClass extends Vue {} + interface IntrinsicElements { + [elem: string]: any; + } + } } diff --git a/src/frontend/src/shims-vue.d.ts b/src/frontend/src/shims-vue.d.ts index 2abdb13..6cd55d9 100644 --- a/src/frontend/src/shims-vue.d.ts +++ b/src/frontend/src/shims-vue.d.ts @@ -1,6 +1,7 @@ +/* eslint-disable */ declare module '*.vue' { - import Vue from 'vue'; - export default Vue; + import Vue from 'vue'; + export default Vue; } declare module 'vuetify-upload-button' { diff --git a/src/frontend/src/shims-vuetify.ts b/src/frontend/src/shims-vuetify.ts new file mode 100644 index 0000000..0e5eb06 --- /dev/null +++ b/src/frontend/src/shims-vuetify.ts @@ -0,0 +1,2174 @@ +/* eslint-disable */ +import Vue from 'vue'; +import { PropValidator } from 'vue/types/options'; + +Vue.component('v-app', { + props: { + dark: Boolean, + id: String, + light: Boolean, + }, +}); +Vue.component('v-alert', { + props: { + color: String, + dismissible: Boolean, + icon: String, + mode: String, + origin: String, + outline: Boolean, + transition: String, + type: String, + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-autocomplete', { + props: { + allowOverflow: Boolean, + appendIcon: String, + appendIconCb: Function, + appendOuterIcon: String, + appendOuterIconCb: Function, + attach: (null as any) as PropValidator, + autoSelectFirst: Boolean, + autofocus: Boolean, + backgroundColor: String, + box: Boolean, + browserAutocomplete: String, + cacheItems: Boolean, + chips: Boolean, + clearIcon: String, + clearIconCb: Function, + clearable: Boolean, + color: String, + counter: [Boolean, Number, String], + dark: Boolean, + deletableChips: Boolean, + dense: Boolean, + disabled: Boolean, + dontFillMaskBlanks: Boolean, + error: Boolean, + errorCount: [Number, String], + errorMessages: [String, Array], + filter: Function, + flat: Boolean, + fullWidth: Boolean, + height: [Number, String], + hideDetails: Boolean, + hideNoData: Boolean, + hideSelected: Boolean, + hint: String, + itemAvatar: [String, Array, Function], + itemDisabled: [String, Array, Function], + itemText: [String, Array, Function], + itemValue: [String, Array, Function], + items: Array, + label: String, + light: Boolean, + loading: [Boolean, String], + mask: [Object, String], + menuProps: [String, Array, Object], + messages: [String, Array], + multiple: Boolean, + noDataText: String, + noFilter: Boolean, + openOnClear: Boolean, + outline: Boolean, + persistentHint: Boolean, + placeholder: String, + prefix: String, + prependIcon: String, + prependIconCb: Function, + prependInnerIcon: String, + prependInnerIconCb: Function, + readonly: Boolean, + returnMaskedValue: Boolean, + returnObject: Boolean, + reverse: Boolean, + rules: Array, + searchInput: (null as any) as PropValidator, + singleLine: Boolean, + smallChips: Boolean, + solo: Boolean, + soloInverted: Boolean, + success: Boolean, + successMessages: [String, Array], + suffix: String, + type: String, + validateOnBlur: Boolean, + value: (null as any) as PropValidator, + valueComparator: Function, + }, +}); +Vue.component('v-avatar', { + props: { + color: String, + size: [Number, String], + tile: Boolean, + }, +}); +Vue.component('v-badge', { + props: { + bottom: Boolean, + color: String, + left: Boolean, + mode: String, + origin: String, + overlap: Boolean, + transition: String, + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-bottom-nav', { + props: { + absolute: Boolean, + active: [Number, String], + app: Boolean, + color: String, + dark: Boolean, + fixed: Boolean, + height: [Number, String], + light: Boolean, + mandatory: Boolean, + shift: Boolean, + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-bottom-sheet', { + props: { + disabled: Boolean, + fullWidth: Boolean, + hideOverlay: Boolean, + inset: Boolean, + lazy: Boolean, + maxWidth: [String, Number], + persistent: Boolean, + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-breadcrumbs', { + props: { + dark: Boolean, + divider: String, + items: Array, + justifyCenter: Boolean, + justifyEnd: Boolean, + large: Boolean, + light: Boolean, + }, +}); +Vue.component('v-breadcrumbs-item', { + props: { + activeClass: String, + append: Boolean, + disabled: Boolean, + exact: Boolean, + exactActiveClass: String, + href: [String, Object], + nuxt: Boolean, + replace: Boolean, + ripple: [Boolean, Object], + tag: String, + target: String, + to: [String, Object], + }, +}); +Vue.component('v-breadcrumbs-divider', {}); +Vue.component('v-btn', { + props: { + absolute: Boolean, + activeClass: String, + append: Boolean, + block: Boolean, + bottom: Boolean, + color: String, + dark: Boolean, + depressed: Boolean, + disabled: Boolean, + exact: Boolean, + exactActiveClass: String, + fab: Boolean, + fixed: Boolean, + flat: Boolean, + href: [String, Object], + icon: Boolean, + inputValue: (null as any) as PropValidator, + large: Boolean, + left: Boolean, + light: Boolean, + loading: Boolean, + nuxt: Boolean, + outline: Boolean, + replace: Boolean, + right: Boolean, + ripple: [Boolean, Object], + round: Boolean, + small: Boolean, + tag: String, + target: String, + to: [String, Object], + top: Boolean, + type: String, + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-btn-toggle', { + props: { + activeClass: String, + dark: Boolean, + light: Boolean, + mandatory: Boolean, + max: [Number, String], + multiple: Boolean, + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-card', { + props: { + activeClass: String, + append: Boolean, + color: String, + dark: Boolean, + disabled: Boolean, + elevation: [Number, String], + exact: Boolean, + exactActiveClass: String, + flat: Boolean, + height: [Number, String], + hover: Boolean, + href: [String, Object], + img: String, + light: Boolean, + maxHeight: [Number, String], + maxWidth: [Number, String], + minHeight: [Number, String], + minWidth: [Number, String], + nuxt: Boolean, + raised: Boolean, + replace: Boolean, + ripple: [Boolean, Object], + tag: String, + target: String, + tile: Boolean, + to: [String, Object], + width: [Number, String], + }, +}); +Vue.component('v-card-media', { + props: { + alt: String, + aspectRatio: [String, Number], + contain: Boolean, + gradient: String, + height: [Number, String], + lazySrc: String, + maxHeight: [Number, String], + maxWidth: [Number, String], + minHeight: [Number, String], + minWidth: [Number, String], + position: String, + sizes: String, + src: [String, Object], + srcset: String, + transition: [Boolean, String], + width: [Number, String], + }, +}); +Vue.component('v-card-title', { + props: { + primaryTitle: Boolean, + }, +}); +Vue.component('v-card-actions', {}); +Vue.component('v-card-text', {}); +Vue.component('v-carousel', { + props: { + activeClass: String, + cycle: Boolean, + dark: Boolean, + delimiterIcon: String, + height: [Number, String], + hideControls: Boolean, + hideDelimiters: Boolean, + interval: [Number, String], + light: Boolean, + mandatory: Boolean, + max: [Number, String], + multiple: Boolean, + nextIcon: [Boolean, String], + prevIcon: [Boolean, String], + reverse: Boolean, + touch: Object, + touchless: Boolean, + value: (null as any) as PropValidator, + vertical: Boolean, + }, +}); +Vue.component('v-carousel-item', { + props: { + activeClass: String, + disabled: Boolean, + lazy: Boolean, + reverseTransition: [Boolean, String], + transition: [Boolean, String], + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-checkbox', { + props: { + appendIcon: String, + appendIconCb: Function, + backgroundColor: String, + color: String, + dark: Boolean, + disabled: Boolean, + error: Boolean, + errorCount: [Number, String], + errorMessages: [String, Array], + falseValue: (null as any) as PropValidator, + height: [Number, String], + hideDetails: Boolean, + hint: String, + id: String, + indeterminate: Boolean, + indeterminateIcon: String, + inputValue: (null as any) as PropValidator, + label: String, + light: Boolean, + loading: Boolean, + messages: [String, Array], + multiple: Boolean, + offIcon: String, + onIcon: String, + persistentHint: Boolean, + prependIcon: String, + prependIconCb: Function, + readonly: Boolean, + ripple: [Boolean, Object], + rules: Array, + success: Boolean, + successMessages: [String, Array], + trueValue: (null as any) as PropValidator, + validateOnBlur: Boolean, + value: (null as any) as PropValidator, + valueComparator: Function, + }, +}); +Vue.component('v-chip', { + props: { + close: Boolean, + color: String, + dark: Boolean, + disabled: Boolean, + label: Boolean, + light: Boolean, + outline: Boolean, + selected: Boolean, + small: Boolean, + textColor: String, + value: Boolean, + }, +}); +Vue.component('v-combobox', { + props: { + allowOverflow: Boolean, + appendIcon: String, + appendIconCb: Function, + appendOuterIcon: String, + appendOuterIconCb: Function, + attach: (null as any) as PropValidator, + autoSelectFirst: Boolean, + autofocus: Boolean, + backgroundColor: String, + box: Boolean, + browserAutocomplete: String, + cacheItems: Boolean, + chips: Boolean, + clearIcon: String, + clearIconCb: Function, + clearable: Boolean, + color: String, + counter: [Boolean, Number, String], + dark: Boolean, + deletableChips: Boolean, + delimiters: Array, + dense: Boolean, + disabled: Boolean, + dontFillMaskBlanks: Boolean, + error: Boolean, + errorCount: [Number, String], + errorMessages: [String, Array], + filter: Function, + flat: Boolean, + fullWidth: Boolean, + height: [Number, String], + hideDetails: Boolean, + hideNoData: Boolean, + hideSelected: Boolean, + hint: String, + itemAvatar: [String, Array, Function], + itemDisabled: [String, Array, Function], + itemText: [String, Array, Function], + itemValue: [String, Array, Function], + items: Array, + label: String, + light: Boolean, + loading: [Boolean, String], + mask: [Object, String], + menuProps: [String, Array, Object], + messages: [String, Array], + multiple: Boolean, + noDataText: String, + noFilter: Boolean, + openOnClear: Boolean, + outline: Boolean, + persistentHint: Boolean, + placeholder: String, + prefix: String, + prependIcon: String, + prependIconCb: Function, + prependInnerIcon: String, + prependInnerIconCb: Function, + readonly: Boolean, + returnMaskedValue: Boolean, + returnObject: Boolean, + reverse: Boolean, + rules: Array, + searchInput: (null as any) as PropValidator, + singleLine: Boolean, + smallChips: Boolean, + solo: Boolean, + soloInverted: Boolean, + success: Boolean, + successMessages: [String, Array], + suffix: String, + type: String, + validateOnBlur: Boolean, + value: (null as any) as PropValidator, + valueComparator: Function, + }, +}); +Vue.component('v-counter', { + props: { + dark: Boolean, + light: Boolean, + max: [Number, String], + value: [Number, String], + }, +}); +Vue.component('v-data-iterator', { + props: { + contentClass: String, + contentProps: Object, + contentTag: String, + customFilter: Function, + customSort: Function, + dark: Boolean, + disableInitialSort: Boolean, + expand: Boolean, + filter: Function, + hideActions: Boolean, + itemKey: String, + items: Array, + light: Boolean, + loading: [Boolean, String], + mustSort: Boolean, + nextIcon: String, + noDataText: String, + noResultsText: String, + pagination: Object, + prevIcon: String, + rowsPerPageItems: Array, + rowsPerPageText: String, + search: (null as any) as PropValidator, + selectAll: [Boolean, String], + totalItems: Number, + value: Array, + }, +}); +Vue.component('v-data-table', { + props: { + customFilter: Function, + customSort: Function, + dark: Boolean, + disableInitialSort: Boolean, + expand: Boolean, + filter: Function, + headerKey: String, + headerText: String, + headers: Array, + headersLength: Number, + hideActions: Boolean, + hideHeaders: Boolean, + itemKey: String, + items: Array, + light: Boolean, + loading: [Boolean, String], + mustSort: Boolean, + nextIcon: String, + noDataText: String, + noResultsText: String, + pagination: Object, + prevIcon: String, + rowsPerPageItems: Array, + rowsPerPageText: String, + search: (null as any) as PropValidator, + selectAll: [Boolean, String], + sortIcon: String, + totalItems: Number, + value: Array, + }, +}); +Vue.component('v-edit-dialog', { + props: { + cancelText: (null as any) as PropValidator, + dark: Boolean, + large: Boolean, + lazy: Boolean, + light: Boolean, + persistent: Boolean, + returnValue: (null as any) as PropValidator, + saveText: (null as any) as PropValidator, + transition: String, + }, +}); +Vue.component('v-table-overflow', {}); +Vue.component('v-date-picker', { + props: { + allowedDates: Function, + color: String, + dark: Boolean, + dayFormat: Function, + disabled: Boolean, + eventColor: [Array, Function, Object, String], + events: [Array, Function, Object], + firstDayOfWeek: [String, Number], + fullWidth: Boolean, + headerColor: String, + headerDateFormat: Function, + landscape: Boolean, + light: Boolean, + locale: String, + max: String, + min: String, + monthFormat: Function, + multiple: Boolean, + nextIcon: String, + noTitle: Boolean, + pickerDate: String, + prevIcon: String, + reactive: Boolean, + readonly: Boolean, + scrollable: Boolean, + showCurrent: [Boolean, String], + showWeek: Boolean, + titleDateFormat: Function, + type: String, + value: [Array, String], + weekdayFormat: Function, + width: [Number, String], + yearFormat: Function, + yearIcon: String, + }, +}); +Vue.component('v-date-picker-title', { + props: { + color: String, + date: String, + disabled: Boolean, + readonly: Boolean, + selectingYear: Boolean, + value: String, + year: [Number, String], + yearIcon: String, + }, +}); +Vue.component('v-date-picker-header', { + props: { + color: String, + dark: Boolean, + disabled: Boolean, + format: Function, + light: Boolean, + locale: String, + max: String, + min: String, + nextIcon: String, + prevIcon: String, + readonly: Boolean, + value: [Number, String], + }, +}); +Vue.component('v-date-picker-date-table', { + props: { + allowedDates: Function, + color: String, + current: String, + dark: Boolean, + disabled: Boolean, + eventColor: [Array, Function, Object, String], + events: [Array, Function, Object], + firstDayOfWeek: [String, Number], + format: Function, + light: Boolean, + locale: String, + max: String, + min: String, + readonly: Boolean, + scrollable: Boolean, + showWeek: Boolean, + tableDate: String, + value: [String, Array], + weekdayFormat: Function, + }, +}); +Vue.component('v-date-picker-month-table', { + props: { + allowedDates: Function, + color: String, + current: String, + dark: Boolean, + disabled: Boolean, + eventColor: [Array, Function, Object, String], + events: [Array, Function, Object], + format: Function, + light: Boolean, + locale: String, + max: String, + min: String, + readonly: Boolean, + scrollable: Boolean, + tableDate: String, + value: [String, Array], + }, +}); +Vue.component('v-date-picker-years', { + props: { + color: String, + format: Function, + locale: String, + max: [Number, String], + min: [Number, String], + readonly: Boolean, + value: [Number, String], + }, +}); +Vue.component('v-dialog', { + props: { + attach: (null as any) as PropValidator, + contentClass: (null as any) as PropValidator, + dark: Boolean, + disabled: Boolean, + fullWidth: Boolean, + fullscreen: Boolean, + hideOverlay: Boolean, + lazy: Boolean, + light: Boolean, + maxWidth: [String, Number], + noClickAnimation: Boolean, + origin: String, + persistent: Boolean, + returnValue: (null as any) as PropValidator, + scrollable: Boolean, + transition: [String, Boolean], + value: (null as any) as PropValidator, + width: [String, Number], + }, +}); +Vue.component('v-divider', { + props: { + dark: Boolean, + inset: Boolean, + light: Boolean, + vertical: Boolean, + }, +}); +Vue.component('v-expansion-panel', { + props: { + dark: Boolean, + disabled: Boolean, + expand: Boolean, + focusable: Boolean, + inset: Boolean, + light: Boolean, + popout: Boolean, + readonly: Boolean, + value: [Number, Array], + }, +}); +Vue.component('v-expansion-panel-content', { + props: { + disabled: Boolean, + expandIcon: String, + hideActions: Boolean, + lazy: Boolean, + readonly: Boolean, + ripple: [Boolean, Object], + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-footer', { + props: { + absolute: Boolean, + app: Boolean, + color: String, + dark: Boolean, + fixed: Boolean, + height: [Number, String], + inset: Boolean, + light: Boolean, + }, +}); +Vue.component('v-form', { + props: { + lazyValidation: Boolean, + value: Boolean, + }, +}); +Vue.component('v-container', { + props: { + alignBaseline: Boolean, + alignCenter: Boolean, + alignContentCenter: Boolean, + alignContentEnd: Boolean, + alignContentSpaceAround: Boolean, + alignContentSpaceBetween: Boolean, + alignContentStart: Boolean, + alignEnd: Boolean, + alignStart: Boolean, + 'd-{type}': Boolean, + fillHeight: Boolean, + fluid: Boolean, + 'grid-list-{xs through xl}': Boolean, + id: String, + justifyCenter: Boolean, + justifyEnd: Boolean, + justifySpaceAround: Boolean, + justifySpaceBetween: Boolean, + justifyStart: Boolean, + tag: String, + }, +}); +Vue.component('v-content', { + props: { + tag: String, + }, +}); +Vue.component('v-flex', { + props: { + '(size)(1-12)': Boolean, + alignSelfBaseline: Boolean, + alignSelfCenter: Boolean, + alignSelfEnd: Boolean, + alignSelfStart: Boolean, + grow: Boolean, + id: String, + 'offset-(size)(0-12)': Boolean, + 'order-(size)(1-12)': Boolean, + shrink: Boolean, + tag: String, + }, +}); +Vue.component('v-layout', { + props: { + alignBaseline: Boolean, + alignCenter: Boolean, + alignContentCenter: Boolean, + alignContentEnd: Boolean, + alignContentSpaceAround: Boolean, + alignContentSpaceBetween: Boolean, + alignContentStart: Boolean, + alignEnd: Boolean, + alignStart: Boolean, + column: Boolean, + 'd-{type}': Boolean, + fillHeight: Boolean, + id: String, + justifyCenter: Boolean, + justifyEnd: Boolean, + justifySpaceAround: Boolean, + justifySpaceBetween: Boolean, + justifyStart: Boolean, + reverse: Boolean, + row: Boolean, + tag: String, + wrap: Boolean, + }, +}); +Vue.component('v-spacer', {}); +Vue.component('v-hover', { + props: { + closeDelay: [Number, String], + disabled: Boolean, + openDelay: [Number, String], + value: Boolean, + }, +}); +Vue.component('v-icon', { + props: { + color: String, + dark: Boolean, + disabled: Boolean, + large: Boolean, + left: Boolean, + light: Boolean, + medium: Boolean, + right: Boolean, + size: [Number, String], + small: Boolean, + xLarge: Boolean, + }, +}); +Vue.component('v-img', { + props: { + alt: String, + aspectRatio: [String, Number], + contain: Boolean, + gradient: String, + height: [Number, String], + lazySrc: String, + maxHeight: [Number, String], + maxWidth: [Number, String], + minHeight: [Number, String], + minWidth: [Number, String], + position: String, + sizes: String, + src: [String, Object], + srcset: String, + transition: [Boolean, String], + width: [Number, String], + }, +}); +Vue.component('v-input', { + props: { + appendIcon: String, + appendIconCb: Function, + backgroundColor: String, + color: String, + dark: Boolean, + disabled: Boolean, + error: Boolean, + errorCount: [Number, String], + errorMessages: [String, Array], + height: [Number, String], + hideDetails: Boolean, + hint: String, + label: String, + light: Boolean, + loading: Boolean, + messages: [String, Array], + persistentHint: Boolean, + prependIcon: String, + prependIconCb: Function, + readonly: Boolean, + rules: Array, + success: Boolean, + successMessages: [String, Array], + validateOnBlur: Boolean, + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-item', { + props: { + activeClass: String, + disabled: Boolean, + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-item-group', { + props: { + activeClass: String, + dark: Boolean, + light: Boolean, + mandatory: Boolean, + max: [Number, String], + multiple: Boolean, + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-jumbotron', { + props: { + activeClass: String, + append: Boolean, + color: String, + dark: Boolean, + disabled: Boolean, + exact: Boolean, + exactActiveClass: String, + gradient: String, + height: [Number, String], + href: [String, Object], + light: Boolean, + nuxt: Boolean, + replace: Boolean, + ripple: [Boolean, Object], + src: String, + tag: String, + target: String, + to: [String, Object], + }, +}); +Vue.component('v-label', { + props: { + absolute: Boolean, + color: [Boolean, String], + dark: Boolean, + disabled: Boolean, + focused: Boolean, + for: String, + left: [Number, String], + light: Boolean, + right: [Number, String], + value: Boolean, + }, +}); +Vue.component('v-list', { + props: { + dark: Boolean, + dense: Boolean, + expand: Boolean, + light: Boolean, + subheader: Boolean, + threeLine: Boolean, + twoLine: Boolean, + }, +}); +Vue.component('v-list-group', { + props: { + activeClass: String, + appendIcon: String, + disabled: Boolean, + group: String, + lazy: Boolean, + noAction: Boolean, + prependIcon: String, + subGroup: Boolean, + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-list-tile', { + props: { + activeClass: String, + append: Boolean, + avatar: Boolean, + color: String, + dark: Boolean, + disabled: Boolean, + exact: Boolean, + exactActiveClass: String, + href: [String, Object], + inactive: Boolean, + light: Boolean, + nuxt: Boolean, + replace: Boolean, + ripple: [Boolean, Object], + tag: String, + target: String, + to: [String, Object], + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-list-tile-action', {}); +Vue.component('v-list-tile-avatar', { + props: { + color: String, + size: [Number, String], + tile: Boolean, + }, +}); +Vue.component('v-list-tile-action-text', {}); +Vue.component('v-list-tile-content', {}); +Vue.component('v-list-tile-title', {}); +Vue.component('v-list-tile-sub-title', {}); +Vue.component('v-menu', { + props: { + absolute: Boolean, + activator: (null as any) as PropValidator, + allowOverflow: Boolean, + attach: (null as any) as PropValidator, + auto: Boolean, + bottom: Boolean, + closeDelay: [Number, String], + closeOnClick: Boolean, + closeOnContentClick: Boolean, + contentClass: (null as any) as PropValidator, + dark: Boolean, + disableKeys: Boolean, + disabled: Boolean, + fixed: Boolean, + fullWidth: Boolean, + inputActivator: Boolean, + lazy: Boolean, + left: Boolean, + light: Boolean, + maxHeight: (null as any) as PropValidator, + maxWidth: [Number, String], + minWidth: [Number, String], + nudgeBottom: [Number, String], + nudgeLeft: [Number, String], + nudgeRight: [Number, String], + nudgeTop: [Number, String], + nudgeWidth: [Number, String], + offsetOverflow: Boolean, + offsetX: Boolean, + offsetY: Boolean, + openDelay: [Number, String], + openOnClick: Boolean, + openOnHover: Boolean, + origin: String, + positionX: Number, + positionY: Number, + returnValue: (null as any) as PropValidator, + right: Boolean, + top: Boolean, + transition: [Boolean, String], + value: (null as any) as PropValidator, + zIndex: [Number, String], + }, +}); +Vue.component('v-messages', { + props: { + color: String, + dark: Boolean, + light: Boolean, + value: Array, + }, +}); +Vue.component('v-navigation-drawer', { + props: { + absolute: Boolean, + app: Boolean, + clipped: Boolean, + dark: Boolean, + disableResizeWatcher: Boolean, + disableRouteWatcher: Boolean, + fixed: Boolean, + floating: Boolean, + height: [Number, String], + hideOverlay: Boolean, + light: Boolean, + miniVariant: Boolean, + miniVariantWidth: [Number, String], + mobileBreakPoint: [Number, String], + permanent: Boolean, + right: Boolean, + stateless: Boolean, + temporary: Boolean, + touchless: Boolean, + value: (null as any) as PropValidator, + width: [Number, String], + }, +}); +Vue.component('v-overflow-btn', { + props: { + allowOverflow: Boolean, + appendIcon: String, + appendIconCb: Function, + appendOuterIcon: String, + appendOuterIconCb: Function, + attach: (null as any) as PropValidator, + autoSelectFirst: Boolean, + autofocus: Boolean, + backgroundColor: String, + box: Boolean, + browserAutocomplete: String, + cacheItems: Boolean, + chips: Boolean, + clearIcon: String, + clearIconCb: Function, + clearable: Boolean, + color: String, + counter: [Boolean, Number, String], + dark: Boolean, + deletableChips: Boolean, + dense: Boolean, + disabled: Boolean, + dontFillMaskBlanks: Boolean, + editable: Boolean, + error: Boolean, + errorCount: [Number, String], + errorMessages: [String, Array], + filter: Function, + flat: Boolean, + fullWidth: Boolean, + height: [Number, String], + hideDetails: Boolean, + hideNoData: Boolean, + hideSelected: Boolean, + hint: String, + itemAvatar: [String, Array, Function], + itemDisabled: [String, Array, Function], + itemText: [String, Array, Function], + itemValue: [String, Array, Function], + items: Array, + label: String, + light: Boolean, + loading: [Boolean, String], + mask: [Object, String], + menuProps: [String, Array, Object], + messages: [String, Array], + multiple: Boolean, + noDataText: String, + noFilter: Boolean, + openOnClear: Boolean, + outline: Boolean, + persistentHint: Boolean, + placeholder: String, + prefix: String, + prependIcon: String, + prependIconCb: Function, + prependInnerIcon: String, + prependInnerIconCb: Function, + readonly: Boolean, + returnMaskedValue: Boolean, + returnObject: Boolean, + reverse: Boolean, + rules: Array, + searchInput: (null as any) as PropValidator, + segmented: Boolean, + singleLine: Boolean, + smallChips: Boolean, + solo: Boolean, + soloInverted: Boolean, + success: Boolean, + successMessages: [String, Array], + suffix: String, + transition: (null as any) as PropValidator, + type: String, + validateOnBlur: Boolean, + value: (null as any) as PropValidator, + valueComparator: Function, + }, +}); +Vue.component('v-pagination', { + props: { + circle: Boolean, + color: String, + dark: Boolean, + disabled: Boolean, + length: Number, + light: Boolean, + nextIcon: String, + prevIcon: String, + totalVisible: [Number, String], + value: Number, + }, +}); +Vue.component('v-sheet', { + props: { + color: String, + dark: Boolean, + elevation: [Number, String], + height: [Number, String], + light: Boolean, + maxHeight: [Number, String], + maxWidth: [Number, String], + minHeight: [Number, String], + minWidth: [Number, String], + tag: String, + tile: Boolean, + width: [Number, String], + }, +}); +Vue.component('v-parallax', { + props: { + alt: String, + height: [String, Number], + src: String, + }, +}); +Vue.component('v-picker', { + props: { + color: String, + dark: Boolean, + fullWidth: Boolean, + landscape: Boolean, + light: Boolean, + transition: String, + width: [Number, String], + }, +}); +Vue.component('v-progress-circular', { + props: { + button: Boolean, + color: String, + indeterminate: Boolean, + rotate: [Number, String], + size: [Number, String], + value: [Number, String], + width: [Number, String], + }, +}); +Vue.component('v-progress-linear', { + props: { + active: Boolean, + backgroundColor: String, + backgroundOpacity: [Number, String], + bufferValue: [Number, String], + color: String, + height: [Number, String], + indeterminate: Boolean, + query: Boolean, + value: [Number, String], + }, +}); +Vue.component('v-radio-group', { + props: { + appendIcon: String, + appendIconCb: Function, + backgroundColor: String, + color: String, + column: Boolean, + dark: Boolean, + disabled: Boolean, + error: Boolean, + errorCount: [Number, String], + errorMessages: [String, Array], + height: [Number, String], + hideDetails: Boolean, + hint: String, + label: String, + light: Boolean, + loading: Boolean, + mandatory: Boolean, + messages: [String, Array], + name: String, + persistentHint: Boolean, + prependIcon: String, + prependIconCb: Function, + readonly: Boolean, + row: Boolean, + rules: Array, + success: Boolean, + successMessages: [String, Array], + validateOnBlur: Boolean, + value: (null as any) as PropValidator, + valueComparator: Function, + }, +}); +Vue.component('v-radio', { + props: { + color: String, + dark: Boolean, + disabled: Boolean, + label: String, + light: Boolean, + offIcon: String, + onIcon: String, + readonly: Boolean, + ripple: [Boolean, Object], + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-range-slider', { + props: { + alwaysDirty: Boolean, + appendIcon: String, + appendIconCb: Function, + backgroundColor: String, + color: String, + dark: Boolean, + disabled: Boolean, + error: Boolean, + errorCount: [Number, String], + errorMessages: [String, Array], + height: [Number, String], + hideDetails: Boolean, + hint: String, + inverseLabel: Boolean, + label: String, + light: Boolean, + loading: [Boolean, String], + max: [Number, String], + messages: [String, Array], + min: [Number, String], + persistentHint: Boolean, + prependIcon: String, + prependIconCb: Function, + readonly: Boolean, + rules: Array, + step: [Number, String], + success: Boolean, + successMessages: [String, Array], + thumbColor: String, + thumbLabel: [Boolean, String], + thumbSize: [Number, String], + tickLabels: Array, + tickSize: [Number, String], + ticks: [Boolean, String], + trackColor: String, + validateOnBlur: Boolean, + value: Array, + }, +}); +Vue.component('v-rating', { + props: { + backgroundColor: String, + clearable: Boolean, + closeDelay: [Number, String], + color: String, + dark: Boolean, + dense: Boolean, + emptyIcon: String, + fullIcon: String, + halfIcon: String, + halfIncrements: Boolean, + hover: Boolean, + large: Boolean, + length: [Number, String], + light: Boolean, + medium: Boolean, + openDelay: [Number, String], + readonly: Boolean, + ripple: [Boolean, Object], + size: [Number, String], + small: Boolean, + value: Number, + xLarge: Boolean, + }, +}); +Vue.component('v-responsive', { + props: { + aspectRatio: [String, Number], + height: [Number, String], + maxHeight: [Number, String], + maxWidth: [Number, String], + minHeight: [Number, String], + minWidth: [Number, String], + width: [Number, String], + }, +}); +Vue.component('v-select', { + props: { + appendIcon: String, + appendIconCb: Function, + appendOuterIcon: String, + appendOuterIconCb: Function, + attach: (null as any) as PropValidator, + autofocus: Boolean, + backgroundColor: String, + box: Boolean, + browserAutocomplete: String, + cacheItems: Boolean, + chips: Boolean, + clearIcon: String, + clearIconCb: Function, + clearable: Boolean, + color: String, + counter: [Boolean, Number, String], + dark: Boolean, + deletableChips: Boolean, + dense: Boolean, + disabled: Boolean, + dontFillMaskBlanks: Boolean, + error: Boolean, + errorCount: [Number, String], + errorMessages: [String, Array], + filter: (null as any) as PropValidator, + flat: Boolean, + fullWidth: Boolean, + height: [Number, String], + hideDetails: Boolean, + hideSelected: Boolean, + hint: String, + itemAvatar: [String, Array, Function], + itemDisabled: [String, Array, Function], + itemText: [String, Array, Function], + itemValue: [String, Array, Function], + items: Array, + label: String, + light: Boolean, + loading: [Boolean, String], + mask: [Object, String], + menuProps: [String, Array, Object], + messages: [String, Array], + multiple: Boolean, + noDataText: String, + openOnClear: Boolean, + outline: Boolean, + persistentHint: Boolean, + placeholder: String, + prefix: String, + prependIcon: String, + prependIconCb: Function, + prependInnerIcon: String, + prependInnerIconCb: Function, + readonly: Boolean, + returnMaskedValue: Boolean, + returnObject: Boolean, + reverse: Boolean, + rules: Array, + searchInput: (null as any) as PropValidator, + singleLine: Boolean, + smallChips: Boolean, + solo: Boolean, + soloInverted: Boolean, + success: Boolean, + successMessages: [String, Array], + suffix: String, + type: String, + validateOnBlur: Boolean, + value: (null as any) as PropValidator, + valueComparator: Function, + }, +}); +Vue.component('v-slider', { + props: { + alwaysDirty: Boolean, + appendIcon: String, + appendIconCb: Function, + backgroundColor: String, + color: String, + dark: Boolean, + disabled: Boolean, + error: Boolean, + errorCount: [Number, String], + errorMessages: [String, Array], + height: [Number, String], + hideDetails: Boolean, + hint: String, + inverseLabel: Boolean, + label: String, + light: Boolean, + loading: [Boolean, String], + max: [Number, String], + messages: [String, Array], + min: [Number, String], + persistentHint: Boolean, + prependIcon: String, + prependIconCb: Function, + readonly: Boolean, + rules: Array, + step: [Number, String], + success: Boolean, + successMessages: [String, Array], + thumbColor: String, + thumbLabel: [Boolean, String], + thumbSize: [Number, String], + tickLabels: Array, + tickSize: [Number, String], + ticks: [Boolean, String], + trackColor: String, + validateOnBlur: Boolean, + value: [Number, String], + }, +}); +Vue.component('v-snackbar', { + props: { + absolute: Boolean, + autoHeight: Boolean, + bottom: Boolean, + color: String, + left: Boolean, + multiLine: Boolean, + right: Boolean, + timeout: Number, + top: Boolean, + value: (null as any) as PropValidator, + vertical: Boolean, + }, +}); +Vue.component('v-sparkline', { + props: { + autoDraw: Boolean, + autoDrawDuration: Number, + autoDrawEasing: String, + data: Array, + gradient: Array, + gradientDirection: String, + height: Number, + lineWidth: Number, + padding: Number, + showLabel: Boolean, + smooth: [Boolean, Number], + width: Number, + }, +}); +Vue.component('v-speed-dial', { + props: { + absolute: Boolean, + bottom: Boolean, + direction: String, + fixed: Boolean, + left: Boolean, + mode: String, + openOnHover: Boolean, + origin: String, + right: Boolean, + top: Boolean, + transition: String, + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-stepper', { + props: { + altLabels: Boolean, + dark: Boolean, + light: Boolean, + nonLinear: Boolean, + value: [Number, String], + vertical: Boolean, + }, +}); +Vue.component('v-stepper-content', { + props: { + step: [Number, String], + }, +}); +Vue.component('v-stepper-step', { + props: { + color: String, + complete: Boolean, + completeIcon: String, + editIcon: String, + editable: Boolean, + errorIcon: String, + rules: Array, + step: [Number, String], + }, +}); +Vue.component('v-stepper-header', {}); +Vue.component('v-stepper-items', {}); +Vue.component('v-subheader', { + props: { + dark: Boolean, + inset: Boolean, + light: Boolean, + }, +}); +Vue.component('v-switch', { + props: { + appendIcon: String, + appendIconCb: Function, + backgroundColor: String, + color: String, + dark: Boolean, + disabled: Boolean, + error: Boolean, + errorCount: [Number, String], + errorMessages: [String, Array], + falseValue: (null as any) as PropValidator, + height: [Number, String], + hideDetails: Boolean, + hint: String, + id: String, + inputValue: (null as any) as PropValidator, + label: String, + light: Boolean, + loading: [Boolean, String], + messages: [String, Array], + multiple: Boolean, + persistentHint: Boolean, + prependIcon: String, + prependIconCb: Function, + readonly: Boolean, + ripple: [Boolean, Object], + rules: Array, + success: Boolean, + successMessages: [String, Array], + trueValue: (null as any) as PropValidator, + validateOnBlur: Boolean, + value: (null as any) as PropValidator, + valueComparator: Function, + }, +}); +Vue.component('v-system-bar', { + props: { + absolute: Boolean, + app: Boolean, + color: String, + dark: Boolean, + fixed: Boolean, + height: [Number, String], + light: Boolean, + lightsOut: Boolean, + status: Boolean, + window: Boolean, + }, +}); +Vue.component('v-tabs', { + props: { + activeClass: String, + alignWithTitle: Boolean, + centered: Boolean, + color: String, + dark: Boolean, + fixedTabs: Boolean, + grow: Boolean, + height: [Number, String], + hideSlider: Boolean, + iconsAndText: Boolean, + light: Boolean, + mandatory: Boolean, + max: [Number, String], + mobileBreakPoint: [Number, String], + multiple: Boolean, + nextIcon: String, + prevIcon: String, + right: Boolean, + showArrows: Boolean, + sliderColor: String, + value: [Number, String], + }, +}); +Vue.component('v-tab', { + props: { + activeClass: String, + append: Boolean, + dark: Boolean, + disabled: Boolean, + exact: Boolean, + exactActiveClass: String, + href: [String, Object], + light: Boolean, + nuxt: Boolean, + replace: Boolean, + ripple: [Boolean, Object], + tag: String, + target: String, + to: [String, Object], + }, +}); +Vue.component('v-tab-item', { + props: { + activeClass: String, + disabled: Boolean, + id: String, + lazy: Boolean, + reverseTransition: [Boolean, String], + transition: [Boolean, String], + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-tabs-items', { + props: { + activeClass: String, + cycle: Boolean, + dark: Boolean, + light: Boolean, + mandatory: Boolean, + max: [Number, String], + multiple: Boolean, + reverse: Boolean, + touch: Object, + touchless: Boolean, + value: (null as any) as PropValidator, + vertical: Boolean, + }, +}); +Vue.component('v-tabs-slider', { + props: { + color: String, + }, +}); +Vue.component('v-textarea', { + props: { + appendIcon: String, + appendIconCb: Function, + appendOuterIcon: String, + appendOuterIconCb: Function, + autoGrow: Boolean, + autofocus: Boolean, + backgroundColor: String, + box: Boolean, + browserAutocomplete: String, + clearIcon: String, + clearIconCb: Function, + clearable: Boolean, + color: String, + counter: [Boolean, Number, String], + dark: Boolean, + disabled: Boolean, + dontFillMaskBlanks: Boolean, + error: Boolean, + errorCount: [Number, String], + errorMessages: [String, Array], + flat: Boolean, + fullWidth: Boolean, + height: [Number, String], + hideDetails: Boolean, + hint: String, + label: String, + light: Boolean, + loading: [Boolean, String], + mask: [Object, String], + messages: [String, Array], + noResize: Boolean, + outline: Boolean, + persistentHint: Boolean, + placeholder: String, + prefix: String, + prependIcon: String, + prependIconCb: Function, + prependInnerIcon: String, + prependInnerIconCb: Function, + readonly: Boolean, + returnMaskedValue: Boolean, + reverse: Boolean, + rowHeight: [Number, String], + rows: [Number, String], + rules: Array, + singleLine: Boolean, + solo: Boolean, + soloInverted: Boolean, + success: Boolean, + successMessages: [String, Array], + suffix: String, + type: String, + validateOnBlur: Boolean, + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-text-field', { + props: { + appendIcon: String, + appendIconCb: Function, + appendOuterIcon: String, + appendOuterIconCb: Function, + autofocus: Boolean, + backgroundColor: String, + box: Boolean, + browserAutocomplete: String, + clearIcon: String, + clearIconCb: Function, + clearable: Boolean, + color: String, + counter: [Boolean, Number, String], + dark: Boolean, + disabled: Boolean, + dontFillMaskBlanks: Boolean, + error: Boolean, + errorCount: [Number, String], + errorMessages: [String, Array], + flat: Boolean, + fullWidth: Boolean, + height: [Number, String], + hideDetails: Boolean, + hint: String, + label: String, + light: Boolean, + loading: [Boolean, String], + mask: [Object, String], + messages: [String, Array], + outline: Boolean, + persistentHint: Boolean, + placeholder: String, + prefix: String, + prependIcon: String, + prependIconCb: Function, + prependInnerIcon: String, + prependInnerIconCb: Function, + readonly: Boolean, + returnMaskedValue: Boolean, + reverse: Boolean, + rules: Array, + singleLine: Boolean, + solo: Boolean, + soloInverted: Boolean, + success: Boolean, + successMessages: [String, Array], + suffix: String, + type: String, + validateOnBlur: Boolean, + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-timeline', { + props: { + alignTop: Boolean, + dark: Boolean, + dense: Boolean, + light: Boolean, + }, +}); +Vue.component('v-timeline-item', { + props: { + color: String, + dark: Boolean, + fillDot: Boolean, + hideDot: Boolean, + icon: String, + iconColor: String, + large: Boolean, + left: Boolean, + light: Boolean, + right: Boolean, + small: Boolean, + }, +}); +Vue.component('v-time-picker', { + props: { + allowedHours: Function, + allowedMinutes: Function, + allowedSeconds: Function, + color: String, + dark: Boolean, + disabled: Boolean, + format: String, + fullWidth: Boolean, + headerColor: String, + landscape: Boolean, + light: Boolean, + max: String, + min: String, + noTitle: Boolean, + readonly: Boolean, + scrollable: Boolean, + useSeconds: Boolean, + value: (null as any) as PropValidator, + width: [Number, String], + }, +}); +Vue.component('v-time-picker-clock', { + props: { + allowedValues: Function, + color: String, + dark: Boolean, + disabled: Boolean, + double: Boolean, + format: Function, + light: Boolean, + max: Number, + min: Number, + readonly: Boolean, + rotate: Number, + scrollable: Boolean, + step: Number, + value: Number, + }, +}); +Vue.component('v-time-picker-title', { + props: { + ampm: Boolean, + color: String, + disabled: Boolean, + hour: Number, + minute: Number, + period: String, + readonly: Boolean, + second: Number, + selecting: Number, + useSeconds: Boolean, + }, +}); +Vue.component('v-toolbar', { + props: { + absolute: Boolean, + app: Boolean, + card: Boolean, + clippedLeft: Boolean, + clippedRight: Boolean, + color: String, + dark: Boolean, + dense: Boolean, + extended: Boolean, + extensionHeight: [Number, String], + fixed: Boolean, + flat: Boolean, + floating: Boolean, + height: [Number, String], + invertedScroll: Boolean, + light: Boolean, + manualScroll: Boolean, + prominent: Boolean, + scrollOffScreen: Boolean, + scrollTarget: String, + scrollThreshold: Number, + scrollToolbarOffScreen: Boolean, + tabs: Boolean, + }, +}); +Vue.component('v-toolbar-side-icon', {}); +Vue.component('v-toolbar-title', {}); +Vue.component('v-toolbar-items', {}); +Vue.component('v-tooltip', { + props: { + absolute: Boolean, + activator: (null as any) as PropValidator, + allowOverflow: Boolean, + attach: (null as any) as PropValidator, + bottom: Boolean, + closeDelay: [Number, String], + color: String, + contentClass: (null as any) as PropValidator, + dark: Boolean, + debounce: [Number, String], + disabled: Boolean, + fixed: Boolean, + inputActivator: Boolean, + lazy: Boolean, + left: Boolean, + light: Boolean, + maxWidth: [Number, String], + minWidth: [Number, String], + nudgeBottom: [Number, String], + nudgeLeft: [Number, String], + nudgeRight: [Number, String], + nudgeTop: [Number, String], + nudgeWidth: [Number, String], + offsetOverflow: Boolean, + openDelay: [Number, String], + positionX: Number, + positionY: Number, + right: Boolean, + tag: String, + top: Boolean, + transition: String, + value: (null as any) as PropValidator, + zIndex: (null as any) as PropValidator, + }, +}); +Vue.component('v-treeview', { + props: { + activatable: Boolean, + active: Array, + activeClass: String, + dark: Boolean, + expandIcon: String, + hoverable: Boolean, + indeterminateIcon: String, + itemChildren: String, + itemKey: String, + itemText: String, + items: Array, + light: Boolean, + loadChildren: Function, + loadingIcon: String, + multipleActive: Boolean, + offIcon: String, + onIcon: String, + open: Array, + openAll: Boolean, + openOnClick: Boolean, + selectable: Boolean, + selectedColor: String, + transition: Boolean, + value: Array, + }, +}); +Vue.component('v-treeview-node', { + props: { + activatable: Boolean, + activeClass: String, + expandIcon: String, + indeterminateIcon: String, + item: Object, + itemChildren: String, + itemKey: String, + itemText: String, + loadChildren: Function, + loadingIcon: String, + offIcon: String, + onIcon: String, + openOnClick: Boolean, + selectable: Boolean, + selectedColor: String, + transition: Boolean, + }, +}); +Vue.component('v-window', { + props: { + activeClass: String, + dark: Boolean, + light: Boolean, + mandatory: Boolean, + max: [Number, String], + multiple: Boolean, + reverse: Boolean, + touch: Object, + touchless: Boolean, + value: (null as any) as PropValidator, + vertical: Boolean, + }, +}); +Vue.component('v-window-item', { + props: { + activeClass: String, + disabled: Boolean, + lazy: Boolean, + reverseTransition: [Boolean, String], + transition: [Boolean, String], + value: (null as any) as PropValidator, + }, +}); +Vue.component('v-bottom-sheet-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-carousel-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-carousel-reverse-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-tab-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-tab-reverse-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-menu-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-fab-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-dialog-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-dialog-bottom-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-fade-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-scale-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-scroll-x-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-scroll-x-reverse-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-scroll-y-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-scroll-y-reverse-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-slide-x-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-slide-x-reverse-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-slide-y-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-slide-y-reverse-transition', { + props: { + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String, + }, +}); +Vue.component('v-expand-transition', { + props: { + mode: String, + }, +}); +Vue.component('v-row-expand-transition', { + props: { + mode: String, + }, +}); diff --git a/src/frontend/src/util.ts b/src/frontend/src/util.ts index 7e4191a..9409f84 100644 --- a/src/frontend/src/util.ts +++ b/src/frontend/src/util.ts @@ -1,75 +1,94 @@ -import axios from "axios"; +import axios from 'axios'; -const url = location.protocol + '//' + location.hostname + ':8081' -const root = url + '/braze/api/' -const constants = root + 'constants' -const mods = root + 'mods' -const packs = root + 'packs' -const latency = 1600 // artifical latency +const baseUrl = `${window.location.protocol}//${window.location.hostname}:8081`; +const root = `${baseUrl}/braze/api/`; +const constants = `${root}constants`; +const mods = `${root}mods`; +const packs = `${root}packs`; +const latency = 1600; // artifical latency -if (url !== location.origin) { // for dev environment - axios.defaults.headers.common['Authorization'] = 'Basic dXNlcjpjaGFuZ2VtZQ==' +if (baseUrl !== window.location.origin) { + // for dev environment + axios.defaults.headers.common.Authorization = 'Basic dXNlcjpjaGFuZ2VtZQ=='; } -function get (url: string, success: any, error: any) { - loadAndThen(() => - axios.get(url).then(success).catch(error) - ) +function loadAndThen(cb: any): void { + setTimeout(cb, latency); } -function post (url: string, data: any, success: any, error: any) { +function get(url: string, success: any, error: any): void { loadAndThen(() => - axios.post(url, data).then(success).catch(e => { - console.error(e.response.data) - error(e) - }) - ) + axios + .get(url) + .then(success) + .catch(error) + ); } -function loadAndThen (cb: any) { - setTimeout(cb, latency) +function post(url: string, data: any, success: any, error: any): void { + loadAndThen(() => + axios + .post(url, data) + .then(success) + .catch(e => { + console.error(e.response.data); + error(e); + }) + ); } -export function getConstants (success: any, error: any) { - get(constants, success, error) +export function getConstants(success: any, error: any): void { + get(constants, success, error); } -export function getMods (success: any, error: any) { - get(mods, success, error) +export function getMods(success: any, error: any): void { + get(mods, success, error); } -export function getMod (slug: any, success: any, error: any) { - get(`${mods}/${slug}`, success, error) +export function getMod(slug: any, success: any, error: any): void { + get(`${mods}/${slug}`, success, error); } -export function getPack (slug: any, success: any, error: any) { - get(`${packs}/${slug}`, success, error) +export function getPack(slug: any, success: any, error: any): void { + get(`${packs}/${slug}`, success, error); } -export function getPacks (success: any, error: any) { - get(packs, success, error) +export function getPacks(success: any, error: any): void { + get(packs, success, error); } -export function postMod (data: any, success: any, error: any) { - post(mods, data, success, error) +export function postMod(data: any, success: any, error: any): void { + post(mods, data, success, error); } -export function postModVersion (slug: any, data: any, success: any, error: any) { - post(`${mods}/${slug}`, data, success, error) +export function postModVersion( + slug: any, + data: any, + success: any, + error: any +): void { + post(`${mods}/${slug}`, data, success, error); } -export function postPack (data: any, success: any, error: any) { - post(packs, data, success, error) +export function postPack(data: any, success: any, error: any): void { + post(packs, data, success, error); } -export function postPackVersion (slug: any, data: any, success: any, error: any) { - post(`${packs}/${slug}`, data, success, error) +export function postPackVersion( + slug: any, + data: any, + success: any, + error: any +): void { + post(`${packs}/${slug}`, data, success, error); } -function slugify (str: string) { - return str.toLowerCase() +// eslint-disable-next-line @typescript-eslint/no-unused-vars +function slugify(str: string): string { + return str + .toLowerCase() .replace(/[^\w\s-]/g, '') // remove non-word [a-z0-9_], non-whitespace, non-hyphen characters .replace(/[\s_-]+/g, '-') // swap any length of whitespace, underscore, hyphen characters with a single - - .replace(/^-+|-+$/g, '') // remove leading, trailing - + .replace(/^-+|-+$/g, ''); // remove leading, trailing - // function written by kganser https://gist.github.com/mathewbyrne/1280286#gistcomment-1716050 } From 4b6f83ab2f1ca56449e8e0794f5c0f7a0a148dd2 Mon Sep 17 00:00:00 2001 From: Forrest Hopkins Date: Mon, 3 Jun 2019 22:14:33 -0700 Subject: [PATCH 3/5] STRICT MODE: Typescript part 3 Add a TS type definition generator from the Kotlin models Fix lint errors and TSC strict mode errors All that's left to do is clean up --- .gitignore | 1 + .idea/misc.xml | 5 +- build.gradle.kts | 33 ++++++- src/frontend/.eslintignore | 1 + src/frontend/.eslintrc.js | 1 + src/frontend/src/components/AddDialog.vue | 43 ++++---- src/frontend/src/components/DataTable.vue | 17 ++-- src/frontend/src/components/ModTable.vue | 28 +++--- src/frontend/src/components/PackTable.vue | 46 +++++---- .../src/components/PackVersionDialog.vue | 44 ++++----- src/frontend/src/model.ts | 20 ++++ src/frontend/src/util.ts | 98 ++++++++++++++----- src/frontend/tsconfig.json | 4 +- .../braze/model/TypeDefGenerator.kt | 30 ++++++ 14 files changed, 255 insertions(+), 116 deletions(-) create mode 100644 src/frontend/src/model.ts create mode 100644 src/main/kotlin/com/forresthopkinsa/braze/model/TypeDefGenerator.kt diff --git a/.gitignore b/.gitignore index 0662b19..0412ae8 100644 --- a/.gitignore +++ b/.gitignore @@ -197,4 +197,5 @@ typings/ ### Manually ignored files /src/main/resources/public/ +/src/frontend/src/braze-model.d.ts **/*.mv.db \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 3521517..5168f6d 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,8 +1,11 @@ - + + + + diff --git a/build.gradle.kts b/build.gradle.kts index 2afe51d..4542bdd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,10 @@ +@file:Suppress("HasPlatformType", "PropertyName") + import org.jetbrains.kotlin.gradle.tasks.KotlinCompile buildscript { var kotlinVersion: String by extra - kotlinVersion = "1.3.20" + kotlinVersion = "1.3.21" repositories { mavenCentral() @@ -20,9 +22,9 @@ plugins { idea maven - kotlin("jvm") version "1.3.20" - kotlin("plugin.spring") version "1.3.20" - kotlin("plugin.jpa") version "1.3.20" + kotlin("jvm") version "1.3.21" + kotlin("plugin.spring") version "1.3.21" + kotlin("plugin.jpa") version "1.3.21" id("org.springframework.boot") version "2.0.4.RELEASE" id("io.spring.dependency-management") version "1.0.6.RELEASE" @@ -36,6 +38,7 @@ val retrofitVersion = "2.4.0" repositories { mavenLocal() mavenCentral() + maven { url = uri("https://jitpack.io") } } dependencies { @@ -55,11 +58,15 @@ dependencies { compile("com.h2database", "h2") + compile("com.github.ntrrgc", "ts-generator", "1.1.1") + testCompile("org.testng", "testng", "6.14.3") testCompile("org.springframework", "spring-test") testCompile("org.springframework.boot", "spring-boot-starter-test") } +// todo: replace with tasks{} block + val bootJar by tasks.getting val assemble by tasks.getting val install by tasks.getting @@ -74,11 +81,23 @@ val cleanStatic by tasks.creating(Delete::class) { delete("src/main/resources/public") } +val generateDefinitions by tasks.creating(JavaExec::class) { + classpath = sourceSets["main"].runtimeClasspath + main = "com.forresthopkinsa.braze.model.TypeDefGeneratorKt" + standardOutput = File(buildDir, "braze-model.d.ts").outputStream() +} + +val copyDefinitions by tasks.creating(Copy::class) { + dependsOn(generateDefinitions) + from(File(buildDir, "braze-model.d.ts")) + destinationDir = File(projectDir, "src/frontend/src") +} + npm_run_build.dependsOn(cleanStatic) bootJar.mustRunAfter(npm_run_build) -assemble.dependsOn(npm_run_build) +assemble.dependsOn(npm_run_build, copyDefinitions) install.dependsOn(assemble) @@ -90,6 +109,10 @@ tasks.withType { useTestNG() } +springBoot { + mainClassName = "com.forresthopkinsa.braze.spring.ApplicationKt" +} + node { nodeModulesDir = file("${project.projectDir}/src/frontend") } diff --git a/src/frontend/.eslintignore b/src/frontend/.eslintignore index e2192c5..df13559 100644 --- a/src/frontend/.eslintignore +++ b/src/frontend/.eslintignore @@ -3,3 +3,4 @@ /dist/ /*.js /test/unit/coverage/ +**/braze-model.d.ts diff --git a/src/frontend/.eslintrc.js b/src/frontend/.eslintrc.js index fa4b0fb..b676da3 100644 --- a/src/frontend/.eslintrc.js +++ b/src/frontend/.eslintrc.js @@ -17,6 +17,7 @@ module.exports = { rules: { // allow async-await 'generator-star-spacing': 'off', + 'no-param-reassign': 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', }, diff --git a/src/frontend/src/components/AddDialog.vue b/src/frontend/src/components/AddDialog.vue index bdfd04c..1bf58ae 100644 --- a/src/frontend/src/components/AddDialog.vue +++ b/src/frontend/src/components/AddDialog.vue @@ -38,7 +38,8 @@