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;
}