diff --git a/.tslint.js b/.tslint.js new file mode 100644 index 00000000000..4c65e2b4972 --- /dev/null +++ b/.tslint.js @@ -0,0 +1,26 @@ +module.exports = { + defaultSeverity: 'error', + extends: 'tslint-config-standard', + linterOptions: { + exclude: [ + './build/*', + './es5/**/*', + './dev/**/*', + './src/stylus/*.styl', + './src/util/testing.js', + './src/util/to-have-been-warned.js', + '**/*.spec.js', + './node_modules/**/*' + ] + }, + jsRules: { + 'max-line-length': [true, 140], + 'no-debugger': process.env.NODE_ENV === 'production' + }, + rules: { + 'max-line-length': [true, 140], + 'no-debugger': process.env.NODE_ENV === 'production', + 'strict-type-predicates': false + }, + rulesDirectory: [] +} diff --git a/build/webpack.base.config.js b/build/webpack.base.config.js index fe8ee4f8fda..0093c6fc131 100644 --- a/build/webpack.base.config.js +++ b/build/webpack.base.config.js @@ -4,7 +4,7 @@ const resolve = file => require('path').resolve(__dirname, file) module.exports = { resolve: { - extensions: ['*', '.js', '.json', '.vue'], + extensions: ['*', '.js', '.json', '.vue', '.ts'], alias: { '@': resolve('../src') } diff --git a/build/webpack.dev.config.js b/build/webpack.dev.config.js index c76f63f69f9..b96b9493b0c 100644 --- a/build/webpack.dev.config.js +++ b/build/webpack.dev.config.js @@ -27,7 +27,7 @@ module.exports = merge(baseWebpackConfig, { library: 'Vuetify' }, resolve: { - extensions: ['*', '.js', '.json', '.vue'], + extensions: ['*', '.js', '.json', '.vue', '.ts'], alias: { vuetify: resolve('../src'), 'vue$': 'vue/dist/vue.esm.js' @@ -49,8 +49,20 @@ module.exports = merge(baseWebpackConfig, { exclude: /node_modules/ }, { - test: /\.js$/, - loaders: ['babel-loader', 'eslint-loader'], + test: /\.[jt]s$/, + enforce: 'pre', + loader: 'tslint-loader', + options: { + failOnHint: true, + typeCheck: true, + configFile: resolve('../.tslint.js'), + tsConfigFile: resolve('../tsconfig.json') + }, + exclude: /node_modules/ + }, + { + test: /\.[jt]s$/, + loaders: ['babel-loader', 'ts-loader'], exclude: /node_modules/ }, { diff --git a/build/webpack.prod.config.js b/build/webpack.prod.config.js index b1ef5658260..9113cfd0a80 100644 --- a/build/webpack.prod.config.js +++ b/build/webpack.prod.config.js @@ -17,7 +17,7 @@ const resolve = file => require('path').resolve(__dirname, file) module.exports = merge(baseWebpackConfig, { entry: { - app: './src/index.js' + app: './src/index.ts' }, output: { path: resolve('../dist'), @@ -30,23 +30,20 @@ module.exports = merge(baseWebpackConfig, { noParse: /es6-promise\.js$/, // avoid webpack shimming process rules: [ { - test: /\.vue$/, - use: [ - { - loader: 'vue-loader', - options: { - loaders: { - stylus: extractPlugin - } - } - }, - 'eslint-loader' - ], + test: /\.ts$/, + enforce: 'pre', + loader: 'tslint-loader', + options: { + failOnHint: true, + typeCheck: true, + configFile: resolve('../.tslint.js'), + tsConfigFile: resolve('../tsconfig.json') + }, exclude: /node_modules/ }, { - test: /\.js$/, - loaders: ['babel-loader', 'eslint-loader'], + test: /\.[jt]s$/, + loaders: ['babel-loader', 'ts-loader'], exclude: /node_modules/ }, { diff --git a/package.json b/package.json index 7432259924f..db1df93e38c 100644 --- a/package.json +++ b/package.json @@ -24,13 +24,14 @@ "test:unix": "cross-env NODE_ENV=test jest", "test:win32": "cross-env NODE_ENV=test jest -i", "test:coverage": "cross-env NODE_ENV=test jest --coverage", - "lint": "eslint --ext .js,.vue src", + "lint": "tslint -p . -c .tslint.js src/**/*.{ts,js}", "preparecommitmsg": "node dev/prepare-commit-message.js", "commitmsg": "node dev/lint-commit-message.js", "precommit": "node dev/warn-npm-install.js && yarn lint && yarn test" }, "description": "Vue.js 2 Semantic Component Framework", "devDependencies": { + "@types/node": "^8.0.47", "autoprefixer": "7.2.5", "avoriaz": "6.3.0", "babel-cli": "6.26.0", @@ -88,6 +89,11 @@ "style-loader": "0.19.1", "stylus": "0.54.5", "stylus-loader": "^3.0.2", + "ts-loader": "^3.0.5", + "tslint": "^5.8.0", + "tslint-config-standard": "^6.0.1", + "tslint-loader": "^3.5.3", + "typescript": "^2.5.3", "uglifyjs-webpack-plugin": "1.1.6", "vue": "^2.5.14", "vue-loader": "^14.2.1", diff --git a/src/globals.d.ts b/src/globals.d.ts new file mode 100644 index 00000000000..961b7b3da2a --- /dev/null +++ b/src/globals.d.ts @@ -0,0 +1,13 @@ +import { VueConstructor } from 'vue' + +declare global { + interface Window { + Vue: VueConstructor + } +} + +declare module 'vue/types/vue' { + interface VueConstructor { + version: string + } +} diff --git a/src/index.js b/src/index.ts similarity index 55% rename from src/index.js rename to src/index.ts index 20ab39bdfae..e7cc8c5e0f0 100755 --- a/src/index.js +++ b/src/index.ts @@ -1,11 +1,16 @@ import './stylus/app.styl' import * as components from './components' import * as directives from './directives' +import { PluginObject, VueConstructor } from 'vue' -function Vuetify (Vue, args) { - const Vuetify = components.Vuetify +declare module Vuetify { + let version: string +} + +function Vuetify (Vue: VueConstructor, args: any): void { + const VuetifyComponent: PluginObject = components.Vuetify - Vue.use(Vuetify, { + Vue.use(VuetifyComponent, { components, directives, ...args diff --git a/tsconfig.dev.json b/tsconfig.dev.json new file mode 100644 index 00000000000..76acf2c58f9 --- /dev/null +++ b/tsconfig.dev.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "include": [ + "src", + "dev" + ] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000000..89416d3ef11 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "allowJs": true, + "allowSyntheticDefaultImports": true, + "target": "es5", + "module": "es6", + "moduleResolution": "node", + "outDir": "./dist", + "sourceMap": true, + "lib": ["es2018", "dom"] + }, + "include": [ + "src" + ], + "exclude": [ + "**/*.spec.ts", + "**/*.spec.js", + "node_modules" + ] +} diff --git a/yarn.lock b/yarn.lock index e43dfa3c817..cc5f494d9d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,7 @@ # yarn lockfile v1 +<<<<<<< 8ae4b80d2b81d838192251737f3ab763ba60383e "@babel/code-frame@7.0.0-beta.40", "@babel/code-frame@^7.0.0-beta.40": version "7.0.0-beta.40" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.40.tgz#37e2b0cf7c56026b4b21d3927cadf81adec32ac6" @@ -70,6 +71,11 @@ esutils "^2.0.2" lodash "^4.2.0" to-fast-properties "^2.0.0" +======= +"@types/node@^8.0.47": + version "8.0.47" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.47.tgz#968e596f91acd59069054558a00708c445ca30c2" +>>>>>>> Convert entry module to typescript and set up tslint abab@^1.0.3: version "1.0.3" @@ -1527,7 +1533,11 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: escape-string-regexp "^1.0.5" supports-color "^4.0.0" +<<<<<<< 8ae4b80d2b81d838192251737f3ab763ba60383e chalk@^2.3.0: +======= +chalk@^2.2.0: +>>>>>>> Convert entry module to typescript and set up tslint version "2.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" dependencies: @@ -2235,9 +2245,22 @@ doctrine@1.5.0: esutils "^2.0.2" isarray "^1.0.0" +<<<<<<< 8ae4b80d2b81d838192251737f3ab763ba60383e doctrine@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.2.tgz#68f96ce8efc56cc42651f1faadb4f175273b0075" +======= +doctrine@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523" + dependencies: + esutils "^1.1.6" + isarray "0.0.1" + +doctrine@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" +>>>>>>> Convert entry module to typescript and set up tslint dependencies: esutils "^2.0.2" @@ -2342,6 +2365,7 @@ encodeurl@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" +<<<<<<< 8ae4b80d2b81d838192251737f3ab763ba60383e end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" @@ -2349,6 +2373,9 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: once "^1.4.0" enhanced-resolve@^3.4.0: +======= +enhanced-resolve@^3.0.0, enhanced-resolve@^3.4.0: +>>>>>>> Convert entry module to typescript and set up tslint version "3.4.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" dependencies: @@ -2644,6 +2671,10 @@ estree-walker@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa" +esutils@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375" + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -3937,6 +3968,10 @@ is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -6223,7 +6258,17 @@ resolve@^1.1.6, resolve@^1.1.7, resolve@^1.2.0, resolve@^1.3.3, resolve@^1.4.0: dependencies: path-parse "^1.0.5" +<<<<<<< 8ae4b80d2b81d838192251737f3ab763ba60383e ress@1.2.2: +======= +resolve@^1.3.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" + dependencies: + path-parse "^1.0.5" + +ress@^1.1.1: +>>>>>>> Convert entry module to typescript and set up tslint version "1.2.2" resolved "https://registry.yarnpkg.com/ress/-/ress-1.2.2.tgz#4fd00681c8d3ceaa79f5de1e54aaad15617e9777" @@ -6246,7 +6291,11 @@ rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: dependencies: glob "^7.0.5" +<<<<<<< 8ae4b80d2b81d838192251737f3ab763ba60383e rimraf@2.6.2, rimraf@^2.5.4: +======= +rimraf@^2.4.4, rimraf@^2.6.2: +>>>>>>> Convert entry module to typescript and set up tslint version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: @@ -6336,7 +6385,7 @@ selfsigned@^1.9.1: dependencies: node-forge "0.6.33" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1: +"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.3.0, semver@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" @@ -7061,6 +7110,69 @@ tryit@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" +ts-loader@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-3.0.5.tgz#a22a50eda4258de6fcbd9ed4e7a356130a64cfa0" + dependencies: + chalk "^2.2.0" + enhanced-resolve "^3.0.0" + loader-utils "^1.0.2" + semver "^5.0.1" + +tslib@^1.0.0, tslib@^1.7.1: + version "1.8.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.8.0.tgz#dc604ebad64bcbf696d613da6c954aa0e7ea1eb6" + +tslint-config-standard@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/tslint-config-standard/-/tslint-config-standard-6.0.1.tgz#a04ba0a794759e877287056f549b081e47a56d6c" + dependencies: + tslint-eslint-rules "^4.0.0" + +tslint-eslint-rules@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-4.1.1.tgz#7c30e7882f26bc276bff91d2384975c69daf88ba" + dependencies: + doctrine "^0.7.2" + tslib "^1.0.0" + tsutils "^1.4.0" + +tslint-loader@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/tslint-loader/-/tslint-loader-3.5.3.tgz#343f74122d94f356b689457d3f59f64a69ab606f" + dependencies: + loader-utils "^1.0.2" + mkdirp "^0.5.1" + object-assign "^4.1.1" + rimraf "^2.4.4" + semver "^5.3.0" + +tslint@^5.8.0: + version "5.8.0" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.8.0.tgz#1f49ad5b2e77c76c3af4ddcae552ae4e3612eb13" + dependencies: + babel-code-frame "^6.22.0" + builtin-modules "^1.1.1" + chalk "^2.1.0" + commander "^2.9.0" + diff "^3.2.0" + glob "^7.1.1" + minimatch "^3.0.4" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.7.1" + tsutils "^2.12.1" + +tsutils@^1.4.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-1.9.1.tgz#b9f9ab44e55af9681831d5f28d0aeeaf5c750cb0" + +tsutils@^2.12.1: + version "2.12.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.12.1.tgz#f4d95ce3391c8971e46e54c4cf0edb0a21dd5b24" + dependencies: + tslib "^1.7.1" + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -7103,6 +7215,10 @@ uglify-es@^3.3.4: commander "~2.13.0" source-map "~0.6.1" +typescript@^2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d" + uglify-js@^2.6, uglify-js@^2.6.1, uglify-js@^2.8.29: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"