102 lines
2.7 KiB
JavaScript
102 lines
2.7 KiB
JavaScript
|
const checkAlphabeticalOrder = require('../checkAlphabeticalOrder');
|
||
|
const { vendor } = require('../../utils');
|
||
|
|
||
|
// eslint-disable-next-line consistent-return
|
||
|
module.exports = function checkOrder({
|
||
|
firstPropertyData,
|
||
|
secondPropertyData,
|
||
|
allPropertiesData,
|
||
|
unspecified,
|
||
|
}) {
|
||
|
function report(isCorrect, firstNode = firstPropertyData, secondNode = secondPropertyData) {
|
||
|
return {
|
||
|
isCorrect,
|
||
|
firstNode,
|
||
|
secondNode,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
if (firstPropertyData.unprefixedName === secondPropertyData.unprefixedName) {
|
||
|
// If first property has no prefix and second property has prefix
|
||
|
if (
|
||
|
!vendor.prefix(firstPropertyData.name).length &&
|
||
|
vendor.prefix(secondPropertyData.name).length
|
||
|
) {
|
||
|
return report(false);
|
||
|
}
|
||
|
|
||
|
return report(true);
|
||
|
}
|
||
|
|
||
|
const firstPropIsSpecified = Boolean(firstPropertyData.orderData);
|
||
|
const secondPropIsSpecified = Boolean(secondPropertyData.orderData);
|
||
|
|
||
|
// Check actual known properties
|
||
|
if (firstPropIsSpecified && secondPropIsSpecified) {
|
||
|
return report(
|
||
|
firstPropertyData.orderData.expectedPosition <=
|
||
|
secondPropertyData.orderData.expectedPosition
|
||
|
);
|
||
|
}
|
||
|
|
||
|
if (!firstPropIsSpecified && secondPropIsSpecified) {
|
||
|
// If first prop is unspecified, look for a specified prop before it to
|
||
|
// compare to the current prop
|
||
|
let priorSpecifiedPropData = allPropertiesData
|
||
|
.slice(0, -1)
|
||
|
.reverse()
|
||
|
.find((declaration) => Boolean(declaration.orderData));
|
||
|
|
||
|
if (
|
||
|
priorSpecifiedPropData &&
|
||
|
priorSpecifiedPropData.orderData &&
|
||
|
priorSpecifiedPropData.orderData.expectedPosition >
|
||
|
secondPropertyData.orderData.expectedPosition
|
||
|
) {
|
||
|
return report(false, priorSpecifiedPropData, secondPropertyData);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Now deal with unspecified props
|
||
|
// Starting with bottomAlphabetical as it requires more specific conditionals
|
||
|
if (unspecified === 'bottomAlphabetical' && firstPropIsSpecified && !secondPropIsSpecified) {
|
||
|
return report(true);
|
||
|
}
|
||
|
|
||
|
if (unspecified === 'bottomAlphabetical' && !firstPropIsSpecified && !secondPropIsSpecified) {
|
||
|
if (checkAlphabeticalOrder(firstPropertyData, secondPropertyData)) {
|
||
|
return report(true);
|
||
|
}
|
||
|
|
||
|
return report(false);
|
||
|
}
|
||
|
|
||
|
if (unspecified === 'bottomAlphabetical' && !firstPropIsSpecified) {
|
||
|
return report(false);
|
||
|
}
|
||
|
|
||
|
if (!firstPropIsSpecified && !secondPropIsSpecified) {
|
||
|
return report(true);
|
||
|
}
|
||
|
|
||
|
if (unspecified === 'ignore' && (!firstPropIsSpecified || !secondPropIsSpecified)) {
|
||
|
return report(true);
|
||
|
}
|
||
|
|
||
|
if (unspecified === 'top' && !firstPropIsSpecified) {
|
||
|
return report(true);
|
||
|
}
|
||
|
|
||
|
if (unspecified === 'top' && !secondPropIsSpecified) {
|
||
|
return report(false);
|
||
|
}
|
||
|
|
||
|
if (unspecified === 'bottom' && !secondPropIsSpecified) {
|
||
|
return report(true);
|
||
|
}
|
||
|
|
||
|
if (unspecified === 'bottom' && !firstPropIsSpecified) {
|
||
|
return report(false);
|
||
|
}
|
||
|
};
|