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