in src/utils/resolveXYScales.js [134:232]
_resolveScaleType(props, Component) {
let { xScaleType, yScaleType } = props;
const isDone = () => areValidScaleTypes([xScaleType, yScaleType]);
// short-circuit if both scale types provided
if (isDone()) return { xScaleType, yScaleType };
// if Component provides a custom static getScaleType method
// use it to determine remaining scale types
if (isFunction(Component.getScaleType)) {
const componentScaleTypes = omitNullUndefined(
Component.getScaleType(props),
);
({ xScaleType, yScaleType } = Object.assign(
componentScaleTypes,
omitNullUndefined({ xScaleType, yScaleType }),
));
if (isDone()) return { xScaleType, yScaleType };
}
// if component has domain props,
// infer the data type, & use that to get scale type
if (!isValidScaleType(xScaleType) && isValidDomain(props.xDomain)) {
xScaleType = scaleTypeFromDataType(
inferDataTypeFromDomain(props.xDomain),
);
}
if (!isValidScaleType(yScaleType) && isValidDomain(props.yDomain)) {
yScaleType = scaleTypeFromDataType(
inferDataTypeFromDomain(props.yDomain),
);
}
if (isDone()) return { xScaleType, yScaleType };
// if Component has data or datasets props,
// infer the data type, & use that to get scale type
if (Array.isArray(props.data) || Array.isArray(props.datasets)) {
const datasets = Array.isArray(props.datasets)
? props.datasets
: [props.data];
if (!isValidScaleType(xScaleType)) {
xScaleType = scaleTypeFromDataType(
inferDatasetsType(datasets, makeAccessor2(props.x)),
);
}
if (!isValidScaleType(yScaleType)) {
yScaleType = scaleTypeFromDataType(
inferDatasetsType(datasets, makeAccessor2(props.y)),
);
}
if (isDone()) return { xScaleType, yScaleType };
}
// if Component has children,
// recurse through descendants to resolve their scale types the same way
if (React.Children.count(props.children)) {
const childrenScaleTypes = mapOverChildren(
props.children,
this._resolveScaleType.bind(this),
);
if (!isValidScaleType(xScaleType)) {
const childXScaleTypes = compact(
uniq(
childrenScaleTypes.map(
childScaleTypes => childScaleTypes.xScaleType,
),
),
);
if (!childXScaleTypes.length === 1)
console.warn(
"Multiple children with different X scale types found - defaulting to 'ordinal'",
);
xScaleType =
childXScaleTypes.length === 1 ? childXScaleTypes[0] : 'ordinal';
}
if (!isValidScaleType(yScaleType)) {
const childYScaleTypes = compact(
uniq(
childrenScaleTypes.map(
childScaleTypes => childScaleTypes.yScaleType,
),
),
);
if (!childYScaleTypes.length === 1)
console.warn(
"Multiple children with different Y scale types found - defaulting to 'ordinal'",
);
yScaleType =
childYScaleTypes.length === 1 ? childYScaleTypes[0] : 'ordinal';
}
}
// if(!isDone()) console.warn(`resolveXYScales was unable to resolve both scale types. xScaleType: ${xScaleType}, yScaleType: ${yScaleType}`);
return { xScaleType, yScaleType };
}