blob: 48d07e02de1232bdaa472b3290af9385144e60f7 [file] [log] [blame]
/* This file is a part of @mdn/browser-compat-data
* See LICENSE file for more information. */
import { compareVersions } from 'compare-versions';
/** @import {SimpleSupportStatement} from '../../types/types.js' */
/**
*
*Sort a list of compatibility statements based upon reverse-chronological order in the following order:
* 1. Statements with only version added (and potentially notes)
* 2. Statements with alternative names or prefixes
* 3. Statements with partial support
* 4. Statements with flags
* 5. Statements with a version removed (or otherwise no support)
* @param {SimpleSupportStatement} a - The first support statement object to perform comparison with
* @param {SimpleSupportStatement} b - The second support statement object to perform comparison with
* @returns {number} Direction to sort
*/
const compareStatements = (a, b) => {
// Has version removed
if (a.version_removed && !b.version_removed) {
return 1;
}
if (!a.version_removed && b.version_removed) {
return -1;
}
if (
a.version_removed &&
b.version_removed &&
typeof a.version_removed == 'string' &&
typeof b.version_removed == 'string'
) {
// If both statements have version_removed, sort by removal version
const cmp = compareVersions(
b.version_removed.replace('≤', ''),
a.version_removed.replace('≤', ''),
);
// If both statements were removed at same time, compare other parts
if (cmp !== 0) {
return cmp;
}
}
// Has flags
if (a.flags && !b.flags) {
return 1;
}
if (!a.flags && b.flags) {
return -1;
}
if (a.partial_implementation && !b.partial_implementation) {
return 1;
}
if (!a.partial_implementation && b.partial_implementation) {
return -1;
}
// Alternative name
const a_altname = a.prefix != undefined || a.alternative_name != undefined;
const b_altname = b.prefix != undefined || b.alternative_name != undefined;
if (a_altname && !b_altname) {
return 1;
}
if (!a_altname && b_altname) {
return -1;
}
if (
typeof a.version_added == 'string' &&
typeof b.version_added == 'string'
) {
switch ('preview') {
case a.version_added:
return -1;
case b.version_added:
return 1;
default:
return compareVersions(
b.version_added.replace('≤', ''),
a.version_added.replace('≤', ''),
);
}
}
return 0;
};
export default compareStatements;