blob: f9d837f3196ba75763fb9eb3216bdcb34d7cba4b [file]
/* This file is a part of @mdn/browser-compat-data
* See LICENSE file for more information. */
import { styleText } from 'node:util';
import bcd from '../../index.js';
const { browsers } = bcd;
/** @import {Linter, LinterData} from '../types.js' */
/** @import {Logger} from '../utils.js' */
/** @import {BrowserStatement, BrowserName} from '../../types/types.js' */
/**
* Process and test the data
* @param {BrowserName} browser The name of the browser
* @param {BrowserStatement} data The browser statement
* @param {Logger} logger The logger to output errors to
* @returns {void}
*/
const processData = (browser, data, logger) => {
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(
styleText(
'red',
`${styleText('bold', browser)} has multiple ${styleText('bold', status)} releases (${releasesForStatus.join(', ')}), which is ${styleText('bold', 'not')} allowed.`,
),
);
}
}
// Ensure the `upstream` property, if it exists, is valid
if (data.upstream) {
if (data.upstream === browser) {
logger.error(
styleText(
'red',
`The upstream for ${styleText('bold', browser)} is set to itself.`,
),
);
}
if (!Object.keys(browsers).includes(data.upstream)) {
logger.error(
styleText(
'red',
`The upstream for ${styleText('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(
styleText(
'red',
`${styleText('bold', browser)} has ${styleText('bold', status)} releases without release date (${releasesWithoutDate.join(', ')}), which is ${styleText('bold', 'not')} allowed.`,
),
);
}
}
};
/** @type {Linter} */
export default {
name: 'Browser Data',
description: 'Test the browser data',
scope: 'browser',
/**
* Test the data
* @param {Logger} logger The logger to output errors to
* @param {LinterData} root The data to test
*/
check: (logger, { data, path: { browser } }) => {
processData(
/** @type {BrowserName} */ (browser),
/** @type {BrowserStatement} */ (data),
logger,
);
},
};