UNPKG

@badeball/cypress-cucumber-preprocessor

Version:

[![Build status](https://github.com/badeball/cypress-cucumber-preprocessor/actions/workflows/build.yml/badge.svg)](https://github.com/badeball/cypress-cucumber-preprocessor/actions/workflows/build.yml) [![Npm package weekly downloads](https://badgen.net/n

108 lines (107 loc) 6.15 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.mutateConfigObjectPreservingly = mutateConfigObjectPreservingly; exports.rebuildOriginalConfigObject = rebuildOriginalConfigObject; exports.addCucumberPreprocessorPlugin = addCucumberPreprocessorPlugin; const fs_1 = __importDefault(require("fs")); const node_util_1 = require("node:util"); const messages_1 = require("@cucumber/messages"); const tag_expressions_1 = __importDefault(require("@cucumber/tag-expressions")); const gherkin_1 = require("@cucumber/gherkin"); const find_cypress_specs_1 = require("find-cypress-specs"); const constants_1 = require("./constants"); const cypress_task_definitions_1 = require("./cypress-task-definitions"); const plugin_event_handlers_1 = require("./plugin-event-handlers"); const preprocessor_configuration_1 = require("./preprocessor-configuration"); const type_guards_1 = require("./helpers/type-guards"); const environment_1 = require("./helpers/environment"); const memoize_1 = require("./helpers/memoize"); const assertions_1 = require("./helpers/assertions"); const debug_1 = __importDefault(require("./helpers/debug")); const resolve = (0, memoize_1.memoize)(preprocessor_configuration_1.resolve); function mutateConfigObjectPreservingly(config, property, value) { var _a; const preserved = (_a = config[constants_1.INTERNAL_PROPERTY_NAME]) !== null && _a !== void 0 ? _a : (config[constants_1.INTERNAL_PROPERTY_NAME] = {}); preserved[property] = config[property]; config[property] = value; } function rebuildOriginalConfigObject(config) { return Object.assign({}, config, config[constants_1.INTERNAL_PROPERTY_NAME]); } async function addCucumberPreprocessorPlugin(on, config, options = {}) { config.env[constants_1.INTERNAL_SUITE_PROPERTIES] = { isEventHandlersAttached: true }; const preprocessor = await resolve(config, config.env, "/"); if (!options.omitBeforeRunHandler) { on("before:run", () => (0, plugin_event_handlers_1.beforeRunHandler)(config)); } if (!options.omitAfterRunHandler) { on("after:run", (results) => (0, plugin_event_handlers_1.afterRunHandler)(config, results)); } if (!options.omitBeforeSpecHandler) { on("before:spec", (spec) => (0, plugin_event_handlers_1.beforeSpecHandler)(config, spec)); } if (!options.omitAfterSpecHandler) { on("after:spec", (spec, results) => (0, plugin_event_handlers_1.afterSpecHandler)(config, spec, results)); } if (!options.omitAfterScreenshotHandler) { on("after:screenshot", (details) => (0, plugin_event_handlers_1.afterScreenshotHandler)(config, details)); } on("task", { [cypress_task_definitions_1.TASK_SPEC_ENVELOPES]: plugin_event_handlers_1.specEnvelopesHandler.bind(null, config), [cypress_task_definitions_1.TASK_TEST_CASE_STARTED]: plugin_event_handlers_1.testCaseStartedHandler.bind(null, config), [cypress_task_definitions_1.TASK_TEST_STEP_STARTED]: plugin_event_handlers_1.testStepStartedHandler.bind(null, config), [cypress_task_definitions_1.TASK_TEST_STEP_FINISHED]: plugin_event_handlers_1.testStepFinishedHandler.bind(null, config, options), [cypress_task_definitions_1.TASK_TEST_CASE_FINISHED]: plugin_event_handlers_1.testCaseFinishedHandler.bind(null, config), [cypress_task_definitions_1.TASK_CREATE_STRING_ATTACHMENT]: plugin_event_handlers_1.createStringAttachmentHandler.bind(null, config), [cypress_task_definitions_1.TASK_FRONTEND_TRACKING_ERROR]: plugin_event_handlers_1.frontendTrackingErrorHandler.bind(null, config), }); const tags = (0, environment_1.getTags)(config.env); if (tags !== null && preprocessor.filterSpecs) { (0, debug_1.default)(`Filtering specs using expression ${(0, node_util_1.inspect)(tags)}`); const node = (0, tag_expressions_1.default)(tags); const testFiles = (0, find_cypress_specs_1.getSpecs)(config, "foobar", true).filter((testFile) => { if (!testFile.endsWith(".feature")) { switch (preprocessor.filterSpecsMixedMode) { case "hide": return false; case "show": return true; case "empty-set": return node.evaluate([]); default: (0, assertions_1.assertNever)(preprocessor.filterSpecsMixedMode); } } const content = fs_1.default.readFileSync(testFile).toString("utf-8"); const options = { includeSource: false, includeGherkinDocument: false, includePickles: true, newId: messages_1.IdGenerator.incrementing(), }; const envelopes = (0, gherkin_1.generateMessages)(content, testFile, messages_1.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN, options); const pickles = envelopes .map((envelope) => envelope.pickle) .filter(type_guards_1.notNull); return pickles.some((pickle) => { var _a, _b; return node.evaluate((_b = (_a = pickle.tags) === null || _a === void 0 ? void 0 : _a.map((tag) => tag.name).filter(type_guards_1.notNull)) !== null && _b !== void 0 ? _b : []); }); }); (0, debug_1.default)(`Resolved specs ${(0, node_util_1.inspect)(testFiles)}`); const propertyName = "specPattern" in config ? "specPattern" : "testFiles"; /** * The preprocessor needs the original value at a later point in order to determine the implicit * integration folder correctly. Otherwise, scoping test files using tags would affect definition * resolvement and yield surprising results. */ mutateConfigObjectPreservingly(config, propertyName, testFiles); } if (preprocessor.dryRun) { config.supportFile = false; } return config; }