Удаление текста из середины строки при исправлении правила tslint - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь создать правило tslint, которое помешает нашим тестировщикам представить тест / тест, который включает .only.

Так что, если они пытаются зафиксировать файл, который включает fixture.only или test.only, то фиксация завершится неудачно (я использую ловушки Husky + git для выполнения команды tslint при фиксации).

Я выяснил, как создать правило (что означает, что фиксация не удалась), но было бы неплохо также автоматически удалить этот код (исправление фиксации).

Есть ли способ сделать это? Я не могу найти, как удалить текст из середины узла, только с самого начала.

Вот код JS

import * as ts from 'typescript';
import * as Lint from 'tslint';
import { IOptions } from 'tslint';

export class Rule extends Lint.Rules.AbstractRule {
  public static FAILURE_STRING = "Something bad happened - you're not 
  following the rules";

  public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] {
     return this.applyWithWalker(new TestcafeNoOnly(sourceFile, 
        this.getOptions()));
  }
}

// This worker visits every source file
class TestcafeNoOnly extends Lint.RuleWalker {
   private readonly FAILURE_STRING = 'Testcafe no only';
   private readonly PROHIBITED = ['fixture.only', 'test.only'];
   private readonly REGEX = new RegExp('^(' + this.PROHIBITED.join('|') + ')$');

  constructor(sourceFile: ts.SourceFile, options: IOptions) {
     super(sourceFile, options);
  }

  public visitCallExpression(node: ts.CallExpression) {
     const match = 
     node.expression.getText().replace(/(\r\n\t|\n|\r\t|\s)/gm, '').trim().match(this.REGEX);

    if (match) {
       const fix = Lint.Replacement.deleteText(node.getStart(), 5);
       this.addFailureAt(node.getStart(), match[0].length, this.FAILURE_STRING, fix);
    }

   super.visitCallExpression(node);
 }
}

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Решением может быть дублирование вашего текущего tslint.json на (например) tslint-no-only.json.

В tslint-no-only.json изменить секцию rules:

"rules": {
        ...
        "ban": [
            true,
            "eval",
            {
                "name": ["test", "only"],
                "message": "do not commit with test.only"
            },
            {
                "name": ["fixture", "only"],
                "message": "do not commit with fixture.only"
            }
        ]
    }

Просто укажите этот новый файл tslint в конфигурации Husky.

0 голосов
/ 13 января 2019

Это правило уже существует в tslint-microsoft-contrib как mocha-avoid-only. Ура!

Вы звоните node.getStart(), где node - это CallExpression, так что вы получаете начало describe.only(...).

  • node.expression является describe
  • node.name является only

Вы хотите удалить с конца node.expression (поэтому он включает ., даже если там есть пробел) до конца node.name. Что-то вроде:

Lint.Replacement.deleteFromTo(node.name.end, node.expression.end);
...