From 563ae9c9c7a3f94a783bec9dd33360fbfeb78a2f Mon Sep 17 00:00:00 2001 From: vanilla-wave Date: Tue, 27 May 2025 10:02:36 +0200 Subject: [PATCH 1/2] feat: validate config file --- src/cli.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/cli.ts b/src/cli.ts index 3f62f7b..902538a 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -18,10 +18,18 @@ program .option('-u, --upload', 'Upload files to spec-box server') .option('--verbose', 'Enable verbose logging') .action(async (cliOptions: Partial) => { + const logger = createLogger(cliOptions.verbose ? 'debug' : 'info'); const explorer = cosmiconfig('spec-collector'); - const config = ((await explorer.search())?.config ?? {}) as Settings; + const searchConfigResult = await explorer.search(); - const logger = createLogger(cliOptions.verbose ? 'debug' : 'info'); + if (!searchConfigResult) { + logger.error( + 'Config file not found. Create config file https://github.com/spec-box/collector?tab=readme-ov-file#конфигурация', + ); + process.exit(1); + } + + const config = (searchConfigResult?.config ?? {}) as Settings; await collectSuite(config, cliOptions, logger); }); From fd6d308a4e45c6361c1dc8bd5d91562b9923e6cf Mon Sep 17 00:00:00 2001 From: vanilla-wave Date: Thu, 5 Jun 2025 17:40:02 +0200 Subject: [PATCH 2/2] feat: add init config command --- README.md | 19 ++++++++++++++++ src/cli.ts | 11 +++++++++ src/initCommand.ts | 56 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 src/initCommand.ts diff --git a/README.md b/README.md index 6e73b10..28f0471 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,18 @@ module.exports = { ## Использование +### Быстрый старт + +Создайте файл конфигурации с настройками по умолчанию: + +```bash +npx spec-collector init +``` + +Затем отредактируйте созданный файл `spec-collector.config.js` в соответствии с вашим проектом. + +### Запуск + Для корректной работе инструмента нужно чтобы запуск playwright тестов в list режиме отрабатывал без ошибок. Проверить можно выполнив ```bash @@ -86,6 +98,12 @@ npx spec-collector npx spec-collector -u ``` +### Команды CLI + +- `npx spec-collector init` — создать файл конфигурации с настройками по умолчанию +- `npx spec-collector init --force` — пересоздать файл конфигурации (перезаписать существующий) +- `npx spec-collector --help` — показать справку + ### Работа со сценариями Пакет дает возможность хранить в кодовой базе сценарии еще не написанных тестов. Playwright не будет видеть эти тесты и они не будут видны в отчетах. Сценарии могут использоваться для понимание реального тестового покрытия относительно целевого. @@ -109,6 +127,7 @@ test('Обычный тест', async ({page}) => { ## Структура проекта - `src/cli.ts` - CLI интерфейс +- `src/initCommand.ts` - Команда инициализации конфига - `src/index.ts` - Основной модуль - `src/SpecCollector.ts` - Класс для сбора спецификаций - `src/EmptyTestCollector.ts` - Класс для работы со сценариями diff --git a/src/cli.ts b/src/cli.ts index 902538a..fe1c986 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -6,6 +6,7 @@ import {collectSuite} from './index'; import {CliOptions, Settings} from './typings'; import {cosmiconfig} from 'cosmiconfig'; import {createLogger} from './logger'; +import {InitOptions, initCommand} from './initCommand'; const program = new Command(); @@ -14,6 +15,15 @@ program .description('Collect spec-box suite from code of your test files') .version(version); +program + .command('init') + .description('Create a spec-collector configuration file') + .option('-f, --force', 'Overwrite existing config file') + .action(async (options: InitOptions) => { + const logger = createLogger('info'); + await initCommand(options, logger); + }); + program .option('-u, --upload', 'Upload files to spec-box server') .option('--verbose', 'Enable verbose logging') @@ -26,6 +36,7 @@ program logger.error( 'Config file not found. Create config file https://github.com/spec-box/collector?tab=readme-ov-file#конфигурация', ); + logger.info('You can create a default config file by running: spec-collector init'); process.exit(1); } diff --git a/src/initCommand.ts b/src/initCommand.ts new file mode 100644 index 0000000..f6c4ab6 --- /dev/null +++ b/src/initCommand.ts @@ -0,0 +1,56 @@ +import {existsSync, writeFileSync} from 'node:fs'; +import {join} from 'node:path'; +import {Logger} from './logger'; + +export interface InitOptions { + force?: boolean; +} + +export async function initCommand(options: InitOptions, logger: Logger): Promise { + const configFileName = 'spec-collector.config.js'; + const configPath = join(process.cwd(), configFileName); + + if (existsSync(configPath) && !options.force) { + logger.error( + `Configuration file ${configFileName} already exists. Use --force to overwrite.`, + ); + process.exit(1); + } + + const defaultConfig = `module.exports = { + projects: [ + { + configPath: './playwright.config.ts', + // emptyTestsYamlPath: './specBoxTests.yml', // необязательно + // rootPath: './', // необязательно + }, + ], + // Настройки форматирования заголовков (необязательно) + formatTitle: { + remove: [], + replace: [], + }, + // Игнорируемые файлы (необязательно) + ignoreFiles: ['setup'], + // Количество уровней структуры (необязательно, по умолчанию 3) + levels: 3, + // Путь к выходному файлу (необязательно) + outputFile: './spec-collector-result.json', + // Настройки для загрузки в spec-box (необходимы только для опции --upload) + // host: 'https://your-spec-box-server.com', + // specBoxProject: 'your-project-name', +}; +`; + + try { + writeFileSync(configPath, defaultConfig, 'utf8'); + logger.info(`Configuration file created: ${configFileName}`); + logger.info('Please edit the configuration file to match your project setup.'); + logger.info( + 'For more information, see: https://github.com/spec-box/collector#конфигурация', + ); + } catch (error) { + logger.error(`Failed to create configuration file: ${(error as Error).message}`); + process.exit(1); + } +}