in src/utils/resolveObjectValuesToArray.ts [41:115]
export function resolveObjectToPropMap(
object: NodePath,
importer: Importer,
raw = false,
): ObjectPropMap | null {
if (
(t.ObjectExpression.check(object.value) &&
object.value.properties.every(isWhitelistedObjectProperty)) ||
(t.ObjectTypeAnnotation.check(object.value) &&
object.value.properties.every(isWhiteListedObjectTypeProperty)) ||
(t.TSTypeLiteral.check(object.value) &&
object.value.members.every(isWhiteListedObjectTypeProperty))
) {
const properties: string[] = [];
let values = {};
let error = false;
const members = t.TSTypeLiteral.check(object.value)
? object.get('members')
: object.get('properties');
members.each(propPath => {
if (error) return;
const prop = propPath.value;
if (prop.kind === 'get' || prop.kind === 'set') return;
if (
t.Property.check(prop) ||
t.ObjectTypeProperty.check(prop) ||
t.TSPropertySignature.check(prop)
) {
// Key is either Identifier or Literal
// @ts-ignore
const name = prop.key.name || (raw ? prop.key.raw : prop.key.value);
const propValue = propPath.get(name).parentPath.value;
const value =
propValue.value.value ||
(raw ? propValue.value.raw : propValue.value.value);
if (properties.indexOf(name) === -1) {
properties.push(name);
}
values[name] = value;
} else if (
t.SpreadElement.check(prop) ||
t.ObjectTypeSpreadProperty.check(prop)
) {
let spreadObject = resolveToValue(propPath.get('argument'), importer);
if (t.GenericTypeAnnotation.check(spreadObject.value)) {
const typeAlias = resolveToValue(spreadObject.get('id'), importer);
if (t.ObjectTypeAnnotation.check(typeAlias.get('right').value)) {
spreadObject = resolveToValue(typeAlias.get('right'), importer);
}
}
const spreadValues = resolveObjectToPropMap(spreadObject, importer);
if (!spreadValues) {
error = true;
return;
}
spreadValues.properties.forEach(spreadProp => {
if (properties.indexOf(spreadProp) === -1) {
properties.push(spreadProp);
}
});
values = { ...values, ...spreadValues.values };
}
});
if (!error) {
return { properties: properties.sort(), values };
}
}
return null;
}