playwright-bdd
Version:
BDD Testing with Playwright runner
88 lines • 3.77 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.testCommand = void 0;
exports.assertConfigsCount = assertConfigsCount;
const node_worker_threads_1 = require("node:worker_threads");
const node_events_1 = require("node:events");
const node_os_1 = __importDefault(require("node:os"));
const node_path_1 = __importDefault(require("node:path"));
const commander_1 = require("commander");
const generate_1 = require("../../generate");
const loadConfig_1 = require("../../playwright/loadConfig");
const env_1 = require("../../config/env");
const exit_1 = require("../../utils/exit");
const defaults_1 = require("../../config/defaults");
const bddgenPhase_1 = require("../helpers/bddgenPhase");
const warnings_1 = require("../../config/warnings");
const p_map_1 = require("../../utils/p-map");
const logger_1 = require("../../utils/logger");
const GEN_WORKER_PATH = node_path_1.default.resolve(__dirname, '..', 'worker.js');
exports.testCommand = new commander_1.Command('test')
.description('Generate Playwright test files from Gherkin documents')
.configureHelp({ showGlobalOptions: true })
.option('--tags <expression>', `Tags expression to filter scenarios for generation`)
.option('--verbose', `Verbose mode (default: ${Boolean(defaults_1.defaults.verbose)})`)
.action(async () => {
const opts = exports.testCommand.optsWithGlobals();
(0, bddgenPhase_1.setBddGenPhase)();
await (0, loadConfig_1.loadConfig)(opts.config);
const configs = readConfigsFromEnv();
mergeCliOptions(configs, opts);
const isVerbose = hasVerboseFlag(configs);
await generateFilesForConfigs(configs);
if (isVerbose)
printDone();
});
function readConfigsFromEnv() {
const configs = Object.values((0, env_1.getEnvConfigs)());
assertConfigsCount(configs);
(0, warnings_1.showWarnings)(configs);
return configs;
}
function mergeCliOptions(configs, opts) {
configs.forEach((config) => {
if ('tags' in opts)
config.tags = opts.tags;
if ('verbose' in opts)
config.verbose = Boolean(opts.verbose);
});
}
function assertConfigsCount(configs) {
if (configs.length === 0) {
(0, exit_1.exit)(`No BDD configs found. Did you use defineBddConfig() in playwright.config.ts?`);
}
}
async function generateFilesForConfigs(configs) {
// run first config in main thread and other in workers (to have fresh require cache)
// See: https://github.com/vitalets/playwright-bdd/issues/32
const [firstConfig, ...restConfigs] = configs;
await new generate_1.TestFilesGenerator(firstConfig).generate();
if (restConfigs.length > 0) {
await (0, p_map_1.pMap)(restConfigs, runInWorker, getMaxWorkers());
}
}
function getMaxWorkers() {
// Use os.availableParallelism (Node 18.14+) with fallback to os.cpus().
// Cap at half the available CPUs to avoid OOM in memory-constrained CI environments.
return Math.max(1, Math.floor((node_os_1.default.availableParallelism?.() ?? node_os_1.default.cpus().length) / 2));
}
async function runInWorker(config) {
const worker = new node_worker_threads_1.Worker(GEN_WORKER_PATH, {
workerData: { config },
});
const [exitCode] = await (0, node_events_1.once)(worker, 'exit');
if (exitCode)
(0, exit_1.exit)();
}
function hasVerboseFlag(configs) {
return configs.some((config) => config.verbose);
}
function printDone() {
const logger = new logger_1.Logger({ verbose: true });
const duration = process.uptime().toFixed(1);
logger.log(`Done (${duration}s).`);
}
//# sourceMappingURL=test.js.map