Bin
2025-12-16 9e0b2ba2c317b1a86212f24cbae3195ad1f3dbfa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
const { event } = require("codeceptjs");
 
const REPLACE_ARGS_RULE = "replaceArgs";
const HIDE_FUNCTION_RULE = "hideFunction";
 
const RULES = {
  REPLACE_ARGS_RULE,
  HIDE_FUNCTION_RULE,
};
 
/**
 * @typedef  stepNameMatcher
 *
 */
 
/**
 * @typedef {object} modifyStepConfig
 * @property {boolean|string|string[]|RegExp|RegExp[]} [stepNameMatcher=true] - affected steps matcher
 * @property {Function|'replaceArgs'|'hideFunction'} [rule=REPLACE_RULE] - replacing rule
 * @property {any[]} [params]
 */
 
/**
 * @typedef {Object} stepLogsModifierConfig
 * @property {modifyStepConfig[]} [modifyStepLogs] - List of step modifiers
 */
 
/**
 * @type {stepLogsModifierConfig}
 */
const defaultConfig = {
  modifyStepLogs: [
    {
      stepNameMatcher: true,
      rule: REPLACE_ARGS_RULE,
      params: ["[args]"],
    },
  ],
};
 
/**
 * This plugin can modify step logs.
 * The main goal is making step logs more compact.
 * @param {stepLogsModifierConfig} config
 */
module.exports = (config) => {
  const options = Object.assign({}, defaultConfig, config);
 
  const RULES = {
    [REPLACE_ARGS_RULE](step, replacer) {
      step.toString = replaceArgsStepToString.bind(step, replacer);
      step.toCode = replaceArgsStepToCode.bind(step, replacer);
    },
    [HIDE_FUNCTION_RULE](step) {
      const functionName = step.args?.[0]?.name || "<anonymous>";
 
      step.toString = replaceArgsStepToString.bind(step, functionName);
      step.toCode = replaceArgsStepToCode.bind(step, functionName);
    },
  };
 
  function replaceArgsStepToString(replacer) {
    return `${this.prefix}${this.actor} ${this.humanize()} ${replacer}${this.suffix}`;
  }
  function replaceArgsStepToCode(replacer) {
    return `${this.prefix}${this.actor}.${this.name}(${replacer})${this.suffix}`;
  }
 
  function testStep(matcher, stepName) {
    if (typeof matcher === "boolean") return matcher;
    if (typeof matcher === "string") return matcher === stepName;
    if (matcher instanceof RegExp) return matcher.test(stepName);
    if (Array.isArray(matcher)) return matcher.some((f) => testStep(f, stepName));
    return false;
  }
 
  function modifyStep(step) {
    if (step.metaStep) {
      modifyStep(step.metaStep);
    }
    for (const modifierParams of options.modifyStepLogs) {
      if (testStep(modifierParams.stepNameMatcher, step.name)) {
        if (typeof modifierParams.rule === "function") {
          modifierParams.rule(step);
        } else {
          if (RULES[modifierParams.rule]) {
            RULES[modifierParams.rule](step, ...(modifierParams.params || []));
          } else {
            console.error("There is no step modifier rule called `", modifierParams.rule, "`");
          }
        }
      }
    }
  }
 
  event.dispatcher.on(event.step.before, modifyStep);
};
 
module.exports.defaultConfig = defaultConfig;
module.exports.RULES = RULES;