blob: fec5aa0b8cb22876a5f1afdf5a783da197b7a24e [file] [log] [blame] [edit]
/* This file is a part of @mdn/browser-compat-data
* See LICENSE file for more information. */
import fs from 'node:fs';
import { BrowserName, CompatStatement } from '../../types/types.js';
import { IS_WINDOWS } from '../utils.js';
import compareStatements from '../../scripts/lib/compare-statements.js';
/**
* Return a new "support_block" object whose support statements have
* been ordered in reverse chronological order, moving statements
* with flags, partial support, prefixes, or alternative names lower.
* @param key The key in the object
* @param value The value of the key
* @returns The new value
*/
export const orderStatements = (
key: string,
value: CompatStatement,
): CompatStatement => {
if (key === '__compat') {
for (const browser of Object.keys(value.support) as BrowserName[]) {
const supportData = value.support[browser];
if (Array.isArray(supportData)) {
value.support[browser] = supportData.sort(compareStatements);
}
}
}
return value;
};
/**
* Fix issues with statement order throughout the BCD files
* @param filename The name of the file to fix
*/
const fixStatementOrder = (filename: string): void => {
if (filename.includes('/browsers/')) {
return;
}
let actual = fs.readFileSync(filename, 'utf-8').trim();
let expected = JSON.stringify(JSON.parse(actual, orderStatements), null, 2);
if (IS_WINDOWS) {
// prevent false positives from git.core.autocrlf on Windows
actual = actual.replace(/\r/g, '');
expected = expected.replace(/\r/g, '');
}
if (actual !== expected) {
fs.writeFileSync(filename, expected + '\n', 'utf-8');
}
};
export default fixStatementOrder;