Tslint: Admite archivos linting vue / html

Creado en 22 ene. 2017  ·  35Comentarios  ·  Fuente: palantir/tslint

Solicitud de función

  • __TSLint versión__: 4.3.1
  • __Versión de TypeScript__: 2.1.5
  • __Ejecutando TSLint a través de__: API Node.js

El código de TypeScript está entretejido

<template>
  <q-layout>
    <div slot="header" class="toolbar">
      <q-toolbar-title :padding="0">
        Quasar Framework v{{quasarVersion}}
      </q-toolbar-title>
    </div>

    <!--
      Replace following "div" with
      "<router-view class="layout-view">" component
      if using subRoutes
    -->
    <div class="layout-view">
      <div class="logo-container non-selectable no-pointer-events">
        <div class="logo" :style="position">
          <img src="~assets/quasar-logo.png">
          <p class="caption text-center">
            <span class="desktop-only">Move your mouse!!!.</span>
            <span class="touch-only">Touch screen and move.</span>
          </p>
        </div>
      </div>
    </div>
  </q-layout>
</template>

<script lang="ts">
  import * as Quasar from 'quasar';
  import { Utils } from 'quasar';
  import * as Vue from 'vue';
  import Component from 'vue-class-component';

  const moveForce = 30;
  const rotateForce = 40;

  @Component({
  })
  export default class Index extends Vue {
    rotateX: number;
    rotateY: number;
    moveY: number;
    moveX: number;
    quasarVersion: string;
   ...  
 }
</script>

<style lang="stylus">
....
</style>

con tslint.json configuración:

{
  "rules": {
    "class-name": true,
    "curly": true,
    "eofline": false,
    "expr" : true,
    "forin": true,
    "indent": [true, "spaces"],
    "label-position": true,
    "label-undefined": true,
    "max-line-length": [true, 140],
    "no-arg": true,
    "no-bitwise": true,
    "no-console": [true,
      "debug",
      "info",
      "time",
      "timeEnd",
      "trace"
    ],
    "no-construct": true,
    "no-debugger": true,
    "no-duplicate-key": true,
    "no-duplicate-variable": true,
    "no-empty": true,
    "no-eval": true,
    "no-string-literal": false,
    "no-switch-case-fall-through": true,
    "no-trailing-comma": true,
    "no-trailing-whitespace": true,
    "no-unused-expression": false,
    "no-unused-variable": true,
    "no-unreachable": true,
    "no-use-before-declare": true,
    "one-line": [true,
      "check-open-brace",
      "check-catch",
      "check-else",
      "check-whitespace"
    ],
    "quotemark": [true, "single"],
    "radix": false,
    "semicolon": [false],
    "triple-equals": [true, "allow-null-check"],
    "variable-name": false,
    "whitespace": [true,
      "check-branch",
      "check-decl",
      "check-operator",
      "check-separator",
      "check-type"
    ]
  }
}

Comportamiento real

Intenta pelar todo el archivo y falla.

Comportamiento esperado

compruebe el código dentro de las etiquetas de script solamente, similar a eslint.

Aged Away Feature Request

Comentario más útil

¿Alguna noticia más aquí? 🤙

Todos 35 comentarios

@ nrip-monotype, puede usar TSLint con componentes de archivo único de Vue configurando vue-loader . Por ejemplo, en el paquete web 2 lo estoy usando así ( eche un vistazo a la opción loaders de vue-loader ):

module: {
        rules: [
            {
                enforce: 'pre',
                test: /\.ts$/,
                loader: 'tslint-loader',
                exclude: /(node_modules)/,
                options: {
                    configFile: 'tslint.json'
                }
            },
            {
                test: /\.ts$/,
                exclude: /node_modules|vue\/src/,
                loader: 'ts-loader',
                options: {
                    appendTsSuffixTo: [/\.vue$/],
                    transpileOnly: true,
                    isolatedModules: true
                }
            },
            {
                test: /\.vue$/,
                loader: 'vue-loader',
                options: {
                    loaders: {
                        ts: 'ts-loader!tslint-loader'
                    }
                }
            },
        }
    }
}

@romandragan , tu sugerencia funciona, pero parece tener problemas con no-consecutive-blank-lines . Parece que los elementos de marcado se reemplazan por líneas vacías, por ejemplo:

<template>
   <span class='hello'>hello world</span>
</tempalte>
<script lang="ts">
    return {};
</script>
<style>
    .hello { background-color: pink }
</style>

Tslint lo ve como:

    return {};




Si configuro "no-consecutive-blank-lines": [true, 3] , falla, pero "no-consecutive-blank-lines": [true, 4] tiene éxito ... ¿Alguna idea de cómo solucionar esto? (a falta de otro complemento que elimina los espacios en blanco iniciales y finales ...)

@lucastheisen , el mismo problema para mí 😞 Tratando de encontrar una solución ...

La configuración de @romandragan funcionó para mí, pero algo a tener en cuenta es que la bandera typeCheck para tslint-loader no funciona en vue-loader. Aún puede usarlo normalmente fuera de vue-loader.

>

module: {
        rules: [
            {
                enforce: 'pre',
                test: /\.ts$/,
                loader: 'tslint-loader',
                exclude: /(node_modules)/,
                options: {
                    configFile: 'tslint.json'
                }
            },
            {
                test: /\.ts$/,
                exclude: /node_modules|vue\/src/,
                loader: 'ts-loader',
                options: {
                    appendTsSuffixTo: [/\.vue$/],
                    transpileOnly: true,
                    isolatedModules: true,
                    typeCheck: true // This is ok.
                }
            },
            {
                test: /\.vue$/,
                loader: 'vue-loader',
                options: {
                    loaders: {
                        ts: 'ts-loader!tslint-loader' // Can't append `?typeCheck` here.
                    }
                }
            },
        }
    }
}

Intentar usar reglas de tipo verificado en vue-loader produce un error como este:

ERROR in ./app.ts
(10,29): error TS2307: Cannot find module './components/sidebar.vue'.

ERROR in ./~/ts-loader!./~/tslint-loader?formatter=verbose&typeCheck!./~/vue-loader/lib/selector.js?type=script&index=0!./components/sidebar.vue
Module build failed: Error:
Invalid source file: /absolute/path/to/sidebar.vue. Ensure that the files supplied to lint have a .ts, .tsx, .js or .jsx extension.

También obtengo el mismo no-consecutive-blank-lines falso positivo que @lucastheisen y @romandragan.

Recibo este ERROR in Entry module not found: Error: Can't resolve 'ts-loader!tslint-loader' cuando uso esta configuración:

            {
                test: /\.vue$/,
                loader: 'vue-loader',
                options: {
                    loaders: {
                        ts: 'ts-loader!tslint-loader'
                    }
                }
            },

@ARomancev , ¿qué versión de webpack estás usando? ¿Tiene los módulos ts-loader y tslint-loader npm instalados?

@romandragan , aquí está la configuración de npm que estoy usando:
''
"tslint": "^ 5.1.0",
"ts-loader": "^ 2.0.3",
"paquete web": "^ 2.4.1",

And this is the webpack config:
  {
    test: /\.tsx?$/,
    enforce: 'pre',
    loader: 'tslint-loader'
  },
  {
    test: /\.tsx?$/,
    loader: 'ts-loader',
    exclude: /node_modules/,
    options: {
      appendTsSuffixTo: [/\.vue$/]
    }
  },

''
ts-loader y tslint-loader están instalados y funcionan bien, ya que obtengo la pelusa correcta de los archivos * .ts.

Como solución alternativa, podemos separar la lógica de TypeScript del archivo .vue y eliminar tslint-loader de los cargadores de vue. Luego, no-consecutive-blank-lines desaparece.

@romandragan esto funciona, pero sería bueno incluir el código dentro de la etiqueta <script> también: esto es necesario para el soporte del editor y es mucho más fácil ejecutar el comando tslint separado, en lugar de hacerlo a través del paquete web completo fluir.

@adidahiya ¿ algún plan para esta función?
¿O algún plan para el sistema de complementos de soporte en tslint como los complementos de eslint?

Si está utilizando Webpack, tengo archivos .vue funcionando y almacenados en el nivel del comprobador de tipos sin ningún problema no-consecutive-blank-lines en fork-ts-checker-webpack-plugin . Puede ver el PR aquí (y npm install de una rama de prueba y usarlo ahora mismo, consulte la parte superior del hilo PR): https://github.com/Realytics/fork-ts-checker-webpack-plugin / tirar / 77

Además, si está utilizando el editor VSCode, consulte la extensión TSLint Vue .

He creado una solicitud de extracción que implementa una función de complemento en tslint, y escribí el primer complemento capaz de analizar componentes de archivo único "vue".

https://github.com/palantir/tslint/pull/3596
https://github.com/Toilal/tslint-plugin-vue

Este es un trabajo en progreso, pero siéntase libre de intentarlo. Puede agregar el complemento con npm install git+https://https://github.com/Toilal/tslint-plugin-vue y habilitarlo agregando plugins: 'vue' en tslint.json . Actualmente no funciona con la opción -p/--project , tienes que usar la opción -c/--config .

Hola chicos, otra solución alternativa, por ahora, es mover la etiqueta del script al principio del archivo y agregar /* tslint:disable:no-consecutive-blank-lines */ en la última línea para no tener en cuenta esta regla.
Mira la imagen de abajo
image

Vue-loader puede extraer JavaScript o TypeScript de archivos vue, por lo que analizar archivos vue no es un problema para el paquete web. Sin embargo, TSLint todavía arroja "Archivo fuente no válido" porque los nombres de archivo terminan con ".vue" si typeCheck está habilitado ...

Además, podemos hacer que TSLint deje de quejarse de líneas en blanco consecutivas al permitir líneas en blanco consecutivas al principio o al final de los archivos vue, porque vue-loader no elimina las líneas irrelevantes para TypeScript, sino que las borra para mantener los números de línea correctos.

Actualmente estoy trabajando en un linter que podría resolver estos problemas sin la necesidad de un paquete web: https://github.com/ajafff/wotan
Esto es actualmente una prueba de concepto y puede o no integrarse en TSLint. Es una reescritura completa desde cero y prácticamente incompatible con TSLint.

Tiene la capacidad de transformar archivos usando un procesador (similar a los procesadores ESLint). Un procesador vue extrae el código TypeScript del SFC, el linter solo escribe el código y luego el procesador asigna los errores a la ubicación correcta en el archivo original. Esto incluso funciona con la verificación de tipos.
Puede ver una salida de muestra de linchar un archivo vue aquí:
https://github.com/ajafff/wotan/blob/master/baselines/integration/processors/vue/default/hello.vue.lint#L29

También permite la fijación automática. El mismo archivo que el anterior se corrigió automáticamente: https://github.com/ajafff/wotan/blob/master/baselines/integration/processors/vue/default/hello.vue#L28

Una vez que haya solucionado https://github.com/ajafff/wotan/issues/32 , publicaré un lanzamiento para que puedas probarlo en tu código del mundo real.
Tenga en cuenta que el procesador vue no es parte del proyecto principal, pero me aseguraré de publicar un paquete separado para el procesador.

¿Alguien sabe cómo configuraría tsconfig.json para que tslint de línea de comando filtre la parte TS de mis archivos Vue? Funciona bien en VS Code, pero me gustaría que la línea de comandos también funcionara.

Tardé un poco más de lo que pensaba, pero aquí está: https://www.npmjs.com/package/@fimbul/wotan

Incluso puede usar el tiempo de ejecución de linter ( @fimbul/wotan ) para ejecutar reglas de TSLint. Solo necesita @fimbul/heimdall , consulte https://github.com/fimbullinter/wotan/tree/master/packages/heimdall#readme

Para borrar archivos de Vue, use @fimbul/ve (sin error tipográfico, no hay 'u' en 've'): https://github.com/fimbullinter/wotan/tree/master/packages/ve#readme

¿Hay un horario cuando tslint admitirá linting vue / html file? @Toilal

Depende de la comunidad implementar esto, pero el autor de VueJS parece estar a favor de los complementos ESLint TypeScript en la última versión de vue-cli (actualmente en alfa).

Esta característica parece estar ya implementada en [email protected] . Correr:

$ npm install -g @vue/cli
$ vue create project-name

Y habrá la opción de usar TSLint como linter.

Regresé con noticias aún mejores para todos en este hilo:

La última versión de wotan puede ejecutar reglas TSLint de acuerdo con su tslint.json y agrega soporte para procesadores. Eso significa que no tiene que cambiar su configuración y puede comenzar a enlazar sus archivos Vue ahora:

  1. Instalar en pc
    sh yarn add -D @fimbul/wotan @fimbul/ve @fimbul/valtyr # or npm install --save-dev @fimbul/wotan @fimbul/ve @fimbul/valtyr
  2. Configurar
    Agregue un nuevo archivo .fimbullinter.yaml en el directorio raíz de su proyecto y agregue el siguiente contenido:
    yaml modules: "@fimbul/valtyr" valtyr: overrides: - files: "*.vue" processor: "@fimbul/ve"
  3. Correr
    Vea los ejemplos a continuación y adáptelos para su propio uso. Lea los documentos para obtener más información sobre los argumentos CLI disponibles.
    sh wotan # finds tsconfig.json and lints the whole project with type information according to your tslint.json wotan 'src/**/*.vue' -f verbose # lint all Vue files, use TSLint's verbose formatter wotan -p tsconfig.json -c tslint.json --fix # lint the whole project with tslint.json and fix failures
  4. Otras lecturas
    Wotan - CLI y configuración: https://github.com/fimbullinter/wotan/tree/master/packages/wotan#readme
    Valtýr - complemento para reglas y formateadores de TSLint - "el tiempo de ejecución de TSLint que es mejor que TSLint": https://github.com/fimbullinter/wotan/tree/master/packages/valtyr#readme
    Vé - procesador para componentes de archivo único Vue: https://github.com/fimbullinter/wotan/tree/master/packages/ve#readme
    Fimbullinter: por qué debería comenzar a usar este proyecto ahora: https://github.com/fimbullinter/wotan#readme
  5. Me gusta, comparte y suscribete: estrella:

@romandragan

puede usar TSLint con componentes de archivo único de Vue configurando vue-loader.

Gracias por la solucion Pero es solo una solución específica de Webpack. Sería genial si hubiera una solución genérica que no dependa de una herramienta de compilación para que podamos usar archivos tslint Vue compilados con Fusebox (o cualquier otra herramienta de compilación).

Otra solución para webpack.

He creado un cargador simple que recorta todos los espacios en blanco de un "archivo" proporcionado por vue-loader y luego agrega espacios en blanco para un linter.

webpack.config.js:

test:/\.vue$/, loader: 'vue-loader', options: { loaders: { 'ts': [ 'vue-ts-loader', 'tslint-loader', path.resolve('./path/to/remove-whitespace-ts-loader.js') ],....

y luego remove-whitespace-ts-loader:
/* MIT License http://www.opensource.org/licenses/mit-license.php Author Szymon Sasin */ module.exports = function(source) { let result = source.replace(/^\s+|\s+$/g, '') result += '\r\n' return result; }
_Cualquier ayuda sobre cómo mejorar el formato del código es bienvenida_

Funciona bien y permite no modificar fuentes, gracias

Solo para que esté en la misma página, ¿no se solucionará esto a menos que se haga como PR?

Además de que no-consecutive-blank-lines no funciona en esta configuración (que debería funcionar con un cargador personalizado), solo estoy señalando que, incluso con las versiones recientes del paquete web y el cargador de vue, no puedo obtener el typeCheck: true trabajando para *.vue archivos porque tslint está satisfecho con la extensión (incluso con appendTsSuffixTo ). Este proyecto de demostración ofrece un ejemplo sencillo para jugar.

Marcos

¿Alguna noticia más aquí? 🤙

Si alguien quiere usar cli para filtrar su archivo .vue, puede probar vue-tslint . No es perfecto, pero funciona ...

Tenga en cuenta que la solución de @romandragan ahora no es la mejor práctica (no estoy seguro de si lo era anteriormente). En su lugar, agregue tslint-loader a sus reglas use en \.ts$ como lo haría con los archivos mecanografiados habituales; esto ahora es vue-loader maneja archivos de plantilla en general, delegando las diferentes secciones a la configuración de su Webpack para esas respectivas extensiones. El componente de complemento de vue-loader extraerá las reglas para \.ts$ y transmitirá los bloques <script lang="ts"> través de estas reglas.

Para aquellos que usan Vue CLI, agregue un

config.module.rule('ts')
  .use('tslint-loader')
  .loader('tslint-loader');

estado de cuenta a su opción chainWebpack en su vue.config.js . Por ejemplo,

vue.config.js

module.exports = {
  chainWebpack: (config) => {
    config.devtool('source-map');
    config.module.rule('ts')
      .use('tslint-loader')
      .loader('tslint-loader');
  },
  pluginOptions: {
    apollo: {
      enableMocks: true,
      enableEngine: true
    }
  }
}

Esto funcionó para mi

const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin')

module.exports = (baseConfig, env, defaultConfig) => {
  defaultConfig.resolve.extensions.push('.ts', '.tsx', '.vue', '.css', '.less', '.scss', '.sass', '.html')

  defaultConfig.module.rules.push( {
    test: /\.ts$/,
    exclude: /(node_modules)/,
    use: [
      {
        loader: 'ts-loader',
        options: {
          appendTsSuffixTo: [/\.vue$/]
          // transpileOnly: true,
        }
      },
      {
        loader: 'tslint-loader',
        options: {
          configFile: 'tslint.json',
          emitErrors: true,
        }
      }
    ]
  })

  defaultConfig.module.rules.push({ test: /\.less$/, loaders: [ 'style-loader', 'css-loader', 'less-loader' ] })
  defaultConfig.module.rules.push({ test: /\.scss$/, loaders: [ 'style-loader', 'css-loader', 'sass-loader' ] })
  defaultConfig.module.rules.push({ test: /\.styl$/, loader: 'style-loader!css-loader!stylus-loader' })

  defaultConfig.plugins.push(new ForkTsCheckerWebpackPlugin())

  return defaultConfig
}

Según # 4379, una solución alternativa específica de Vue no podrá aterrizar en el núcleo de TSLint:

Dada la falta de discusión o propuesta concreta aquí y la próxima desaprobación de TSLint a favor de ESLint (# 4534), continuaré y cerraré este problema y los informes específicos de Vue relacionados con fines de limpieza.

Si esto sigue siendo un problema para usted en typescript-eslint , le recomiendo que presente un problema allí. ¡La mejor de las suertes!

./node_modules/.bin/wotan 'src / * / .vue' -f detallado

Choca con:

Error: ENOENT: no such file or directory, open '/home/andrew/PycharmProjects/djangochat/fe/src/components/App.vue.ts'
    at Object.openSync (fs.js:451:3)
    at detectEncoding (/home/andrew/PycharmProjects/djangochat/fe/node_modules/tslint/lib/rules/encodingRule.js:67:17)
    at walk (/home/andrew/PycharmProjects/djangochat/fe/node_modules/tslint/lib/rules/encodingRule.js:49:20)
    at Rule.AbstractRule.applyWithFunction (/home/andrew/PycharmProjects/djangochat/fe/node_modules/tslint/lib/language/rule/abstractRule.js:39:9)
    at Rule.apply (/home/andrew/PycharmProjects/djangochat/fe/node_modules/tslint/lib/rules/encodingRule.js:33:21)
    at R.apply (/home/andrew/PycharmProjects/djangochat/fe/node_modules/@fimbul/bifrost/src/index.js:30:40)
    at Linter.applyRules (/home/andrew/PycharmProjects/djangochat/fe/node_modules/@fimbul/wotan/src/linter.js:209:31)
    at Linter.getFindings (/home/andrew/PycharmProjects/djangochat/fe/node_modules/@fimbul/wotan/src/linter.js:125:25)
    at Runner.lintFiles (/home/andrew/PycharmProjects/djangochat/fe/node_modules/@fimbul/wotan/src/runner.js:159:43)
    at lintFiles.next (<anonymous>) {
  errno: -2,
  syscall: 'open',
  code: 'ENOENT',
  path: '/home/andrew/PycharmProjects/djangochat/fe/src/components/App.vue.ts'
}

@akoidan, por favor

¿Fue útil esta página
0 / 5 - 0 calificaciones