in packages/synthetics-sdk-broken-links/src/options_func.ts [52:225]
export function validateInputOptions(
inputOptions: BrokenLinkCheckerOptions
): BrokenLinkCheckerOptions {
if (!inputOptions.origin_uri) {
throw new Error('Missing origin_uri in options');
} else if (
typeof inputOptions.origin_uri !== 'string' ||
(!inputOptions.origin_uri.startsWith('http://') &&
!inputOptions.origin_uri.startsWith('https://') &&
!inputOptions.origin_uri.endsWith('.html'))
) {
throw new Error(
'origin_uri must be a string that starts with `http://` or `https://`'
);
}
// check link_limit
if (
inputOptions.link_limit !== undefined &&
(typeof inputOptions.link_limit !== 'number' || inputOptions.link_limit < 1)
) {
throw new Error(
'Invalid link_limit value, must be a number greater than 0'
);
}
// check query_selector_all
if (
inputOptions.query_selector_all !== undefined &&
(typeof inputOptions.query_selector_all !== 'string' ||
inputOptions.query_selector_all.length === 0)
) {
throw new Error(
'Invalid query_selector_all value, must be a non-empty string'
);
}
// check get_attributes
if (
inputOptions.get_attributes &&
(!Array.isArray(inputOptions.get_attributes) ||
!inputOptions.get_attributes.every((item) => typeof item === 'string'))
) {
throw new Error(
'Invalid get_attributes value, must be an array of only strings'
);
}
// check link_order
if (
inputOptions.link_order !== undefined &&
!Object.values(LinkOrder).includes(inputOptions.link_order)
) {
throw new Error('Invalid link_order value, must be `FIRST_N` or `RANDOM`');
}
// check link_timeout_millis
if (
inputOptions.link_timeout_millis !== undefined &&
(typeof inputOptions.link_timeout_millis !== 'number' ||
inputOptions.link_timeout_millis < 10)
) {
throw new Error(
'Invalid link_timeout_millis value, must be a number greater than 9'
);
}
// check max_retries
if (
inputOptions.max_retries !== undefined &&
(typeof inputOptions.max_retries !== 'number' ||
inputOptions.max_retries < 0)
) {
throw new Error(
'Invalid max_retries value, must be a number greater than -1'
);
}
// Check wait_for_selector
if (
inputOptions.wait_for_selector !== undefined &&
typeof inputOptions.wait_for_selector !== 'string'
) {
throw new Error('Invalid wait_for_selector value, must be a string');
}
// Check total_synthetic_timeout_millis
if (
inputOptions.total_synthetic_timeout_millis !== undefined &&
(typeof inputOptions.total_synthetic_timeout_millis !== 'number' ||
inputOptions.total_synthetic_timeout_millis < 30000 ||
inputOptions.total_synthetic_timeout_millis > 60000)
) {
throw new Error(
'Invalid total_synthetic_timeout_millis value, must be a number between 30000 and 60000 inclusive'
);
}
// Check storage_location
if (
inputOptions.screenshot_options?.storage_location !== undefined &&
typeof inputOptions.screenshot_options?.storage_location !== 'string'
) {
throw new Error('Invalid storage_location value, must be a string');
}
// check storage_condition
if (
inputOptions.screenshot_options?.capture_condition !== undefined &&
!Object.values(CaptureCondition).includes(
inputOptions.screenshot_options?.capture_condition
)
) {
throw new Error(
'Invalid capture_condition value, must be `ALL`, `FAILING`, OR `NONE`'
);
}
// per_link_options
for (const [key, value] of Object.entries(
inputOptions.per_link_options || {}
)) {
// Check URI in per_link_options
if (!key.startsWith('http://') && !key.startsWith('https://')) {
throw new Error(
'Invalid uri in per_link_options, uris must start with `http://` or `https://`'
);
}
// Check link_timeout_millis in per_link_options
if (
value.link_timeout_millis !== undefined &&
(typeof value.link_timeout_millis !== 'number' ||
value.link_timeout_millis < 9)
) {
throw new Error(
`Invalid link_timeout_millis value in per_link_options set for ${key}, must be a number greater than 9`
);
}
// Check expected_status_code in per_link_options
if (
value.expected_status_code !== undefined &&
(typeof value.expected_status_code !== 'number' ||
value.expected_status_code < 100 ||
value.expected_status_code > 599) &&
!Object.values(StatusClass).includes(
value.expected_status_code as StatusClass
)
) {
throw new Error(
`Invalid expected_status_code in per_link_options for ${key}, must be a number between 100 and 599 (inclusive) or a string present in StatusClass enum`
);
}
}
// do this to remove out any extra fields
return {
origin_uri: inputOptions.origin_uri,
link_limit: inputOptions.link_limit,
query_selector_all: inputOptions.query_selector_all,
get_attributes: inputOptions.get_attributes,
link_order: inputOptions.link_order,
link_timeout_millis: inputOptions.link_timeout_millis,
max_retries: inputOptions.max_retries,
wait_for_selector: inputOptions.wait_for_selector,
per_link_options: inputOptions.per_link_options,
total_synthetic_timeout_millis: inputOptions.total_synthetic_timeout_millis,
screenshot_options: {
capture_condition: inputOptions.screenshot_options?.capture_condition,
storage_location: inputOptions.screenshot_options?.storage_location,
},
};
}