export async function normalizeOptions()

in src/options.ts [42:166]


export async function normalizeOptions(
  cliArgs: CliArgs,
  mode: Mode = 'run'
): Promise<RunOptions> {
  /**
   * Move filtering flags from the top level to filter object
   * and delete the old keys
   */
  const grepOpts = {
    pattern: cliArgs.pattern,
    tags: cliArgs.tags,
    match: cliArgs.match,
  };
  delete cliArgs.pattern;
  delete cliArgs.tags;
  delete cliArgs.match;

  const options: RunOptions = {
    ...cliArgs,
    grepOpts,
    environment: process.env['NODE_ENV'] || 'development',
  };
  /**
   * Validate and read synthetics config file based on the environment
   */
  const config =
    cliArgs.config || !cliArgs.inline
      ? await readConfig(options.environment, cliArgs.config)
      : {};

  options.params = Object.freeze(merge(config.params, cliArgs.params || {}));
  options.fields = Object.freeze(
    merge(config.monitor?.fields ?? {}, cliArgs?.fields || {})
  );

  /**
   * Merge playwright options from CLI and Synthetics config
   * and prefer individual options over other option
   */
  const playwrightOpts = merge(
    config.playwrightOptions,
    cliArgs.playwrightOptions || {},
    {
      arrayMerge(target, source) {
        if (source && source.length > 0) {
          return [...new Set(source)];
        }
        return target;
      },
    }
  );
  options.playwrightOptions = {
    ...playwrightOpts,
    headless: getHeadlessFlag(cliArgs.headless, playwrightOpts?.headless),
    chromiumSandbox: cliArgs.sandbox ?? playwrightOpts?.chromiumSandbox,
    ignoreHTTPSErrors:
      cliArgs.ignoreHttpsErrors ?? playwrightOpts?.ignoreHTTPSErrors,
  };

  /**
   * Merge default options based on the mode of operation whether we are running tests locally
   * or pushing the project monitors
   */
  switch (mode) {
    case 'run':
      if (cliArgs.capability) {
        const supportedCapabilities = [
          'trace',
          'network',
          'filmstrips',
          'metrics',
          'ssblocks',
        ];
        /**
         * trace - record chrome trace events(LCP, FCP, CLS, etc.) for all journeys
         * network - capture network information for all journeys
         * filmstrips - record detailed filmstrips for all journeys
         * metrics - capture performance metrics (DOM Nodes, Heap size, etc.) for each step
         * ssblocks - Dedupes the screenshots in to blocks to save storage space
         */
        for (const flag of cliArgs.capability) {
          if (supportedCapabilities.includes(flag)) {
            options[flag] = true;
          } else {
            console.warn(
              `Missing capability "${flag}", current supported capabilities are ${supportedCapabilities.join(
                ', '
              )}`
            );
          }
        }
      }

      /**
       * Group all events that can be consumed by heartbeat and
       * eventually by the Synthetics UI.
       */
      if (cliArgs.richEvents) {
        options.reporter = cliArgs.reporter ?? 'json';
        options.ssblocks = true;
        options.network = true;
        options.trace = true;
        options.quietExitCode = true;
      }

      options.screenshots = cliArgs.screenshots ?? 'on';
      break;
    case 'push':
      /**
       * Merge the default monitor config from synthetics.config.ts file
       * with the CLI options passed via push command
       */
      const monitor = config.monitor;
      for (const key of Object.keys(monitor || {})) {
        // screenshots require special handling as the flags are different
        if (key === 'screenshot') {
          options.screenshots = options.screenshots ?? monitor[key];
          continue;
        }
        options[key] = options[key] ?? monitor[key];
      }
      break;
  }
  return options;
}