function resolveOmitToPropTypes()

in packages/eui/scripts/babel/proptypes-from-ts-props/index.js [70:119]


function resolveOmitToPropTypes(node, state) {
  const types = state.get('types');

  const { typeParameters } = node;

  if (typeParameters == null) return null;

  const {
    params: [sourceType, toRemove],
  } = typeParameters;

  const sourcePropTypes = getPropTypesForNode(sourceType, true, state);
  // validate that this resulted in a shape, otherwise we don't know how to extract/merge the values
  if (
    !types.isCallExpression(sourcePropTypes) ||
    !types.isMemberExpression(sourcePropTypes.callee) ||
    sourcePropTypes.callee.object.name !== 'PropTypes' ||
    sourcePropTypes.callee.property.name !== 'shape'
  ) {
    return null;
  }

  const toRemovePropTypes = getPropTypesForNode(toRemove, true, state);
  // validate that this resulted in a oneOf, otherwise we don't know how to use the values
  if (
    !types.isCallExpression(toRemovePropTypes) ||
    !types.isMemberExpression(toRemovePropTypes.callee) ||
    toRemovePropTypes.callee.object.name !== 'PropTypes' ||
    toRemovePropTypes.callee.property.name !== 'oneOf'
  ) {
    return null;
  }

  // extract the string values of keys to remove
  const keysToRemove = new Set(
    toRemovePropTypes.arguments[0].elements
      .map((keyToRemove) =>
        types.isStringLiteral(keyToRemove) ? keyToRemove.value : null
      )
      .filter((x) => x !== null)
  );

  // filter out omitted properties
  sourcePropTypes.arguments[0].properties =
    sourcePropTypes.arguments[0].properties.filter(
      ({ key: { name } }) => keysToRemove.has(stripDoubleQuotes(name)) === false
    );

  return sourcePropTypes;
}