diff --git a/packages/cli/src/commands/deploy.ts b/packages/cli/src/commands/deploy.ts index 72632550..fa11a7db 100644 --- a/packages/cli/src/commands/deploy.ts +++ b/packages/cli/src/commands/deploy.ts @@ -106,6 +106,7 @@ export default class Deploy extends AuthCommand { ignoreDirectoriesMatch: checklyConfig.checks?.ignoreDirectoriesMatch, checkDefaults: checklyConfig.checks, browserCheckDefaults: checklyConfig.checks?.browserChecks, + monitorDefaults: checklyConfig.checks?.monitors, availableRuntimes: avilableRuntimes.reduce((acc, runtime) => { acc[runtime.name] = runtime return acc diff --git a/packages/cli/src/commands/import/plan.ts b/packages/cli/src/commands/import/plan.ts index ab9b7ebf..8c6b4579 100644 --- a/packages/cli/src/commands/import/plan.ts +++ b/packages/cli/src/commands/import/plan.ts @@ -967,6 +967,7 @@ ${chalk.cyan('For safety, resources are not deletable until the plan has been co ignoreDirectoriesMatch: checklyConfig.checks?.ignoreDirectoriesMatch, checkDefaults: checklyConfig.checks, browserCheckDefaults: checklyConfig.checks?.browserChecks, + monitorDefaults: checklyConfig.checks?.monitors, availableRuntimes: availableRuntimes.reduce((acc, runtime) => { acc[runtime.name] = runtime return acc diff --git a/packages/cli/src/commands/pw-test.ts b/packages/cli/src/commands/pw-test.ts index 090efbb6..6d6a9aa2 100644 --- a/packages/cli/src/commands/pw-test.ts +++ b/packages/cli/src/commands/pw-test.ts @@ -139,6 +139,7 @@ export default class PwTestCommand extends AuthCommand { checkMatch: checklyConfig.checks?.checkMatch, ignoreDirectoriesMatch: checklyConfig.checks?.ignoreDirectoriesMatch, checkDefaults: checklyConfig.checks, + monitorDefaults: checklyConfig.checks?.monitors, availableRuntimes: availableRuntimes.reduce((acc, runtime) => { acc[runtime.name] = runtime return acc diff --git a/packages/cli/src/commands/test.ts b/packages/cli/src/commands/test.ts index bd0b8185..3a4e3b75 100644 --- a/packages/cli/src/commands/test.ts +++ b/packages/cli/src/commands/test.ts @@ -176,6 +176,7 @@ export default class Test extends AuthCommand { ignoreDirectoriesMatch: checklyConfig.checks?.ignoreDirectoriesMatch, checkDefaults: checklyConfig.checks, browserCheckDefaults: checklyConfig.checks?.browserChecks, + monitorDefaults: checklyConfig.checks?.monitors, availableRuntimes: availableRuntimes.reduce((acc, runtime) => { acc[runtime.name] = runtime return acc diff --git a/packages/cli/src/commands/validate.ts b/packages/cli/src/commands/validate.ts index fa906b6e..404b1003 100644 --- a/packages/cli/src/commands/validate.ts +++ b/packages/cli/src/commands/validate.ts @@ -52,6 +52,7 @@ export default class Validate extends AuthCommand { ignoreDirectoriesMatch: checklyConfig.checks?.ignoreDirectoriesMatch, checkDefaults: checklyConfig.checks, browserCheckDefaults: checklyConfig.checks?.browserChecks, + monitorDefaults: checklyConfig.checks?.monitors, availableRuntimes: avilableRuntimes.reduce((acc, runtime) => { acc[runtime.name] = runtime return acc diff --git a/packages/cli/src/constructs/__tests__/tcp-monitor.spec.ts b/packages/cli/src/constructs/__tests__/tcp-monitor.spec.ts index ffbafeda..34cbd4b3 100644 --- a/packages/cli/src/constructs/__tests__/tcp-monitor.spec.ts +++ b/packages/cli/src/constructs/__tests__/tcp-monitor.spec.ts @@ -1,4 +1,4 @@ -import { describe, it, expect } from 'vitest' +import { describe, it, expect, afterAll, beforeEach } from 'vitest' import { TcpMonitor, CheckGroup, TcpRequest } from '../index' import { Project, Session } from '../project' @@ -9,6 +9,14 @@ const request: TcpRequest = { } describe('TcpMonitor', () => { + function clearDefaults () { + Session.checkDefaults = undefined + Session.monitorDefaults = undefined + } + + beforeEach(clearDefaults) + afterAll(clearDefaults) + it('should apply default check settings', () => { Session.project = new Project('project-id', { name: 'Test Project', @@ -19,10 +27,36 @@ describe('TcpMonitor', () => { name: 'Test Check', request, }) - Session.checkDefaults = undefined expect(check).toMatchObject({ tags: ['default tags'] }) }) + it('should apply default monitor settings', () => { + Session.project = new Project('project-id', { + name: 'Test Project', + repoUrl: 'https://github.com/checkly/checkly-cli', + }) + Session.monitorDefaults = { tags: ['default tags'] } + const check = new TcpMonitor('test-check', { + name: 'Test Check', + request, + }) + expect(check).toMatchObject({ tags: ['default tags'] }) + }) + + it('should prefer monitor settings over check settings', () => { + Session.project = new Project('project-id', { + name: 'Test Project', + repoUrl: 'https://github.com/checkly/checkly-cli', + }) + Session.checkDefaults = { tags: ['check default tags'] } + Session.monitorDefaults = { tags: ['monitor default tags'] } + const check = new TcpMonitor('test-check', { + name: 'Test Check', + request, + }) + expect(check).toMatchObject({ tags: ['monitor default tags'] }) + }) + it('should overwrite default check settings with check-specific config', () => { Session.project = new Project('project-id', { name: 'Test Project', @@ -34,7 +68,6 @@ describe('TcpMonitor', () => { tags: ['test check'], request, }) - Session.checkDefaults = undefined expect(check).toMatchObject({ tags: ['test check'] }) }) diff --git a/packages/cli/src/constructs/check-group-ref.ts b/packages/cli/src/constructs/check-group-ref.ts index 3cfec1eb..a9f6478b 100644 --- a/packages/cli/src/constructs/check-group-ref.ts +++ b/packages/cli/src/constructs/check-group-ref.ts @@ -1,4 +1,4 @@ -import { CheckConfigDefaults } from '../services/checkly-config-loader' +import { CheckConfigDefaults, MonitorConfigDefaults } from '../services/checkly-config-loader' import { CheckGroupV1 } from './check-group-v1' import { Construct } from './construct' import { Session } from './project' @@ -32,6 +32,11 @@ export class CheckGroupRef extends Construct { return {} } + public getMonitorDefaults (): MonitorConfigDefaults { + // See the comment for getCheckDefaults(), the same applies here. + return {} + } + synthesize () { return null } diff --git a/packages/cli/src/constructs/check-group-v1.ts b/packages/cli/src/constructs/check-group-v1.ts index a2aa0823..51f2f5cd 100644 --- a/packages/cli/src/constructs/check-group-v1.ts +++ b/packages/cli/src/constructs/check-group-v1.ts @@ -9,7 +9,6 @@ import { ApiCheckDefaultConfig } from './api-check' import type { Region } from '..' import { type Frequency } from './frequency' import { - type RetryStrategy, // eslint-disable-next-line @typescript-eslint/no-unused-vars type RetryStrategyBuilder, // Used for @links in comments. } from './retry-strategy' @@ -17,7 +16,7 @@ import { AlertEscalation } from './alert-escalation-policy' import { Diagnostics } from './diagnostics' import { DeprecatedConstructDiagnostic, DeprecatedPropertyDiagnostic, InvalidPropertyValueDiagnostic } from './construct-diagnostics' import CheckTypes from '../constants' -import { CheckConfigDefaults } from '../services/checkly-config-loader' +import { CheckConfigDefaults, MonitorConfigDefaults } from '../services/checkly-config-loader' import { pathToPosix } from '../services/util' import { AlertChannelSubscription } from './alert-channel-subscription' import { BrowserCheck } from './browser-check' @@ -28,6 +27,8 @@ import { PrivateLocationGroupAssignment } from './private-location-group-assignm import { Ref } from './ref' import { Session } from './project' import { validateDeprecatedDoubleCheck } from './internal/common-diagnostics' +import { CheckRetryStrategy } from './check' +import { MonitorRetryStrategy } from './monitor' const defaultApiCheckDefaults: ApiCheckDefaultConfig = { headers: [], @@ -53,6 +54,13 @@ type MultiStepCheckConfig = CheckConfigDefaults & { testMatch: string | string[], } +/** + * Retry strategies supported by groups. + */ +export type GroupRetryStrategy = + | CheckRetryStrategy + | MonitorRetryStrategy + export interface CheckGroupV1Props { /** * The name of the check group. @@ -236,7 +244,7 @@ export interface CheckGroupV1Props { * * If not set, retries are disabled for all checks in the group. */ - retryStrategy?: RetryStrategy + retryStrategy?: GroupRetryStrategy /** * Determines whether the checks in the group should run on all selected @@ -298,7 +306,7 @@ export class CheckGroupV1 extends Construct { apiCheckDefaults: ApiCheckDefaultConfig browserChecks?: BrowserCheckConfig multiStepChecks?: MultiStepCheckConfig - retryStrategy?: RetryStrategy + retryStrategy?: GroupRetryStrategy runParallel?: boolean alertSettings?: AlertEscalation useGlobalAlertSettings?: boolean @@ -485,6 +493,12 @@ export class CheckGroupV1 extends Construct { } } + public getMonitorDefaults (): MonitorConfigDefaults { + return { + frequency: this.frequency, + } + } + synthesize () { return { name: this.name, diff --git a/packages/cli/src/constructs/check-group-v2.ts b/packages/cli/src/constructs/check-group-v2.ts index fde4c968..6a2c47c0 100644 --- a/packages/cli/src/constructs/check-group-v2.ts +++ b/packages/cli/src/constructs/check-group-v2.ts @@ -1,7 +1,6 @@ import { PrivateLocation, PrivateLocationRef } from './private-location' import type { Region } from '..' import { - type RetryStrategy, // eslint-disable-next-line @typescript-eslint/no-unused-vars type RetryStrategyBuilder, // Used for @links in comments. } from './retry-strategy' @@ -11,7 +10,7 @@ import { type AlertEscalationBuilder, // Used for @links in comments. } from './alert-escalation-policy' import { Diagnostics } from './diagnostics' -import { CheckGroupV1, CheckGroupV1Props } from './check-group-v1' +import { CheckGroupV1, CheckGroupV1Props, GroupRetryStrategy } from './check-group-v1' import { validateRemovedDoubleCheck } from './internal/common-diagnostics' export interface CheckGroupV2Props extends Omit { @@ -73,7 +72,7 @@ export interface CheckGroupV2Props extends Omit testOnly?: boolean - retryStrategy?: RetryStrategy + retryStrategy?: CheckRetryStrategy alertSettings?: AlertEscalation useGlobalAlertSettings?: boolean runParallel?: boolean diff --git a/packages/cli/src/constructs/monitor.ts b/packages/cli/src/constructs/monitor.ts index 77f3b401..ddd5aefd 100644 --- a/packages/cli/src/constructs/monitor.ts +++ b/packages/cli/src/constructs/monitor.ts @@ -7,10 +7,20 @@ import { CheckGroupV2 } from './check-group-v2' import { Frequency } from './frequency' import { IncidentTrigger } from './incident' import { PrivateLocation, PrivateLocationRef } from './private-location' -import { RetryStrategy } from './retry-strategy' +import { NoRetriesRetryStrategy, RetryStrategyType, SingleRetryStrategy } from './retry-strategy' import { Check, CheckProps } from './check' import { Diagnostics } from './diagnostics' import { validateRemovedDoubleCheck } from './internal/common-diagnostics' +import { InvalidPropertyValueDiagnostic } from './construct-diagnostics' +import { ConfigDefaultsGetter, makeConfigDefaultsGetter } from './check-config' +import { Session } from './project' + +/** + * Retry strategies supported by monitors. + */ +export type MonitorRetryStrategy = + | SingleRetryStrategy + | NoRetriesRetryStrategy export interface MonitorProps extends Omit { /** @@ -74,8 +84,19 @@ export interface MonitorProps extends Omit { /** * Sets a retry policy for the monitor. Use RetryStrategyBuilder to create a * suitable retry strategy. + * + * Note that monitors only support a single retry. + * + * @example + * ```typescript + * // Single retry + * RetryStrategyBuilder.singleRetry() + * + * // No retries + * RetryStrategyBuilder.noRetries() + * ``` */ - retryStrategy?: RetryStrategy + retryStrategy?: MonitorRetryStrategy /** * Determines whether the monitor should create and resolve an incident * based on its alert configuration. @@ -95,6 +116,38 @@ export abstract class Monitor extends Check { await validateRemovedDoubleCheck(diagnostics, this) } + async validate (diagnostics: Diagnostics): Promise { + await super.validate(diagnostics) + + if (this.retryStrategy) { + const supported: RetryStrategyType[] = ['SINGLE', 'NO_RETRIES'] + if (!supported.includes(this.retryStrategy.type)) { + diagnostics.add(new InvalidPropertyValueDiagnostic( + 'retryStrategy', + new Error( + `Monitors only support a single retry. The following options ` + + `are available:` + + `\n\n` + + ` // Single retry\n` + + ` RetryStrategyBuilder.singleRetry()` + + `\n\n` + + ` // No retries\n` + + ` RetryStrategyBuilder.noRetries()`, + ), + )) + } + } + } + + protected configDefaultsGetter (props: MonitorProps): ConfigDefaultsGetter { + return makeConfigDefaultsGetter( + props.group?.getMonitorDefaults(), + Session.monitorDefaults, + props.group?.getCheckDefaults(), + Session.checkDefaults, + ) + } + synthesize() { return { ...super.synthesize(), diff --git a/packages/cli/src/constructs/project.ts b/packages/cli/src/constructs/project.ts index 2b9496e2..b66738b1 100644 --- a/packages/cli/src/constructs/project.ts +++ b/packages/cli/src/constructs/project.ts @@ -1,7 +1,7 @@ import path from 'node:path' import * as api from '../rest/api' -import { CheckConfigDefaults } from '../services/checkly-config-loader' +import { CheckConfigDefaults, MonitorConfigDefaults } from '../services/checkly-config-loader' import { Parser } from '../services/check-parser/parser' import { Construct } from './construct' import { ValidationError } from './validator-error' @@ -226,6 +226,7 @@ export class Session { static checkFilter?: CheckFilter static browserCheckDefaults?: CheckConfigDefaults static multiStepCheckDefaults?: CheckConfigDefaults + static monitorDefaults?: MonitorConfigDefaults static checkFilePath?: string static checkFileAbsolutePath?: string static availableRuntimes: Record diff --git a/packages/cli/src/constructs/retry-strategy-codegen.ts b/packages/cli/src/constructs/retry-strategy-codegen.ts index 92f483a2..72ec11c8 100644 --- a/packages/cli/src/constructs/retry-strategy-codegen.ts +++ b/packages/cli/src/constructs/retry-strategy-codegen.ts @@ -6,27 +6,52 @@ export type RetryStrategyResource = RetryStrategy export function valueForRetryStrategy (genfile: GeneratedFile, strategy?: RetryStrategyResource | null): Value { genfile.namedImport('RetryStrategyBuilder', 'checkly/constructs') - function buildCommonOptions ( + function buildBaseBackoffSecondsOption ( options: RetryStrategyOptions, builder: ObjectValueBuilder, ): void { if (options.baseBackoffSeconds) { builder.number('baseBackoffSeconds', options.baseBackoffSeconds) } + } + function buildMaxRetriesOption ( + options: RetryStrategyOptions, + builder: ObjectValueBuilder, + ): void { if (options.maxRetries) { builder.number('maxRetries', options.maxRetries) } + } + function buildMaxDurationSecondsOption ( + options: RetryStrategyOptions, + builder: ObjectValueBuilder, + ): void { if (options.maxDurationSeconds) { builder.number('maxDurationSeconds', options.maxDurationSeconds) } + } + function buildSameRegionOption ( + options: RetryStrategyOptions, + builder: ObjectValueBuilder, + ): void { if (options.sameRegion !== undefined) { builder.boolean('sameRegion', options.sameRegion) } } + function buildCommonOptions ( + options: RetryStrategyOptions, + builder: ObjectValueBuilder, + ): void { + buildBaseBackoffSecondsOption(options, builder) + buildMaxRetriesOption(options, builder) + buildMaxDurationSecondsOption(options, builder) + buildSameRegionOption(options, builder) + } + if (strategy === null || strategy === undefined) { return expr(ident('RetryStrategyBuilder'), builder => { builder.member(ident('noRetries')) @@ -64,6 +89,16 @@ export function valueForRetryStrategy (genfile: GeneratedFile, strategy?: RetryS }) }) }) + case 'SINGLE': + return expr(ident('RetryStrategyBuilder'), builder => { + builder.member(ident('singleRetry')) + builder.call(builder => { + builder.object(builder => { + buildBaseBackoffSecondsOption(strategy, builder) + buildSameRegionOption(strategy, builder) + }) + }) + }) case 'NO_RETRIES': return expr(ident('RetryStrategyBuilder'), builder => { builder.member(ident('noRetries')) diff --git a/packages/cli/src/constructs/retry-strategy.ts b/packages/cli/src/constructs/retry-strategy.ts index 8db0f6c3..83c23523 100644 --- a/packages/cli/src/constructs/retry-strategy.ts +++ b/packages/cli/src/constructs/retry-strategy.ts @@ -1,9 +1,10 @@ /** Available retry strategy types */ -export type RetryStrategyType = 'LINEAR' | 'EXPONENTIAL' | 'FIXED' | 'NO_RETRIES' +export type RetryStrategyType = 'LINEAR' | 'EXPONENTIAL' | 'FIXED' | 'SINGLE' | 'NO_RETRIES' /** - * Configuration for check retry behavior. - * Defines how and when to retry failed checks before marking them as permanently failed. + * Configuration for check and monitor retry behavior. + * Defines how and when to retry failed checks or monitors before marking + * them as permanently failed. */ export interface RetryStrategy { /** The retry strategy type */ @@ -15,6 +16,7 @@ export interface RetryStrategy { * - FIXED: Same delay for all retries * - LINEAR: Base value that increases linearly (baseBackoffSeconds * attempt) * - EXPONENTIAL: Base value that increases exponentially (baseBackoffSeconds ^ attempt) + * - SINGLE: The delay for the first and only retry * * @defaultValue 60 * @example @@ -27,6 +29,9 @@ export interface RetryStrategy { * * // Exponential: 5s, 25s, 125s * baseBackoffSeconds: 5 + * + * // Single: 10s + * baseBackoffSeconds: 10 * ``` */ baseBackoffSeconds?: number, @@ -63,6 +68,61 @@ export interface RetryStrategy { */ export type RetryStrategyOptions = Pick +/** + * Configuration for linear retry strategies. + */ +export interface LinearRetryStrategy extends RetryStrategy { + type: 'LINEAR' +} + +/** + * Options for configuring linear retry strategy behavior. + */ +export type LinearRetryStrategyOptions = RetryStrategyOptions + +/** + * Configuration for exponential retry strategies. + */ +export interface ExponentialRetryStrategy extends RetryStrategy { + type: 'EXPONENTIAL' +} + +/** + * Options for configuring exponential retry strategy behavior. + */ +export type ExponentialRetryStrategyOptions = RetryStrategyOptions + +/** + * Configuration for fixed retry strategies. + */ +export interface FixedRetryStrategy extends RetryStrategy { + type: 'FIXED' +} + +/** + * Options for configuring fixed retry strategy behavior. + */ +export type FixedRetryStrategyOptions = RetryStrategyOptions + +/** + * Configuration for single retry strategies. + */ +export interface SingleRetryStrategy extends Pick { + type: 'SINGLE' +} + +/** + * Options for configuring single retry strategy behavior. + */ +export type SingleRetryStrategyOptions = Pick + +/** + * Configuration for no retry retry strategies. + */ +export interface NoRetriesRetryStrategy extends Pick { + type: 'NO_RETRIES' +} + /** * Builder class for creating retry strategies. * Provides convenient methods to create different types of retry strategies. @@ -105,8 +165,11 @@ export class RetryStrategyBuilder { /** * Each retry is run with the same backoff between attempts. */ - static fixedStrategy (options?: RetryStrategyOptions): RetryStrategy { - return RetryStrategyBuilder.retryStrategy('FIXED', options) + static fixedStrategy (options?: FixedRetryStrategyOptions): FixedRetryStrategy { + return { + type: 'FIXED', + ...RetryStrategyBuilder.defaults(options), + } } /** @@ -115,8 +178,11 @@ export class RetryStrategyBuilder { * The delay between retries is calculated using `baseBackoffSeconds * attempt`. * For example, retries will be run with a backoff of 10s, 20s, 30s, and so on. */ - static linearStrategy (options?: RetryStrategyOptions): RetryStrategy { - return RetryStrategyBuilder.retryStrategy('LINEAR', options) + static linearStrategy (options?: LinearRetryStrategyOptions): LinearRetryStrategy { + return { + type: 'LINEAR', + ...RetryStrategyBuilder.defaults(options), + } } /** @@ -125,20 +191,36 @@ export class RetryStrategyBuilder { * The delay between retries is calculated using `baseBackoffSeconds ^ attempt`. * For example, retries will be run with a backoff of 10s, 100s, 1000s, and so on. */ - static exponentialStrategy (options?: RetryStrategyOptions): RetryStrategy { - return RetryStrategyBuilder.retryStrategy('EXPONENTIAL', options) + static exponentialStrategy (options?: ExponentialRetryStrategyOptions): ExponentialRetryStrategy { + return { + type: 'EXPONENTIAL', + ...RetryStrategyBuilder.defaults(options), + } + } + + /** + * A single retry will be performed. + */ + static singleRetry (options?: SingleRetryStrategyOptions): SingleRetryStrategy { + const { baseBackoffSeconds, sameRegion } = RetryStrategyBuilder.defaults(options) + return { + type: 'SINGLE', + baseBackoffSeconds, + sameRegion, + } } /** * No retries are performed. */ - static noRetries (): RetryStrategy { - return RetryStrategyBuilder.retryStrategy('NO_RETRIES') + static noRetries (): NoRetriesRetryStrategy { + return { + type: 'NO_RETRIES' + } } - private static retryStrategy (type: RetryStrategyType, options?: RetryStrategyOptions): RetryStrategy { + private static defaults (options?: RetryStrategyOptions): RetryStrategyOptions { return { - type, baseBackoffSeconds: options?.baseBackoffSeconds ?? RetryStrategyBuilder.DEFAULT_BASE_BACKOFF_SECONDS, maxRetries: options?.maxRetries ?? RetryStrategyBuilder.DEFAULT_MAX_RETRIES, maxDurationSeconds: options?.maxDurationSeconds ?? RetryStrategyBuilder.DEFAULT_MAX_DURATION_SECONDS, diff --git a/packages/cli/src/services/checkly-config-codegen.ts b/packages/cli/src/services/checkly-config-codegen.ts index b37906c4..76e9840c 100644 --- a/packages/cli/src/services/checkly-config-codegen.ts +++ b/packages/cli/src/services/checkly-config-codegen.ts @@ -7,7 +7,7 @@ import { valueForPlaywrightConfig } from '../constructs/playwright-config-codege import { valueForPrivateLocationFromId } from '../constructs/private-location-codegen' import { valueForRetryStrategy } from '../constructs/retry-strategy-codegen' import { array, decl, docComment, expr, GeneratedFile, ident, ObjectValueBuilder, Program, StringValue } from '../sourcegen' -import { ChecklyConfig, CheckConfigDefaults } from './checkly-config-loader' +import { ChecklyConfig, CheckConfigDefaults, MonitorConfigDefaults } from './checkly-config-loader' function buildCheckConfigDefaults ( program: Program, @@ -113,6 +113,16 @@ function buildCheckConfigDefaults ( } } +function buildMonitorConfigDefaults ( + program: Program, + file: GeneratedFile, + context: Context, + builder: ObjectValueBuilder, + resource: MonitorConfigDefaults, +) { + return buildCheckConfigDefaults(program, file, context, builder, resource) +} + function valueForStringOrStringArray (value: string | string[]) { if (Array.isArray(value)) { return array(builder => { @@ -191,6 +201,13 @@ more information.`)) buildCheckConfigDefaults(program, file, context, builder, multiStepChecks) }) } + + if (checks.monitors !== undefined) { + const monitors = checks.monitors + builder.object('monitors', builder => { + buildMonitorConfigDefaults(program, file, context, builder, monitors) + }) + } }) } diff --git a/packages/cli/src/services/checkly-config-loader.ts b/packages/cli/src/services/checkly-config-loader.ts index 59137e40..55dc3c48 100644 --- a/packages/cli/src/services/checkly-config-loader.ts +++ b/packages/cli/src/services/checkly-config-loader.ts @@ -3,6 +3,7 @@ import fs from 'node:fs/promises' import { existsSync } from 'fs' import { getDefaultChecklyConfig, writeChecklyConfigFile } from './util' import { CheckProps, RuntimeCheckProps } from '../constructs/check' +import { MonitorProps } from '../constructs/monitor' import { PlaywrightCheckProps } from '../constructs/playwright-check' import { Session } from '../constructs' import { Construct } from '../constructs/construct' @@ -32,6 +33,20 @@ export type CheckConfigDefaults = // This is used by BrowserChecks and MultiStepChecks. { playwrightConfig?: PlaywrightConfig } +export type MonitorConfigDefaults = + Pick + export type PlaywrightSlimmedProp = Pick { ignoreDirectoriesMatch = [], checkDefaults = {}, browserCheckDefaults = {}, + monitorDefaults = {}, availableRuntimes, defaultRuntimeId, verifyRuntimeDependencies, @@ -79,6 +81,7 @@ export async function parseProject (opts: ProjectParseOpts): Promise { Session.checkDefaults = Object.assign({}, BASE_CHECK_DEFAULTS, checkDefaults) Session.checkFilter = checkFilter Session.browserCheckDefaults = browserCheckDefaults + Session.monitorDefaults = monitorDefaults Session.availableRuntimes = availableRuntimes Session.defaultRuntimeId = defaultRuntimeId Session.verifyRuntimeDependencies = verifyRuntimeDependencies ?? true