blob: 150188ac0d7ba83d632e9c991eb9a32969aa0657 [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,
SupportStatement,
SimpleSupportStatement,
} from '../../types/types.js';
import { IS_WINDOWS } from '../utils.js';
import testFlags, {
isIrrelevantFlagData,
getBasicSupportStatement,
} from '../linter/test-flags.js';
import walk from '../../utils/walk.js';
/**
* Removes irrelevant flags from the compatibility data
* @param supportData The compatibility statement to test
* @returns The compatibility statement with all of the flags removed
*/
export const removeIrrelevantFlags = (
supportData: SupportStatement,
): SupportStatement => {
if (typeof supportData === 'string') {
return supportData;
}
if (!Array.isArray(supportData)) {
if (isIrrelevantFlagData(supportData, undefined)) {
return { version_added: false };
}
return supportData;
}
const result: SimpleSupportStatement[] = [];
const basicSupport = getBasicSupportStatement(supportData);
for (const statement of supportData) {
if (!isIrrelevantFlagData(statement, basicSupport)) {
result.push(statement);
}
}
if (result.length == 0) {
return { version_added: false };
}
if (result.length == 1) {
return result[0];
}
return result;
};
/**
* Removes irrelevant flags from the compatibility data of a specified file
* @param filename The filename containing compatibility info
*/
const fixFlags = (filename: string): void => {
if (filename.includes('/browsers/')) {
return;
}
let actual = fs.readFileSync(filename, 'utf-8').trim();
const data = JSON.parse(actual);
const walker = walk(undefined, data);
for (const feature of walker) {
if (testFlags.exceptions?.includes(feature.path)) {
continue;
}
for (const [browser, supportData] of Object.entries(
feature.compat.support,
) as [BrowserName, SupportStatement][]) {
feature.data.__compat.support[browser] =
removeIrrelevantFlags(supportData);
}
}
let expected = JSON.stringify(data, 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 fixFlags;