in src/utils/resolveObjectKeysToArray.ts [36:95]
export function resolveObjectToNameArray(
object: NodePath,
importer: Importer,
raw = false,
): string[] | 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))
) {
let values: string[] = [];
let error = false;
const properties = t.TSTypeLiteral.check(object.value)
? object.get('members')
: object.get('properties');
properties.each((propPath: NodePath) => {
if (error) return;
const prop = propPath.value;
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);
values.push(name);
} 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 = resolveObjectToNameArray(spreadObject, importer);
if (!spreadValues) {
error = true;
return;
}
values = [...values, ...spreadValues];
}
});
if (!error) {
return values;
}
}
return null;
}