export function validateInputOptions()

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