blob: fe1a688905064deb0a4eb37c95a556bdf8484bb5 [file] [log] [blame] [edit]
/* This file is a part of @mdn/browser-compat-data
* See LICENSE file for more information. */
import chalk from 'chalk-template';
import { Linter, Logger, LinterData } from '../utils.js';
import { BrowserStatement, BrowserName } from '../../types/types.js';
import bcd from '../../index.js';
const { browsers } = bcd;
/**
* Process and test the data
* @param browser The name of the browser
* @param data The browser statement
* @param logger The logger to output errors to
*/
const processData = (
browser: BrowserName,
data: BrowserStatement,
logger: Logger,
): void => {
for (const status of ['current', 'nightly']) {
const releasesForStatus = Object.entries(data.releases)
.filter(([, data]) => data.status == status)
.map(([version]) => version);
if (releasesForStatus.length > 1) {
logger.error(
chalk`{red {bold ${browser}} has multiple {bold ${status}} releases (${releasesForStatus.join(
', ',
)}), which is {bold not} allowed.}`,
);
}
}
// Ensure the `upstream` property, if it exists, is valid
if (data.upstream) {
if (data.upstream === browser) {
logger.error(
chalk`{red The upstream for {bold ${browser}} is set to itself.}`,
);
}
if (!Object.keys(browsers).includes(data.upstream)) {
logger.error(
chalk`{red The upstream for {bold ${browser}} is an unknown browser (${
data.upstream
}) Valid options are: ${Object.keys(browsers).join(', ')}.}`,
);
}
}
// Ensure every retired/current release has a release date.
for (const status of ['retired', 'current']) {
if (browser === 'oculus') {
// Ignore Oculus Browser, because release dates for versions 5.0 to 15.1 are not publicly documented.
continue;
}
const releasesWithoutDate = Object.entries(data.releases)
.filter(
([, data]) =>
data.status == status && typeof data.release_date === 'undefined',
)
.map(([version]) => version);
if (releasesWithoutDate.length > 0) {
logger.error(
chalk`{red {bold ${browser}} has {bold ${status}} releases without release date (${releasesWithoutDate.join(
', ',
)}), which is {bold not} allowed.}`,
);
}
}
};
export default {
name: 'Browser Data',
description: 'Test the browser data',
scope: 'browser',
/**
* Test the data
* @param logger The logger to output errors to
* @param root The data to test
* @param root.data The browser data
* @param root.path The path to the browser data
* @param root.path.browser The name of the browser
*/
check: (logger: Logger, { data, path: { browser } }: LinterData) => {
processData(browser as BrowserName, data, logger);
},
} as Linter;