function checkOption()

in packages/babel-plugin-fbt/src/FbtUtil.js [179:222]


function checkOption<K: string>(
  option: string,
  validOptions: FbtOptionConfig<K>,
  value: ?BabelNode | string | boolean,
): K {
  // $FlowFixMe[incompatible-cast] consider
  const optionName = (option: K);

  const validValues = validOptions[optionName];
  if (!validOptions.hasOwnProperty(optionName) || validValues == null) {
    throw errorAt(
      isNode(value) ? value : null,
      `Invalid option "${optionName}". ` +
        `Only allowed: ${Object.keys(validOptions).join(', ')} `,
    );
  } else if (validValues !== true) {
    let valueStr;
    if (typeof value === 'string' || typeof value === 'boolean') {
      valueStr = value.toString();
    } else if (
      isNode(value) &&
      (isStringLiteral(value) || isBooleanLiteral(value))
    ) {
      valueStr = value && value.value.toString();
    } else {
      throw errorAt(
        isNode(value) ? value : null,
        `Option "${optionName}" has an invalid value. ` +
          `Expected a string literal but value is \`${varDump(
            value,
          )}\` (${typeof value})`,
      );
    }

    if (!validValues[valueStr]) {
      throw errorAt(
        isNode(value) ? value : null,
        `Option "${optionName}" has an invalid value: "${valueStr}". ` +
          `Only allowed: ${Object.keys(validValues).join(', ')}`,
      );
    }
  }
  return optionName;
}