Как я могу использовать пользовательское правило tslint, написанное на TypeScript с vscode-tslint без компиляции в JS? - PullRequest
6 голосов
/ 10 июня 2019

У меня есть пользовательское правило, написанное для TSlint на TypeScript, которое я могу запустить с помощью ts-node в сценарии, который я использую на своей виртуальной машине Linux:

#!/bin/bash
set -e
ROOT_DIR=$(dirname $(dirname $0))
cd $ROOT_DIR
find "$ROOT_DIR/src" -name "*.ts" -o -name "*.tsx" | xargs $(yarn bin)/ts-node $(yarn bin)/tslint

Это позволяет tslint запускатьПравило TS напрямую без предварительной компиляции, и оно работает.

Проблема в том, что ms-vscode.vscode-typescript-tslint-plugin не принимает это правило, даже если оно явно включено в правилах tsconfig.json.Я запускаю VSCode на отдельной машине с хостом Windows, монтирую файловую систему через Samba, обслуживаемую с виртуальной машины Linux.Другие правила в файле соблюдаются и показываются для установленных и встроенных правил, например no-console и т. Д.

Как получить информацию о том, почему правило не применяется?Что-то мне нужно настроить в плагине, чтобы это работало?

Ответы [ 3 ]

0 голосов
/ 25 июня 2019

К сожалению, это не поддерживается VScode / vscode-typescript-tslint-plugin и, похоже, не входит в их повестку дня.

Вот закрытый вопрос на их GitHub, запрашивающий эту функцию.

Конечно, вы можете сначала скомпилировать свое правило для JS, но это не то, что вы просили.

0 голосов
/ 25 июня 2019

Взлом, который я разрабатываю, выглядит так:

  1. Предположим, ваши пользовательские правила находятся под ./rules, каталог выглядит так:
rules/
  |- registerRule.js
  |- oneRule.ts
  |- twoRule.ts
  1. oneRule.ts и twoRule.ts - фактические правила, написанные на машинописи, но registerRule.js - «шпион». Цель этого шпионского правила - просто подхватить себя экземпляром tslint и внедрить ts-node/register во время выполнения узла.
// registerRule.js

require('ts-node/register')

const Lint = require('tslint')

class Rule extends Lint.Rules.AbstractRule {
  apply(sourceFile) {
    return []
  }
}

module.exports.Rule = Rule
  1. настройка tslint.json
{
  "rulesDirectory": "./rules",
  "rules": {
    "register": true,
    "one": true,
    "two": true
  }
}

Я проверял. Этот хак научит плагин vscode tslint понимать .ts пользовательские правила.

0 голосов
/ 24 июня 2019

Вот то, что я думаю, может быть связано с проблемой.

  • Назовем файл правил noImportsRule.ts. Правила ссылаются на tslint.json с их идентификатором в кебабе, поэтому "no-imports": true настроит правило.

  • Основные правила не могут быть перезаписаны пользовательской реализацией.

  • Пользовательские правила также могут принимать параметры, аналогичные основным правилам (извлекается с помощью this.getOptions())

  • Начиная с версии TSLint v5.7.0 вам больше не нужно компилировать пользовательские правила перед их использованием. Вы должны указать node.js, как загружать файлы .ts, например, используя ts-node:

Важные соглашения:

  • Идентификаторы правил всегда в кебабе.
  • Файлы правил всегда в верблюжьей клетке (camelCasedRule.ts).
  • Файлы правил должны содержать суффикс Rule.
  • Экспортируемый класс должен всегда называться Rule и расширяться от Lint.Rules.AbstractRule

для всех подробнее

...