If I would like to work on a project using TypeScript and also I would like to lint templates of .vue
files, I need to start a new project selecting TypeScript and TSLint, and then install and invoke the @vue/cli-plugin-eslint
plugin to add the required packages and the .eslintrc
file.
Allow selecting TSLint + ESLint (with the same config as ESLint with error prevention only
) to generate .eslintrc
and tslint.json
files, when I create a new Vue project.
Maybe would be better to add a question after Pick a linter / formatter config
to ask if I would like to lint templates in .vue
files
As a side note for this feature
the prompt choice will be long
? Pick a linter / formatter config:
❯ TSLint
TSLint + Airbnb ESLint config
TSLint + Standard ESLint config
TSLint + Prettier
ESLint with error prevention only
ESLint + Airbnb config
ESLint + Standard config
ESLint + Prettier
If it's implemented, the prompt choices need to be trimmed (merge ESLint choice)
? Pick a linter / formatter config:
❯ TSLint
TSLint + Airbnb ESLint config
TSLint + Standard ESLint config
TSLint + Prettier
using tslint-eslint-rules maybe can help to implement this feature
In my opinion removing ESLint as a prompt choice would be bad because with ESLint i can use https://github.com/vuejs/eslint-plugin-vue. :-)
+1 for an automatic setup with both TSLint, ESLint and eslint-plugin-vue
Anyone know how to manually configure this currently? I have tslint, eslint, and eslint-plugin-vue, but eslint is not always happy with my TS code:
Module Warning (from ./node_modules/eslint-loader/index.js):
error: Duplicate param 'prop' (no-dupe-args) at src/components/TrackList.vue:125:15:
123 | },
124 |
> 125 | changeSort({ prop, order }: { prop: string; order: SortOrder }) {
| ^
126 | this.sortBy = prop;
127 | this.order = order;
128 | },
I could just turn off the no-dupe-args
and no-redeclare
rules, but I'm wondering if there's a better way. Namely, to have eslint ignore <script lang="ts">
blocks.
Hi @ffxsam,
TL;DR;
Looks like it's an error of the typescript-eslint-parser
fo the interface type checking. I could reproduce the issue and fix it creating an interface for { prop: string; order: SortOrder; }
and using that instead "inline interface".
In deep:
TS code into the .vue files is linted by ESLint thanks to the typescript-eslint-parser
which translate the TS code to a tree code, so in that case for console linting, TSLint is useless.
TSLint is good for .ts
files only, because it could not extract the <script lang="ts">
tag from the .vue
files.
Also typescript-eslint-parser
has a bug related to @Component decorator (https://github.com/eslint/typescript-eslint-parser/issues/438)
One more thing... if you lint TS code in .vue
files with ESLint and .ts
files with TSLint... you'll need to maintain 2 configuration, there are rules in ESLint that doesn't exists for TSLint and vice versa.
So, IMHO, you need to select one listing tool for TS Code, in order to allow you to use the pre-commit CLI scripts:
If you selected ESLint, you should familiarize with typescript-eslint-parser
, and you could continue working with <script lang="ts">
tags, and configure ESLint to also lint .ts
files.
But, if you selected TSLint, would be better to change the <script lang="ts">
tag to something like that <script lang="ts" src="./script.ts">
, so you could use ESLint to lint the HTML content of the .vue
files, and TSLint for .ts
files
I would like to hear about other opinions about that, and I just found wotam (https://github.com/fimbullinter/wotan) somebody experienced that?
hi, any best practice for this feature?
Hi @summercn, hope it didn't block you and find a way to deal with it.
I just backed to Vue.js after some months without using it, and checking this for a new project with the latest version of vue-cli (3.5.1) I found a solution that may will be useful for this case.
First I ran vue create
command adding TS and enabling TSLint in the listing step. This step will create the tslint.json
file only.
Then I ran vue add @vue/eslint
with the option Error prevention only
, to create the eslintrc.js
with the basic configuration to lint html in vue files.
There are 2 little things to review (I'll try to update soon on this)
1.- I guess in this case won't need the @vue/eslint-config-typescript
package and the reference to @typescript-eslint/parser
in the eslintrc.js
file
2.- The lint-staged
property in the package.json
file is duplicating .vue
linting
"lint-staged": {
"*.ts": [
"vue-cli-service lint",
"git add"
],
"*.vue": [
"vue-cli-service lint",
"git add"
],
"*.{js,vue}": [
"vue-cli-service lint",
"git add"
]
}
Maybe it could be changed to a single instruction, like
"*.{ts,js,vue}": [
"vue-cli-service lint",
"git add"
]
AFAIK, vue-cli recommended eslint over tslint for ts projects now? Is that true?
TSLint will be deprecated and all efforts will converge into ESLint, so I guess this issue will solve itself more or less when 2019 ends: the standard will be ESLint.
Thanks @IlCallo for that info, I was disconnected of any news about the JS/TS ecosystem LOL
I researched a bit about that and checked the roadmap, and looks like the plan is to implement TS linting into ESLint in June 2019, so... so I think far ESLint + TSLint would be a good approach to cover things in TS that doesn't exists in ESLint like the conflict between new-cap
rule and the decorators
Now that TSLint is officially deprecated, I think we should no longer consider putting energy into TSLint-related features. So I'm closing this issue.
@sodatea how can I migrate my existing TSLint project to ESlint? For example, making vue-cli-service lint
using ESLint instead of TSLint?
@vegerot Just run vue add eslint
in the project.
Trying to do that in my project gives an error:
? Pick additional lint features: (Press <space> to select, <a> to toggle all, <i> to invert selection)Lint on save
🚀 Invoking generator for @vue/cli-plugin-eslint...
WARN conflicting versions for project dependency "eslint":
- ^5.16.0 injected by generator "undefined"
- ^6.7.2 injected by generator "@vue/cli-plugin-eslint"
Using newer version (^6.7.2), but this may cause build errors.
ERROR SyntaxError: Unexpected token / in JSON at position 652
SyntaxError: Unexpected token / in JSON at position 652
at JSON.parse (<anonymous>)
at Object.read (/usr/local/lib/node_modules/@vue/cli/lib/util/configTransforms.js:44:30)
at ConfigTransform.transform (/usr/local/lib/node_modules/@vue/cli/lib/ConfigTransform.js:25:30)
at extract (/usr/local/lib/node_modules/@vue/cli/lib/Generator.js:198:37)
at Generator.extractConfigFiles (/usr/local/lib/node_modules/@vue/cli/lib/Generator.js:211:9)
at Generator.generate (/usr/local/lib/node_modules/@vue/cli/lib/Generator.js:173:10)
at runMicrotasks (<anonymous>)
at processTicksAndRejections (internal/process/task_queues.js:97:5)
at async runGenerator (/usr/local/lib/node_modules/@vue/cli/lib/invoke.js:109:3)
at async invoke (/usr/local/lib/node_modules/@vue/cli/lib/invoke.js:90:3)
Most helpful comment
the prompt choice will be long
If it's implemented, the prompt choices need to be trimmed (merge ESLint choice)
using tslint-eslint-rules maybe can help to implement this feature