diff --git a/api/AudioContext.json b/api/AudioContext.json index b5649325c07689..590d6f07a96f4f 100644 --- a/api/AudioContext.json +++ b/api/AudioContext.json @@ -120,9 +120,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": false - }, "opera": { "version_added": "42" }, @@ -174,9 +171,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": false - }, "opera": { "version_added": "47" }, @@ -229,9 +223,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": false - }, "opera": { "version_added": false }, diff --git a/api/AudioContextOptions.json b/api/AudioContextOptions.json index 18dc49653593e3..971b7f1b77e2d2 100644 --- a/api/AudioContextOptions.json +++ b/api/AudioContextOptions.json @@ -72,9 +72,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": false - }, "opera": { "version_added": null }, @@ -124,9 +121,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": false - }, "opera": { "version_added": false }, diff --git a/api/HTMLInputElement.json b/api/HTMLInputElement.json index 91fdcc9ff1576a..c02dbdb7e965c7 100644 --- a/api/HTMLInputElement.json +++ b/api/HTMLInputElement.json @@ -1011,9 +1011,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": null }, @@ -1121,9 +1118,6 @@ "ie": { "version_added": "9" }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": "8" }, diff --git a/api/MediaStream.json b/api/MediaStream.json index a1fb0a46e12fab..4cf57f85306a23 100644 --- a/api/MediaStream.json +++ b/api/MediaStream.json @@ -25,9 +25,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": false }, @@ -129,9 +126,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": null }, @@ -187,9 +181,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true, "version_removed": "39" @@ -247,9 +238,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true, "version_removed": "39" @@ -304,9 +292,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": null }, @@ -358,9 +343,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": null }, @@ -412,9 +394,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": null }, @@ -466,9 +445,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": null }, @@ -522,9 +498,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -576,9 +549,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": null }, @@ -630,9 +600,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -686,9 +653,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -740,9 +704,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -797,9 +758,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": false }, @@ -852,9 +810,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": false }, diff --git a/api/MediaStreamConstraints.json b/api/MediaStreamConstraints.json index 0b50fc2f2f0742..4073492e156178 100644 --- a/api/MediaStreamConstraints.json +++ b/api/MediaStreamConstraints.json @@ -25,9 +25,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -78,9 +75,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -132,9 +126,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, diff --git a/api/MediaStreamEvent.json b/api/MediaStreamEvent.json index 59036695dabb11..7fc5ddf9335408 100644 --- a/api/MediaStreamEvent.json +++ b/api/MediaStreamEvent.json @@ -25,9 +25,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -79,9 +76,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -133,9 +127,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, diff --git a/api/MediaStreamTrack.json b/api/MediaStreamTrack.json index 025534f6493d05..d952b311283043 100644 --- a/api/MediaStreamTrack.json +++ b/api/MediaStreamTrack.json @@ -25,9 +25,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -78,9 +75,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": "46" }, @@ -132,9 +126,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": "32" }, @@ -186,9 +177,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": "47" }, @@ -240,9 +228,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -294,9 +279,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": "53" }, @@ -348,9 +330,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -402,9 +381,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": "48" }, @@ -456,9 +432,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true, "version_removed": "43" @@ -513,9 +486,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -567,9 +537,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": null }, @@ -621,9 +588,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -675,9 +639,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -729,9 +690,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -783,9 +741,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -837,9 +792,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": null }, @@ -891,9 +843,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -945,9 +894,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -999,9 +945,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -1053,9 +996,6 @@ "ie": { "version_added": null }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": null }, @@ -1107,9 +1047,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": true }, @@ -1163,9 +1100,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": "35", "version_removed": "46" @@ -1220,9 +1154,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": "45" }, diff --git a/api/MediaStreamTrackEvent.json b/api/MediaStreamTrackEvent.json index ea7388d904eb02..79a3dbbee84f92 100644 --- a/api/MediaStreamTrackEvent.json +++ b/api/MediaStreamTrackEvent.json @@ -25,9 +25,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": "42" }, @@ -79,9 +76,6 @@ "ie": { "version_added": false }, - "nodejs": { - "version_added": null - }, "opera": { "version_added": "42" }, diff --git a/test/lint.js b/test/lint.js index 7217948f1f4555..8465eea050ddbe 100644 --- a/test/lint.js +++ b/test/lint.js @@ -6,7 +6,8 @@ const yargs = require('yargs'); const {testStyle} = require('./test-style'); const {testSchema} = require('./test-schema'); const {testVersions} = require('./test-versions'); -/** @type {Map} */ +const testBrowsers = require('./test-browsers'); +/** @type {Map} */ const filesWithErrors = new Map(); const argv = yargs.alias('version','v') @@ -42,6 +43,7 @@ function load(...files) { let hasSyntaxErrors = false, hasSchemaErrors = false, hasStyleErrors = false, + hasBrowserErrors = false, hasVersionErrors = false; const relativeFilePath = path.relative(process.cwd(), file); @@ -64,13 +66,14 @@ function load(...files) { } else { hasSchemaErrors = testSchema(file); hasStyleErrors = testStyle(file); + hasBrowserErrors = testBrowsers(file); hasVersionErrors = testVersions(file); } } catch (e) { hasSyntaxErrors = true; console.error(e); } - if (hasSyntaxErrors || hasSchemaErrors || hasStyleErrors || hasVersionErrors) { + if (hasSyntaxErrors || hasSchemaErrors || hasStyleErrors || hasBrowserErrors || hasVersionErrors) { hasErrors = true; filesWithErrors.set(relativeFilePath, file); } else { @@ -122,6 +125,7 @@ if (hasErrors) { testSchema(file); testStyle(file); testVersions(file); + testBrowsers(file); } } catch (e) { console.error(e); diff --git a/test/test-browsers.js b/test/test-browsers.js new file mode 100644 index 00000000000000..4da53be42e5d67 --- /dev/null +++ b/test/test-browsers.js @@ -0,0 +1,106 @@ +'use strict'; +const path = require('path'); + +/** @type {Record} */ +const browsers = { + desktop: [ + 'chrome', + 'edge', + 'firefox', + 'ie', + 'opera', + 'safari', + ], + mobile: [ + 'chrome_android', + 'edge_mobile', + 'firefox_android', + 'opera_android', + 'qq_android', + 'safari_ios', + 'samsunginternet_android', + 'uc_android', + 'uc_chinese_android', + 'webview_android', + ], + server: [ + 'nodejs', + ], + 'webextensions-desktop': [ + 'chrome', + 'edge', + 'firefox', + 'opera', + ], + 'webextensions-mobile': [ + 'firefox_android', + ], +}; + +/** + * @param {*} data + * @param {string[]} browsers + * @param {string} category + * @param {{error:function(string):void}} logger + * @param {string} [path] + * @returns {boolean} + */ +function processData(data, browsers, category, logger, path = '') { + let hasErrors = false; + if (data.__compat && data.__compat.support) { + const invalidEntries = Object.keys(data.__compat.support).filter(value => !browsers.includes(value)); + if (invalidEntries.length > 0) { + logger.error(`'${path}' has the following browsers, which are invalid for ${category} compat data: ${invalidEntries.join(', ')}`); + hasErrors = true; + } + } + for (const key in data) { + if (key === "__compat") continue; + hasErrors |= processData(data[key], browsers, category, logger, (path && path.length > 0) ? `${path}.${key}` : key); + } + return hasErrors; +} + +/** + * @param {string} filename + * @returns {boolean} If the file contains errors + */ +function testBrowsers(filename) { + const relativePath = path.relative(path.resolve(__dirname, '..'), filename); + const category = relativePath.includes(path.sep) && relativePath.split(path.sep)[0]; + const data = require(filename); + + if (!category || category === "test") { + console.warn('\x1b[1;30m Browsers – Unknown category \x1b[0m'); + return false; + } + + let displayBrowsers = [...browsers['desktop'], ...browsers['mobile']]; + if (category === 'api') { + displayBrowsers.push('nodejs'); + } + if (category === 'javascript') { + displayBrowsers.push(...browsers['server']); + } + if (category === 'webextensions') { + displayBrowsers = [...browsers['webextensions-desktop'], ...browsers['webextensions-mobile']]; + } + displayBrowsers.sort(); + + /** @type {string[]} */ + const errors = []; + const logger = { + error: (message) => {errors.push(message);} + } + + if (!processData(data, displayBrowsers, category, logger)) { + return false; + } else { + console.error('\x1b[31m Browsers –', errors.length, 'error(s):\x1b[0m'); + for (let error of errors) + console.error(` ${error}`); + return true; + } +} + +module.exports = testBrowsers;