Skip to content

CheckerCli ​

Запускает внешнюю CLI-команду в рамках единого пайплайна генератора с cwd: rootDir. Команда выполняется синхронно через spawnSync. stdout успешного выполнения не попадает в логи, а при неуспешном попадает вывод команды, exit code, сигнал и другая доступная информация.

ts
name: string

Имя чекера для логов

ts
getCommand: (args: {
  changedFiles: Array<{
    relativePath: string;
    absolutePath: string;
  }>;
  deletedFiles: Array<{
    relativePath: string;
    absolutePath: string;
  }>;
  isFullGeneration: boolean;
}) => false | Array<string>

Функция возвращает массив, где первый элемент — команда, остальные — её аргументы. Возврат false пропускает проверку.

changedFiles — уникальные пути файлов, добавленных или изменённых пользователем в watch-режиме либо записанных генератором за все итерации текущего запуска.

deletedFiles — уникальные пути файлов, удалённых пользователем в watch-режиме либо генератором при cleanup за все итерации текущего запуска.

isFullGeneration — true для полного запуска runFullCycle() и false для инкрементального запуска в watch-режиме. Полезен для запуска полной проверки

При полной генерации и после удаления файлов запускаются все тесты, а при инкрементальной - только связанные с изменёнными файлами

ts
new CheckerCli({
  name: 'vitest',
  getCommand({ changedFiles, deletedFiles, isFullGeneration }) {
    const vitest = path.resolve(process.cwd(), 'node_modules/.bin/vitest');

    if (isFullGeneration || deletedFiles.length > 0) return [vitest, 'run'];

    if (changedFiles.length === 0) return false;

    return [vitest, 'related', '--run', ...changedFiles.map(({ relativePath }) => relativePath)];
  },
}),
Запустить Sandbox
USER: src/sum.ts создан с содержимым:
ts
export const sum = (a: number, b: number) => a + b;
USER: src/double.ts создан с содержимым:
ts
export const double = (value: number) => value * 2;
USER: src/obsolete.ts создан с содержимым:
ts
export const obsolete = true;
USER: tests/sum.test.ts создан с содержимым:
ts
import { expect, it } from 'vitest';
import { sum } from '../src/sum';

it('adds two numbers', () => {
  expect(sum(2, 3)).toBe(5);
});
USER: tests/double.test.ts создан с содержимым:
ts
import { expect, it } from 'vitest';
import { double } from '../src/double';

it('doubles a number', () => {
  expect(double(3)).toBe(6);
});
ARFA Generator выводит логи:
txt
[ARFA-GEN] finished in 0ms

Пример: Biome проверяет только изменённые файлы

Если измененных файлов не было (например, были только удаленные), проверка пропускается

ts
new CheckerCli({
  name: 'biome',
  getCommand({ changedFiles }) {
    if (changedFiles.length === 0) return false;

    return [
      path.resolve(process.cwd(), 'node_modules/.bin/biome'),
      'check',
      '--no-errors-on-unmatched',
      ...changedFiles.map(({ relativePath }) => relativePath),
    ];
  },
}),
Запустить Sandbox
USER: biome.json создан с содержимым:
json
{
  "formatter": {
    "indentStyle": "space",
    "indentWidth": 2
  },
  "javascript": {
    "formatter": {
      "quoteStyle": "single"
    }
  }
}
USER: src/draft.ts создан с содержимым:
ts
export const answer = 42;
ARFA Generator выводит логи:
txt
[ARFA-GEN] finished in 0ms

Пример: проверка типов через tsc

В данном случае tsc запускается для всего проекта, даже если были только удаленные файлы

ts
new CheckerCli({
  name: 'tsc',
  getCommand: () => [path.resolve(process.cwd(), 'node_modules/.bin/tsc')],
}),
Запустить Sandbox
USER: tsconfig.json создан с содержимым:
json
{
  "include": ["src"],
  "compilerOptions": {
    "target": "ES2023",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "noEmit": true,
    "strict": true,
    "types": []
  }
}
USER: src/count.ts создан с содержимым:
ts
export const count: number = 1;
ARFA Generator выводит логи:
txt
[ARFA-GEN] finished in 0ms

MIT License